mysql - 一张表与三张表中的许多空值

标签 mysql sql database database-design null

我有三个具有公共(public)字段的表 - usersguestsadmins

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

用户

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

guest

id|city|country|phone|birthday

管理员

id|username|password|status

我想知道是否更好:

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

b)使用三个表

最佳答案

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

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

  • “用户”(我想不出一个好名字)将包括每个人并有一个可以被其他表引用的唯一 ID
  • “普通”、“管理员”、“访客”,其中每一个都与“用户”具有 1-0/1 的关系

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

您建议了两条捷径。一个是没有关于“普通”用户的信息,因此您无需使用该表。但是,这意味着您不能在另一个表中引用“普通”用户。

通常,当数据结构相似时,数据会被简单地反规范化为一行(如您的解决方案 a)。

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

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

编辑:

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

当其他实体与这些特定实体有关系时,这是有意义的。例如,“管理员”可能有一个子系统来描述他们拥有的权利、角色和特权,也许还有更改历史记录。这些表(咳咳,实体)可能需要引用 AdminId。而且,您可能应该让他们帮忙。

如果您没有这样的表,那么您可能仍会拆分管理员,因为他们需要的 100 个整数列对于无数其他用户来说是一种空间浪费。在这种情况下,您无需单独的 ID 也能顺利通过。

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

关于mysql - 一张表与三张表中的许多空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21489487/

相关文章:

java - com.mysql.jdbc.MysqlDataTruncation : Data truncation: Data too long for column 'name' at row 1

sql - 如何将数据库部署到 windows azure sql 数据库?

需要 SQL 查询从两个单独的表中获取信息

mysql - 使用外键关系的 SQL 查询

php - 如何使用 mysql 语法(如 if 条件)使用 codeigniter 表更新?

mysql - 防止 MySQL 重复插入时自动递增

php - 使用闭包表模型的 Doctrine2 分层数据

sql - 分组依据不显示所有行

python - sqlite数据库未连接

mysql - 使用 PouchDB-CouchDB 和 MySQL 的移动应用程序