一位同事最近向我描述了重新构建数据库的计划。新数据库将符合简单的星型模式:父表将包含一个键和一些上下文信息,该键将用作其他表中的外键字段。外键字段可能多次出现在同一个子表中。
伪代码:
TABLE Parent
INT key PRIMARY_KEY
INT foo
...
TABLE Child1
INT key FOREIGN_KEY REFERENCES Parent.key
BLOB bar
...
TABLE Child2
INT key FOREIGN_KEY REFERENCES Parent.key
VARCHAR tar
...
设计背后的动机是简化 和 之间的 JOIN Parent
,Child<n>
这在以前的模式中很复杂。
为了进一步加快 JOIN,我的同事希望尽量减少 OUTER JOIN 的使用。具体来说,她想通过使用 JOINS 并通过以特定方式维护子表中的数据来模拟 OUTER JOIN:填充所有子表,以便对于每个key
in Parent
,至少有一行 inChild<n>
具有该key
值,即使该行否则充满null
s。这样,在Parent
和Child<n>
on之间执行的任何 JOIN 都会为每个inkey
返回至少一个结果,更像是 OUTER JOIN。key
Parent
撇开以这种方式维护数据是否值得付出努力的问题不谈,假设所有key
字段都已正确索引并且大约一半的子行被null
淘汰,这种方法是否比执行 OUTER JOINS 更高效?
这个问题似乎可以归结为“对索引中存在的值而不是不存在的值进行索引查找更快?” 假设索引像 B 树或散列一样运行,我的答案是“否”,但我知道的不够多,无法确定。