ran*_*dev 5 mysql sql database null database-design
我有三个表与普通场- 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)使用三个表
问题不在于关于数据结构的"一个表有多个NULL而不是三个表".真正的问题是数据结构中的其他表将如何引用这些实体.
这是一种经典情况,您有"一个"关系,需要在SQL中表示它们.有一种"正确"的方式,那就是有四个表:
这允许其他表引用三种类型的用户中的任何一种,或者一般地引用给用户.这对于维持正确的关系非常重要.
您已经建议了两个快捷方式.一个是没有关于"普通"用户的信息,所以你省去了那个表.但是,这意味着您无法在另一个表中引用"普通"用户.
通常,当数据结构相似时,数据被简单地非规范化为单行(如在您的解决方案中).
在具有特定需求的应用程序的上下文中,所有这三种方法都是合理的.至于性能,NULLABLE当数据类型是可变长度时,具有附加列的差异通常是最小的.如果许多附加列是数字的,那么即使这些列占用了真实空间NULL,这可能是设计最佳解决方案的一个因素.
简而言之,我不会在基于过早优化的不同选项之间进行选择.我会根据数据库所需的整体数据结构在它们之间进行选择,特别是这些实体与其他实体的关系.
编辑:
然后是id您用于专用表的问题.有两种方法可以做到这一点.一种是具有单独的id,例如AdminId和GuestId每个表.每个表中的另一列将是UserId.
当其他实体与这些特定实体有关系时,这是有意义的.例如,"管理员"可能有一个子系统,用于描述他们拥有的权利,角色和权限,可能还有变更历史记录.这些表(ahem,实体)想要引用一个AdminId.并且,你应该让他们放弃.
如果您没有这样的表,那么您可能仍然会拆分管理员,因为他们需要的100个整数列会浪费太多其他用户的空间.在这种情况下,您可以在没有单独ID的情况下使用.
我想强调的是,你提出了一个一般没有"最佳"答案的问题.它通过规范化规则(具有4个单独的id的4个表)确实具有"正确"的答案.但在给定情况下,最佳答案取决于整体数据模型.
| 归档时间: | 
 | 
| 查看次数: | 1215 次 | 
| 最近记录: |