建模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
// ...
}