我在之前开发的应用程序中构建了一些新表,我遇到了数据库的问题。具体来说,我的数据看起来像这样(第一列是父代码,其余的是子代,如果有意义的话):
abc-1 ab NULL NULL
abc-4 ab(1) ab(3) NULL
abe-2 ac(2) ac(1) ac **NOT NORMALIZED**
abe-3 ad(7) NULL NULL
(and so on...)
我可以这样构建它:
abc-1 ab
abc-4 ab(1)
abc-4 ab(3)
abe-2 ac(2) **NORMALIZED**
abe-2 ac(1)
abe-3 ad(7)
(and so on...effectively disallowing all NULL values)
然而,我在概念上磕磕绊绊的是哪一个更有效。我正在使用SQL服务器(Microsoft)和Java的Hibernate和JPA框架。最初我以为我会使用前一个选项并在后面的代码中“过滤掉”NULL值。一位同事建议我做后者并创建映射到唯一键的多个表。我理解这是从数据库角度来看的理想方式,但我想我会问社区是否有任何效率原因我应该避免前者支持后者。
附加信息: 我的表有多对多的关系,所以我认为这比我可能意识到的更复杂。作为一个更明确的例子,关系表看起来像这样:
abc-1 ab
abc-4 ab(1)
abc-4 ab(3)
abc-1 ab(1)
...etc...
因此,您可以看到“父级”列中abc-1
可能会映射到两个不同的子级,一个子级(例如ab(1)
)可能会映射回两个不同的父级({{1}和abc-4
)。除非我完全弄错了,否则这是多对多的关系。