2009-08-05 26 views
1

在一般的一對多(父母與子女)關係中,(a)將parent_id放入子表中和(b)使用只有parent_id的透視表,child_id?Pivot Table vs Parent_ID for 1-Many Relation

注意:如果需要,假設Oracle,否則使用常規RDBMS進行回答。

回答

2

如果按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)中,該索引可能不如專用表的效率更高,特別是如果您有大量父母。