一个表中的许多空值与三个表中的空值

时间:2014-01-31 20:29:57

标签: mysql sql database database-design null

我有三个包含公共字段的表格 - usersguestsadmins

最后两个表包含一些users字段。 这是一个例子:

用户

id|username|password|email|city|country|phone|birthday|status

宾客

id|city|country|phone|birthday

管理员

id|username|password|status

我想知道它是否更好:

a)使用一个包含许多NULL值的表

b)使用三个表

3 个答案:

答案 0 :(得分:5)

为什么没有一个包含三个外键控详细信息表的父用户表。允许可以转换的唯一用户ID。

答案 1 :(得分:5)

问题不在于关于数据结构的“一个表有多个NULL而不是三个表”。真正的问题是数据结构中的其他表将如何引用这些实体。

这是一种典型的情况,你有“一个”关系,需要在SQL中表示它们。有一种“正确”的方式,即拥有四个表:

  • “用户”(我想不出一个好名字)会包含每个人,并且拥有一个可以被其他表引用的唯一ID
  • “普通”,“管理员”,“来宾”,每个人与“用户”有1-0 / 1的关系

这允许其他表引用三种类型的用户中的任何一种,或一般用户。这对于维持正确的关系很重要。

您建议了两个快捷方式。一个是没有关于“普通”用户的信息,所以你省去了那个表。但是,这意味着您无法在另一个表中引用“普通”用户。

通常,当数据结构相似时,数据会简单地归一化为单行(如解决方案中的那样)。

在具有特定需求的应用程序中,所有这三种方法都是合理的。至于性能,当数据类型是可变长度时,具有附加NULLABLE列的差异通常是最小的。如果很多其他列都是数字的,那么即使NULL也会占用实际空间,这可能是设计最佳解决方案的一个因素。

简而言之,我不会在基于过早优化的不同选项之间进行选择。我会根据数据库所需的整体数据结构在它们之间进行选择,特别是这些实体与其他实体的关系。

编辑:

然后存在用于专用表的id的问题。有两种方法可以做到这一点。一种是为每个表都有一个单独的ID,例如AdminIdGuestId。每个表中的另一列是UserId

当其他实体与这些特定实体有关系时,这是有意义的。例如,“admins”可能有一个子系统,用于描述他们拥有的权限,角色和权限,可能还有变更历史记录。这些表(ahem,实体)想要引用AdminId。并且,你可能应该让他们离开。

如果您没有这样的表,那么您可能仍然会拆分管理员,因为他们需要的100个整数列对于其他众多用户来说是浪费空间。在这种情况下,您可以在没有单独身份证的情况下前往。

我想强调的是,您提出的问题一般没有“最佳”答案。它通过规范化规则(具有4个单独的id的4个表)确实具有“正确”的答案。但在给定情况下,最佳答案取决于整体数据模型。

答案 2 :(得分:1)

我普遍同意Chriseyre2000,但在您的具体示例中,我认为不需要其他2个表。一切都包含在用户中,那么为什么不添加访客管理位字段?甚至是一个 UserType 字段。

虽然Chriseyre2000的解决方案会为您提供更好的可扩展性,但您以后想要添加特定于访客和管理员的字段。