如果有一个字段的值应该有不同的类型怎么办?

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_datevalue_string、...)。 使用 JSON/XML 存储值(尽管这可能会限制类型)。 将实际值存储在单独的列中。

通常,出现此问题是因为您希望有一列包含“不同”信息。例如,现在我正在从事一个数据项目,将来自不同来源的数据汇集在一起​​。我想在每一行中表示源级信息,但这因源而异。我的解决方案?我将数据表示为带有source_system_info 列的常规行。该列包含我想从源系统中包含的内容的 JSON 表示形式。

【讨论】:

我已经考虑了这些建议,并决定是时候加入一些 NoSQL 了。至于这种特殊情况,JSON 可能会为我提供最好的服务。谢谢!

以上是关于如果有一个字段的值应该有不同的类型怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

怎么查看数据库表中某个字段的值都有哪些重复记录

SQL 当表中某个字段的值为NULL。假如这个值为NULL的时候。我想当成0来做减法处理。该怎么弄?

用distinct查询筛选去除数据库两个字段重复的值,不成功,还是你把重复的值显示出来了,应该怎么处理呢?

怎么获取DataTable中某一字段的值

Oracle语句怎么截取和:之间的值?

sql server2008 怎么改变字段类型