2

我想在我的數據模型中創建適當的父/子關係。我父母和孩子之間有一個典型的一對多關係。數據建模:父母和孩子的「雙重」關係

我想知道如果我父母知道自己的孩子,是

  1. 曾經接受的,
  2. 一個好主意

爲每個孩子具體瞭解它的父?。 (孩子只能在我的情況下,一個母公司)

parent  
------------- 
PARENT_ID 
OTHER_COL 
... 

child 
------------- 
CHILD_ID 
PARENT_ID // <-- Should this column be here? 
OTHER_COL 
... 

parent_has_children 
-------------------- 
PARENT_ID 
CHILD_ID 

的優點我看到有在孩子的父列,是很容易從孩子檢索父。但是,這只是懶惰的設計?

在此先感謝。

回答

3

建模1一對多關係

如果關係是1個父許多孩子(即相同的孩子只能屬於一個父),那麼標準的建模方法是引用通過Parent的關鍵列(通常是父母的主關鍵字(PK))的Child表中的父表。同時,它也是一個好主意,外鍵(FK)的參考柱(child.PARENT_ID)的約束,鼓勵RDMBS橫跨關係執行referential integrity

parent  
------------- 
PARENT_ID PRIMARY KEY, // PK for the parent table 
OTHER_COL 
... 

child 
------------- 
CHILD_ID PRIMARY KEY, // PK for the Child Table 
PARENT_ID    // <-- Should this column be here? = Yes 
CONSTRAINT FK_ChildParent FOREIGN KEY(PARENT_ID) REFERENCES parent(PARENT_ID) 

附加很多:很多表parent_has_children是冗餘的,因爲它每個child只有一行,並且它將很快成爲一個負擔,使該表與其他表中添加/刪除的行保持同步(因爲未能保持這種同步將導致混淆/矛盾關係的完整性)。

Re:父母怎麼知道他們的孩子?

對於一個給定的父子記錄可以使用在過濾父外鍵列的子表的簡單查詢發現:

SELECT ... 
FROM child 
WHERE PARENT_ID = myParentId; 

,因爲這通常是一種常見的查詢時,它始終是一個好想法確保索引外鍵child.PARENT_ID - 一些RDBMS版本默認爲所有外鍵執行此操作。

CREATE INDEX IXFoo on child(PARENT_ID); 

如果您有一個實體模型(例如,對於代表這些表的應用程序中的ORM),父實體通常會包含一個包含其實例的集合,並且在子實體上,標量外鍵child.PARENT_ID'列'將完全丟棄,或者替換爲對父實例:

class Parent 
{ 
    ParentId, 
    Child[] Children, 
    // ... 
} 

class Child 
{ 
    ChildId, 
    Parent Parent, // Optional, allows bidirectional navigation 
    // ... 
} 
1

如果這種關係確實是一對多而不是多對多的,那麼您會將PARENT_ID作爲外鍵保留在CHILD表中,並將PARENT_HAS_CHILDREN表全部刪除。

0

我會傾向報廢parent_has_children表,而不是隻對一個孩子PARENT_ID - 這是代表​​這個數據的更傳統的方式。