【发布时间】:2018-06-06 14:41:09
【问题描述】:
我有一个应用程序,用户可以在其中“创建”动物。动物可以有不同的属性:颜色、重量、是否野生等。当我在数据库中定义属性可以具有的值时,我遇到了一个问题:
Table: attributes
+-------------+
| id | name |
+-------------+
| 1 | color |
| 2 | weight |
| 3 | wild |
+-------------+
Table: values
+--------------------------------+
| att_id (fkey) | name (varchar) |
+--------------------------------+
| 1 | brown | ok
| 1 | grey | ok
| 1 | white | ok
| 2 | 300 | <-- not good to put this in a varchar field
| 3 | yes | <-- not good to put this in a varchar field
+--------------------------------+
如何解决这个问题?我是否应该为 int 和 boolean 值再创建两个表,并为attributes 表中的每个属性设置,其中values 表中应该查找给定属性的值?或者什么是合适的设计?
【问题讨论】:
-
您遇到了Entity Attribute Value“模式”,许多人认为这是一个坏主意。如果您可以对属性进行强有力的建模(即每个属性的“类型”有一个单独的表,即颜色、重量和百搭),我建议您这样做。 EAV 在灵活的系统中很常见,它允许用户“扩展”实体上的属性数量,而无需动态创建表。
-
您还可以将
type分类添加到您的属性表(保留属性值的弱类型),然后在代码中强制执行您的类型系统。 -
您可以为属性表中的每个相关数据类型提供一列,并添加检查约束以确保其中一列不为 NULL。
标签: sql postgresql database-design