在一般的一對多(父母與子女)關係中,(a)將parent_id放入子表中和(b)使用只有parent_id的透視表,child_id?Pivot Table vs Parent_ID for 1-Many Relation
注意:如果需要,假設Oracle,否則使用常規RDBMS進行回答。
在一般的一對多(父母與子女)關係中,(a)將parent_id放入子表中和(b)使用只有parent_id的透視表,child_id?Pivot Table vs Parent_ID for 1-Many Relation
注意:如果需要,假設Oracle,否則使用常規RDBMS進行回答。
如果按PIVOT
表您的意思是一個many-to-many
鏈接表,那麼不,它只會影響性能。
您應該在子表中保留parent_id
。
的many-to-many
鏈路表需要額外JOIN
,因此是效率較低。
比較以下查詢:
SELECT *
FROM child_table c
JOIN child_to_parent cp
ON cp.child = c.id
JOIN parent p
ON p.id = cp.parent
WHERE c.property = 'some_property'
和這一個:
SELECT *
FROM child_table c
JOIN parent p
ON p.id = c.parent
WHERE c.property = 'some_property'
後者一個是一個JOIN
更短,更有效的。
唯一可能的例外到規則是,你經常運行這些查詢:
SELECT *
FROM child_table c
JOIN parent_table p
ON p.id = c.parent
WHERE c.id IN (id1, id2, ...)
,我。即你事先知道子行的id
。
如果您爲child_table
使用自然鍵,這可能會很有用。
在這種情況下肯定的,child_to_parent
鏈接表會更有效率,因爲你可以用下面的查詢替換它:
SELECT *
FROM child_to_parent cp
JOIN parent_table p
ON p.id = cp.parent
WHERE cp.child IN (id1, id2, ...)
和child_to_parent
將始終小於或等於在尺寸上child_table
和因此更有效率。
但是,在Oracle
中,您可以在child_table (id, parent_id)
上獲得與創建複合索引相同的結果。
由於Oracle
未索引NULL
's,因此該索引將與您的child_to_parent
表一樣,但沒有表本身和隱含的維護開銷。
在其他系統(索引NULL
's)中,該索引可能不如專用表的效率更高,特別是如果您有大量父母。