【发布时间】:2016-04-27 22:40:20
【问题描述】:
我们已经在我的工作地点开发系统有一段时间了,我觉得数据库设计有点失控了。
例如,我们有一个表格小部件(我有点欺骗这些小部件):
+-----------------------+
| Widget |
+-----------------------+
| Id | Name | Price |
| 1 | Sprocket | 100 |
| 2 | Dynamo | 50 |
+-----------------------+
*There's about 40+ columns on this table already
我们希望为每个小部件添加一个属性以用于打包信息。我们需要知道它是否有包装信息,是否没有包装信息,或者我们不知道它是否有。然后,我们还需要存储包装详细信息的类型(假设它有或可能没有,它现在是冗余信息)。
我们已经有另外一张表来存储详细信息信息(我个人认为这张表应该分开,但这是另一个问题)。 PD = 包裹详情
+--------------------------------+
| System Properties |
+--------------------------------+
| Id | Type | Value |
| 28 | PD | Boxed |
| 29 | PD | Vacuum Sealed |
+--------------------------------+
*There's thousands of rows in the table for all system wide table properties
本能地,我会创建许多映射表来捕获这些信息。然而,我被指示在每个表中添加另一列以避免进行连接。
我的解决方案:
创建表:
+---------------------------------------------------+
| widgets_packaging |
+---------------------------------------------------+
| Id | widget_id | packing_info | packing_detail_id |
| 1 | 27 | PACKAGED | 2 |
| 2 | 28 | UNKNOWN | NULL |
+---------------------------------------------------+
+--------------------+
| packaging |
+--------------------+
| Id | |
| 1 | Boxed |
| 2 | Vacuum Sealed |
+--------------------+
如果我想知道一个小部件有什么包装,我可以加入到 widgets_packaging 中,如果我想知道确切的细节,我会再次加入到包装中。因此,小部件表上不再有列。
然而,有人告诉我忽略这一点,并将值 int 用于包装信息,并将另一个值作为外键放入系统属性表以查找包装详细信息。因此向表中添加另外两列,并在系统属性表中创建更多行来存储包详细信息。
+------------------------------------------------------------+
| Widget |
+------------------------------------------------------------+
| Id | Name |Price | has_packaging | packaging_details |
| 1 | Sprocket |100 | 1 | 28 |
| 2 | Dynamo |50 | 0 | 29 |
+------------------------------------------------------------+
这样做的原因是,如果您只想知道小部件是否有包装(有很多小部件),它更简单并且不涉及连接。他们担心更多的连接会减慢速度。
这里哪种解决方案更正确?他们对速度的担忧是否合理?我的直觉是,我们不能只是继续在小部件表中添加列,因为它正在增长,并且目前带有属性标志。
【问题讨论】:
-
从设计、数据一致性和性能的角度来看,您的标准化解决方案在数学上具有优势。对数据库规范化 (en.wikipedia.org/wiki/Database_normalization) 和 3NF (en.wikipedia.org/wiki/Third_normal_form) 进行一些研究,以便与反对者作斗争。
-
我添加了一个标签;搜索 [mysql] [entity-attribute-value] 以了解许多类似任务的讨论。
标签: mysql sql database-design