2009-08-05 28 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)中,该索引可能不如专用表的效率更高,特别是如果您有大量父母。