Database design 表不能连接两个表中的任何一个

Database design 表不能连接两个表中的任何一个,database-design,Database Design,(我认识到这可能是重复的,但我无法在搜索的基础上找到任何答案) 我有一个表,其中包含一些信息,这些信息既可以加入用户,也可以加入公司。我认为有三种方法可以解决这个问题: 为表指定一个join\u user\u id列和一个join\u company\u id列,并仅填写其中一个 创建一个join\u id列,以及一个join\u with\u table列 复制主表,以便有两个版本,一个只有join_user_id,另一个只有join_company_id 我马上排除3号,因为它不干。我的问题

(我认识到这可能是重复的,但我无法在搜索的基础上找到任何答案)

我有一个表,其中包含一些信息,这些信息既可以加入用户,也可以加入公司。我认为有三种方法可以解决这个问题:

  • 为表指定一个join\u user\u id列和一个join\u company\u id列,并仅填写其中一个
  • 创建一个join\u id列,以及一个join\u with\u table列
  • 复制主表,以便有两个版本,一个只有join_user_id,另一个只有join_company_id
  • 我马上排除3号,因为它不干。我的问题是,哪一个是真正的规范化设计(或者没有)

    我如何处理以下缺点: 1.如果第三张桌子来了,留下一堆空的东西不会优雅地增长,我如何简洁地加入?
    2.如何强制外键约束?如何简洁地加入?

    不声称这是最佳实践,或者即使它在您的情况下有效,但第四种选择可能是将
    用户
    公司
    表的公共列保留在单独的表中(可能是
    用户
    )。然后,用户和公司详细信息可以进入一个单独的
    user\u details
    company\u details
    表,该表的键与
    user\u company\u base
    表中的键相同(该表还可以选择包含一列,告诉哪些表包含此行的详细信息)

    然后,您只需要在表中添加一个
    join\u id\u user\u comp\u base
    ,以解决外键约束和简洁联接的问题。当然,如果需要其他表(
    user\u details
    comp\u details
    )的详细信息,那么这样做的代价是加入其他表


    Edit:我认为这个概念被称为表继承。

    1或2都不是第三种标准形式,因为在一列中设置一个值可以告诉您关于另一列中的值(不是主键)的信息。这打破了完全依赖于3NF所需主键的特性

    我肯定会排除选项2,因为创建外键会很棘手/不可能,并且可能会导致混淆列中值的含义。如果有人更改了
    join\u with\u table
    列而没有更改
    join\u id
    列,您可能不知道

    要在3NF中对此进行建模,您需要创建两个新表,一个用于用户,另一个用于公司。它们将具有
    original\u table\u id、user\u id
    (或company),以
    original\u table\u id
    作为主键。然后,您需要验证一个表或另一个表中是否只有一个条目

    个人而言,我仍然会考虑在你的原始表中把这些列作为额外的列,但是除非你认为你可能会增加更多的表,否则你需要有条件地引用。您不应该设计为避免空值,这样我就不会担心这个问题。如果需要返回此表中公司和用户的信息,此解决方案和额外表方法都需要对
    user
    company
    表进行外部联接,因此在查询复杂度方面没有实际差异

    以下哪一项是真正的标准化设计(或没有)

    它们都是“标准化的”,但并非所有的都同样有用

    1) 留下一堆空的,不会优雅地成长

    大多数DBMS都相当高效地存储空值。在理想情况下,在某些DBMS上通常只有一个字节,甚至只有一位

    您可以使用检查来确保其中只有一个非空

    2) 如何强制外键约束

    从理论上讲,您可以将
    将_与_table
    向下迁移到FKs,然后检查引用表以确保类型正确。显然,这很尴尬,而且浪费空间(除非DBMS支持计算/虚拟列)

    您可以依赖于触发器或(上帝禁止)应用程序逻辑,但声明性约束应该尽可能地首选,因为它们简单、健壮和快速

    我马上排除3号,因为它不干

    不幸的是,关系数据库通常不支持我们都熟悉的OO编程概念,因此可能会遭受一些不必要的重复。例如,在这种情况下,表继承(其中基表定义“结构”,子表定义特定的FK)是减少重复的理想选择

    事实上,一些重复并不是世界上最糟糕的事情,只要你不让事情变得不成比例

    如何简洁地加入

    我不确定我是否理解你的问题-请澄清。根据您的需要,联接不仅会受到表设计的影响,还会受到表设计的影响


    总而言之,我可能只会选择第(1)项,除非您预期其他差异可能会导致第(3)项。

    另请参见