如果数据库的表包含相同的FK,它们是否应该规范化?
这些是有问题的数据库表:
user (
user_id int PK,
...
...
)
user_cat (
user_cat_id int PK,
user_id int FK,
effective_date date,
location_id FK, <-- dup
qualification_id FK, <-- dup
business_id FK <-- dup
)
user_admin_cat (
admin_cat_id int PK,
user_id int FK,
effective_date date,
company_id FK,
location_id FK, <-- dup
qualification_id FK, <-- dup
business_id FK <-- dup
)
以下是我考虑过的最小化重复的内容:
user (
user_id int PK,
...
...
)
user_cat (
user_cat_id int PK,
user_id int FK,
effective_date date,
shared_id, FK <-- dup
)
user_admin_cat (
admin_cat_id int PK,
user_id int FK,
effective_date date,
company_id FK,
shared_id, FK <-- dup
)
shared_user_cat_fks (
shared_id int PK,
location_id FK,
qualification_id FK,
business_id FK
)
我想学习的是以下一个或多个问题的答案:
(1)如果您使用标准化解决方案,为什么会更好?
(2)如果您不使用规范化解决方案,您会做什么?为什么这个解决方案更好?
(3)如果您不使用规范化解决方案,因为只有两个表中有重复项,那么在您执行某些操作之前应该有多少个重复表?你会实施什么解决方案?为什么这是一个很好的解决方案?
答案 0 :(得分:3)
根据您描述的内容,我没有看到正常化的理由&#39;它。我甚至说这与标准化无关。
我的规范化的简单规则是:在更改单个事实时,我是否必须执行多次插入/更新/删除操作。
或者是否有我无法表达的事实的组合。
或者我能以两种不同的方式表达事实吗?
我在这里看不到。
所以我对2的回答是:没什么,因为没有问题。
虽然可能存在一些隐藏的非规范化。但它不是你所描述的。
答案 1 :(得分:0)
1)规范化方案设计更清晰,更易于维护。
2)有时,非标准化布局在效果方面更好。比方说,如果对小表user_cat
有很多查询,并且对巨大的user_admin_cat
几乎没有查询而且没有人需要UNION - 它可能是有效的。