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关系
可为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?@lam3r4370users
表将具有您在问题中提到的所有字段,而guests
和admins
中的id
字段也将是引用users.id
的外键。然后guests
和admins
将包含特定于这些类型用户的任何字段。