我正在创建一个包含各种表的数据库。我们以用户表为例。它具有婚姻状况和系统角色等领域。每个字段都有预定义的选项。为每个字段创建两个新表是否有意义,因此当用户添加到系统时,可以选择选项,例如,单身,已婚,离婚?对于一个额外的查询而言,这似乎有点过分。这是最好的方法,还是我有其他选择?
答案 0 :(得分:2)
我肯定会创建单独的表来存储这些不同列的可用选项。就标准化而言,这是一件好事,并且当您需要添加,删除,禁用或更改任何选项时,还可以节省您的麻烦。此外,如果不创建单独的表并直接在用户表中填充值,您可能最终必须执行select distinct RelationshipStatus from User
之类的操作以获取可用选项,这不仅仅是选择10或但是来自单独表格的许多价值。
正如有人评论的那样,过度规范化有时可能是一种痛苦,但我发现,没有规范化某些东西作为一种快速解决方法几乎总是会让你感到困扰。
User
----
ID
RelationshipStatusId
...other columns
RelationshipStatus
------------------
ID
Value
Description
答案 1 :(得分:1)
您可以在MySQL中使用ENUM数据类型来更好地处理这种情况。将这些选项存储在一个单独的表中是一个坏主意,直到你有很多这些选项..
mysql> DESC Classes;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| dept | char(4) | NO | | NULL | |
| level | enum('Upper','Lower') | NO | | NULL | |
+-------+-----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM Classes;
+----+------+-------+
| id | dept | level |
+----+------+-------+
| 10 | MATH | |
+----+------+-------+
1 row in set (0.00 sec)
mysql> INSERT INTO Classes VALUES (11, 'ENG', 'Upper')
-> ;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM Classes;
+----+------+-------+
| id | dept | level |
+----+------+-------+
| 10 | MATH | |
| 11 | ENG | Upper |
+----+------+-------+
2 rows in set (0.00 sec)
答案 2 :(得分:0)
为了设计,请使用适当的PK创建另一个表(您不想做的事)。这将有节省空间的额外好处,因为想象一下有10000个寄存器,上面有“已婚”字样。
此外,另一种方法是在您的应用程序中使用“字典”,存储在结构中,Id和值,如下所示:
Id Marital Status
1 Married
2 Single
.. ......
同一个表,但不在数据库中,而是在应用程序中,硬编码,序列化或在外部文件中。
答案 3 :(得分:0)
它还取决于行的大小。在速度方面将表拆分为多个是更好的选择。 对于前者您可以将用户表中常用的列和所有其他信息/可选列保存在单独的表中。在这种情况下,您还需要在显示数据时小心。
答案 4 :(得分:0)
我想,不需要过度规范化,因为它会在编写查询时遇到麻烦。你需要处理太多的连接。
如果婚姻状况的预定义条件是:已婚,单身和离婚,我只会存储一个字符,如:M,S和D,并在具有固定值的DropDown中提供这些选项。
我认为婚姻状况没有其他可能性,除非你想到类似的东西:
想要离婚
已婚但独居。
对于用户角色,我也会这样做:
A - 管理员 P - 高级用户 R - 受限用户 G - 嘉宾
如果你需要更复杂的东西,我不会再创建更多的表格。