我有三个包含公共字段的表格 - users
,guests
和admins
。
最后两个表包含一些users
字段。
这是一个例子:
用户
id|username|password|email|city|country|phone|birthday|status
宾客
id|city|country|phone|birthday
管理员
id|username|password|status
我想知道它是否更好:
a)使用一个包含许多NULL值的表
b)使用三个表
答案 0 :(得分:5)
为什么没有一个包含三个外键控详细信息表的父用户表。允许可以转换的唯一用户ID。
答案 1 :(得分:5)
问题不在于关于数据结构的“一个表有多个NULL而不是三个表”。真正的问题是数据结构中的其他表将如何引用这些实体。
这是一种典型的情况,你有“一个”关系,需要在SQL中表示它们。有一种“正确”的方式,即拥有四个表:
这允许其他表引用三种类型的用户中的任何一种,或一般用户。这对于维持正确的关系很重要。
您建议了两个快捷方式。一个是没有关于“普通”用户的信息,所以你省去了那个表。但是,这意味着您无法在另一个表中引用“普通”用户。
通常,当数据结构相似时,数据会简单地归一化为单行(如解决方案中的那样)。
在具有特定需求的应用程序中,所有这三种方法都是合理的。至于性能,当数据类型是可变长度时,具有附加NULLABLE
列的差异通常是最小的。如果很多其他列都是数字的,那么即使NULL
也会占用实际空间,这可能是设计最佳解决方案的一个因素。
简而言之,我不会在基于过早优化的不同选项之间进行选择。我会根据数据库所需的整体数据结构在它们之间进行选择,特别是这些实体与其他实体的关系。
编辑:
然后存在用于专用表的id
的问题。有两种方法可以做到这一点。一种是为每个表都有一个单独的ID,例如AdminId
和GuestId
。每个表中的另一列是UserId
。
当其他实体与这些特定实体有关系时,这是有意义的。例如,“admins”可能有一个子系统,用于描述他们拥有的权限,角色和权限,可能还有变更历史记录。这些表(ahem,实体)想要引用AdminId
。并且,你可能应该让他们离开。
如果您没有这样的表,那么您可能仍然会拆分管理员,因为他们需要的100个整数列对于其他众多用户来说是浪费空间。在这种情况下,您可以在没有单独身份证的情况下前往。
我想强调的是,您提出的问题一般没有“最佳”答案。它通过规范化规则(具有4个单独的id的4个表)确实具有“正确”的答案。但在给定情况下,最佳答案取决于整体数据模型。
答案 2 :(得分:1)
我普遍同意Chriseyre2000,但在您的具体示例中,我认为不需要其他2个表。一切都包含在用户中,那么为什么不添加访客和管理位字段?甚至是一个 UserType 字段。
虽然Chriseyre2000的解决方案会为您提供更好的可扩展性,但您以后想要添加特定于访客和管理员的字段。