2010-03-27 90 views
3

我該如何建模數據庫中的零關係或多關係?例如,用戶記錄可能有也可能沒有父母。那麼我的用戶表應該有t_user.parent_id還是應該有一個名爲t_user_hierarchy的關聯表,其中包含t_user_hierarchy.parent_id和t_user_hierarchy.user_id列?建模零或一對多關係

回答

0

只是要在子表的外鍵(用戶表?)可空

0

我會去與一個可空父ID。然後,您可以使用自聯接來獲取任何特定記錄的父項或子項。

0

數據庫中的零或一對多關係通常表示爲聲明該字段,在您的實例中爲Parent_ID,然後保留一個值以表示它指向無。

由於關係數據庫(RDBMS)通常允許您有NULL值,因此可以使用NULL值標記沒有父項的特定記錄。

Create Table T_USER (
    User_ID  Number(9) NOT NULL , 
    Parent_ID Number(9) 
)

上面的例子適用於Oracle RDBMS,但這個想法在其他數據庫中也是類似的。或者,您可以專門用一個字段來標記數據庫,但通常這是一個重載,因爲大多數數據庫系統可以處理NULL的特殊情況,而無需添加額外的字段。

2

1NF規定不能爲空列。因此,爲了實現一個零對一的關係,將一個外鍵放置在指向父對象的子對象中(假設這是一個可能有可能沒有與父對象相關的條目的表)。然後使用從父項到子項的外部聯接查詢來檢索有子項和沒有子項的父項的實例。

例子:

Customer Table (i.e., parent) 
    CID (Primary Key) 
    Customer_Name 
    Customer_Address 
    ... 

Order Table (i.e., child) 
    OID (Primary Key) 
    Ordered_Date 
    Order_Quantity 
    ... (product ordered would be a foreign key to the Products table; not relevant to discussion) 
    CID (Foreign Key to Customer table) 

SQL: 
    SELECT Customer.Customer_Name, Order.Ordered_Date, Order.Order_Quantity 
    FROM Customer 
    LEFT OUTER JOIN Order 
    ON Customer.CID = Order.CID (syntax generic) 

這將返回所有客戶記錄和作出的任何命令關聯。它也會返回沒有訂單的客戶。