在一般的一对多(父母与子女)关系中,(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)中,该索引可能不如专用表的效率更高,特别是如果您有大量父母。