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

标签 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的回答是:没什么,因为没有问题。

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

关于mysql - 我是否应该进一步规范化多个表中使用的外键集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10286584/

相关文章:

带有所需子查询的 MySQL UPDATE

c++ - MariaDB,在c++程序中执行存储过程时出现语法错误

SQL:如何在单独的表中更新重复项?

sql - 从匿名 block 中的变量创建带密码的用户

用于从 WordPress 数据库中删除所有废弃标签的 SQL 查询

php - Doctrine 和 DateTime 显示出错误的差异

sql - 选择相邻表中具有多个其他行的行

MySQL - 几个月内的每月排名

SQL ERD-主键出现两次

postgresql - AWS 安全组错误