gpt4 book ai didi

database - 一对多关系的数据透视表与 Parent_ID

转载 作者:搜寻专家 更新时间:2023-10-30 20:22:18 25 4
gpt4 key购买 nike

在一般的一对多(父对子)关系中,(a) 将 parent_id 放入子表与 (b) 使用仅包含 parent_id、child_id 的数据透视表之间是否存在显着的效率差异?

注意:如有必要,假设使用 Oracle,否则使用通用 RDBMS 回答。

最佳答案

如果通过 PIVOT table 你的意思是 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更短、更高效。

该规则唯一可能的异常(exception)是您经常运行这些查询:

SELECT  *
FROM child_table c
JOIN parent_table p
ON p.id = c.parent
WHERE c.id IN (id1, id2, ...)

,我。 e.你知道 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 , 因此效率更高。

然而,在Oraclechild_table (id, parent_id) 上创建复合索引可以获得相同的结果.

Oracle不索引 NULL的,这个索引就像你的 child_to_parent表,但没有表本身并隐含维护开销。

在其他系统中(索引 NULL 的),索引可能不如专用表有效,尤其是当您有很多 NULL 时。 parent 。

关于database - 一对多关系的数据透视表与 Parent_ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1234807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com