我是否应该进一步规范化多个表中使用的外键集?

时间:2012-04-23 19:00:55

标签: mysql sql postgresql

如果数据库的表包含相同的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)如果您不使用规范化解决方案,因为只有两个表中有重复项,那么在您执行某些操作之前应该有多少个重复表?你会实施什么解决方案?为什么这是一个很好的解决方案?

2 个答案:

答案 0 :(得分:3)

根据您描述的内容,我没有看到正常化的理由&#39;它。我甚至说这与标准化无关。

我的规范化的简单规则是:在更改单个事实时,我是否必须执行多次插入/更新/删除操作。

或者是否有我无法表达的事实的组合。

或者我能以两种不同的方式表达事实吗?

我在这里看不到。

所以我对2的回答是:没什么,因为没有问题。

虽然可能存在一些隐藏的非规范化。但它不是你所描述的。

答案 1 :(得分:0)

1)规范化方案设计更清晰,更易于维护。

2)有时,非标准化布局在效果方面更好。比方说,如果对小表user_cat有很多查询,并且对巨大的user_admin_cat几乎没有查询而且没有人需要UNION - 它可能是有效的。