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号,因为它不干。我的问题
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)项。另请参见