Mysql 一个表与三个表中存在多个空值

Mysql 一个表与三个表中存在多个空值,mysql,sql,database,database-design,null,Mysql,Sql,Database,Database Design,Null,我有三个带有公共字段的表-用户、来宾和管理员 最后两个表有一些用户字段。 下面是一个例子: 用户 id|username|password|email|city|country|phone|birthday|status id|city|country|phone|birthday id|username|password|status 客人 id|username|password|email|city|country|phone|birthday|status id|city|cou

我有三个带有公共字段的表-
用户
来宾
管理员

最后两个表有一些
用户
字段。 下面是一个例子:

用户

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

id|username|password|email|city|country|phone|birthday|status
id|city|country|phone|birthday
id|username|password|status
管理员

id|username|password|email|city|country|phone|birthday|status
id|city|country|phone|birthday
id|username|password|status
我想知道是否最好:

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


b) 使用三个表

为什么不让一个父用户表和三个外键详细信息表呢。允许可以转换的唯一用户id

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

这是一种典型的情况,在这种情况下,您有“其中之一”关系,需要用SQL表示它们。有一个“正确”的方法,那就是有四个表:

  • “用户”(我想不出一个好名字)将包含所有人,并且具有唯一的id,可以被其他表引用
  • “普通”、“管理员”、“来宾”都与“用户”有1-0/1关系
这允许其他表引用这三种类型的用户中的任何一种,或者引用一般用户。这对于维持适当的关系很重要

你建议了两条捷径。一个是没有关于“普通”用户的信息,所以你不用那个表。但是,这意味着您不能在另一个表中引用“普通”用户

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

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

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

编辑:

还有一个问题是专门表使用的
id
。有两种方法可以做到这一点。一种是为这些表中的每一个都有一个单独的id,例如
AdminId
GuestId
。每个表中的另一列是
UserId

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

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


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

我大体上同意Chriseyre2000,但在您的具体示例中,我认为不需要其他两个表。所有内容都包含在用户中,那么为什么不只添加来宾和管理员位字段呢?甚至一个用户类型字段


尽管Chriseyre2000的解决方案将为您提供更好的可扩展性,如果您以后想添加特定于来宾和管理员的字段。

谢谢,如果我理解正确的话,
users
表将具有
id|user_type|user_type_id
其中
user_type_id
是其他三个表中记录的id?@lam3r4370
users
表将具有您在问题中提到的所有字段,而
guests
admins
中的
id
字段也将是引用
users.id
的外键。然后
guests
admins
将包含特定于这些类型用户的任何字段。