如果有一个字段的值应该有不同的类型怎么办?
Posted
技术标签:
【中文标题】如果有一个字段的值应该有不同的类型怎么办?【英文标题】:What to do if there's a field the values of which should have different types? 【发布时间】: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。
【参考方案1】:
以下是三种 Postgres 方法:
有一个type
列和每个类型的单独列(value_date
、value_string
、...)。
使用 JSON/XML 存储值(尽管这可能会限制类型)。
将实际值存储在单独的列中。
通常,出现此问题是因为您希望有一列包含“不同”信息。例如,现在我正在从事一个数据项目,将来自不同来源的数据汇集在一起。我想在每一行中表示源级信息,但这因源而异。我的解决方案?我将数据表示为带有source_system_info
列的常规行。该列包含我想从源系统中包含的内容的 JSON 表示形式。
【讨论】:
我已经考虑了这些建议,并决定是时候加入一些 NoSQL 了。至于这种特殊情况,JSON 可能会为我提供最好的服务。谢谢!以上是关于如果有一个字段的值应该有不同的类型怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
SQL 当表中某个字段的值为NULL。假如这个值为NULL的时候。我想当成0来做减法处理。该怎么弄?