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

ran*_*dev 5 mysql sql database null database-design

我有三个表与普通场- users,guestsadmins.

最后两个表有一些users字段.这是一个例子:

用户

id|username|password|email|city|country|phone|birthday|status
Run Code Online (Sandbox Code Playgroud)

宾客

id|city|country|phone|birthday
Run Code Online (Sandbox Code Playgroud)

管理员

id|username|password|status
Run Code Online (Sandbox Code Playgroud)

我想知道它是否更好:

a)使用一个具有许多NULL值的表

b)使用三个表

Chr*_*000 5

为什么不让一个父用户表具有三个外键控详细信息表.允许可以转换的唯一用户ID.


Gor*_*off 5

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

这是一种经典情况,您有"一个"关系,需要在SQL中表示它们.有一种"正确"的方式,那就是有四个表:

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

这允许其他表引用三种类型的用户中的任何一种,或者一般地引用给用户.这对于维持正确的关系非常重要.

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

通常,当数据结构相似时,数据被简单地非规范化为单行(如在您的解决方案中).

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

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

编辑:

然后是id您用于专用表的问题.有两种方法可以做到这一点.一种是具有单独的id,例如AdminIdGuestId每个表.每个表中的另一列将是UserId.

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

如果您没有这样的表,那么您可能仍然会拆分管理员,因为他们需要的100个整数列会浪费太多其他用户的空间.在这种情况下,您可以在没有单独ID的情况下使用.

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