【问题标题】:SQL database design with some user defined fields带有一些用户定义字段的 SQL 数据库设计
【发布时间】:2017-04-12 03:09:46
【问题描述】:

我正在开发一个数据库模式来处理数据收集,然后再报告这些数据。

在需求讨论之后,似乎实体属性值 (EAV) 解决方案或平面表解决方案都可以 - 因为数据有些稀疏但不是高度稀疏

但是,用户定义的字段在未来将成为必须,但我知道使用 EAV 表查询和优化 RDBMS 可能会变得很复杂。

我查看了here 的讨论,我认为类似于选项 1 的选项是可能的。例如,有一些设置字段,然后是一些用户可以定义标签的备用字段。

在报告方面,使用这种方法而不是使用 EAV 有什么缺点吗?

【问题讨论】:

  • 在 Postgres 中使用hstore 列或jsonb

标签: sql database postgresql database-design entity-attribute-value


【解决方案1】:

你会后悔 EAV,尤其是在报告方面

  1. 在尝试任何事情之前,请确保您了解现有的数据模型模式:Ready to use database model patterns

  2. 熟悉表继承:How can you represent inheritance in a database?

  3. 考虑允许用户修改自己的架构:https://martinfowler.com/bliki/UserDefinedField.html

  4. EAV 几乎总是一个非常糟糕的主意。如果您在尝试上述操作后仍需要自定义字段,请使用带有索引的 blob 类型(如 JSON 或 XML):http://backchannel.org/blog/friendfeed-schemaless-mysql。 Postgres 的二进制jsonb 速度很快,并且允许索引/查询

【讨论】:

  • 我将更深入地研究序列化 LOB,因为它在可查询性方面似乎更容易一些。我不认为用户可修改的模式是理想的,因为字段可能非常短暂地存在(例如,一年的新字段可能在明年不存在)。这使得 EAV 和 JSON 类型字段由于其动态特性而更具吸引力。此外,我还看到了这个EAV paper,它显示了在医疗数据收集中相对常见的用途。
猜你喜欢
  • 2011-07-03
  • 2014-06-24
  • 2012-03-13
  • 2012-05-24
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多