EAV模型与混合策略的替代方案与简化和改进构建相比

Squ*_*ons 7 sql database-design entity-attribute-value

我一直在为即将开展的项目进行大量的数据库设计研究.

这是典型的内部平台的问题,我们的客户基本上要无限定制和打造产品的能力和对实体属性,收集他们从最终用户的价值,并能够显示在图形上收集到的信息.

临床医生将用它来帮助监测患者,为什么即使使用EAV,我们也需要为不同的试运行收集不同的信息.有时可能是他们那天吃的东西.其他可能是血糖,或血压(这实际上是两个数字),其他可能是多个问题(今天你的疼痛怎么从1-10?),所有这些都是我们永远不会真正知道的提前最终客户要求的是什么,或者真正接受的是什么.

我们还将在整个计划中一致地绘制这些数据,并在较不规则的基础上生成更大的报告.

理想情况下,我希望尽可能多地硬编码,因为我们使用SQL,并且坚持关系数据库最佳实践将简化数据库设计和应用程序设计(我正在编写这两者).

我们正在进行一些试运行,我的第一个倾向是从客户那里获取尽可能多的信息,对数据库中的表进行硬编码,然后从那里构建.如果我们发现我们需要使用属性表和attribue_value表来收集这些属性(以及有趣的实现表单构建器,如下拉菜单 - 从而下拉菜单选项和验证/需要),我们可以这样做后来发布.

我基本上经历了每个相关的堆栈溢出帖子; 大多数人说避免EAV,更好地了解应用程序的要求,并且,在某些时候,如果客户TRULY需要EAV实施,那么继续执行它.

  • 有没有人曾经使用混合动力车型?你能讨论一下吗?

  • 有没有人成功实施过EAV模型,你能讨论一下吗?

  • 你有没有做过类似的决定,决定不为一个似乎可能成为候选人的项目实施EAV?结果怎么样?

以下是我在此过程中发现的一些有趣的读物:

http://decipherinfosys.wordpress.com/2007/01/29/name-value-pair-design/ 存储时间序列数据,关系数据还是非存储数据? 数据库EAV优点/缺点和替代 实体 - 属性 - 值(EAV)的替代方案?

这个链接确实给了我很多洞察力.

Squ*_*ons 0

经过一番思考,并考虑到客户的需求/要求,使用 EAV 模型是正确的答案。

在做了更多研究之后,我决定使用 Postrgresql 并充分利用它的 HSTORE 数据类型,它允许在单个字段中存储、搜索和索引键值对。

以下是 hstore 与 EAV 的基准测试论文: http://wiki.hsr.ch/Datenbanken/files/Benchmark_of_KVP_vs。hstore -_doc.pdf

上面的论文对 hstore 与 EAV 表进行了基准测试,hstore 遥遥领先。

我们考虑的另一个选择是建立一个涵盖所有基础的任务表:

id、名称、值_1、值_2...注释_1、注释_2

显然,这个想法让我有点崩溃,所以我要么使用一个 task_type 属性表:

任务是由管理员向用户规定的,并且具有task_type,task_type_attributes适用于该类型的所有任务(即,定义锻炼任务,我们希望能够存储有关锻炼强度、锻炼强度的信息)练习所花费的时间等)。

一旦用户提出任务,他们就会看到任务属性作为需要填写的字段。他们输入这些字段,然后他们输入的 attribute_value 与患者的 task_entry 相关联(还说明他们是否完成、跳过等)

任务属性

  • ID
  • 任务类型id
  • 属性
  • attribute_value_type(用于在应用程序端生成所需的字段 - 即知道有一个下拉列表还是一个文本输入)
  • 最小值
  • 最大值
  • 必需的

任务条目值

  • 任务条目id
  • 任务类型属性id
  • 价值

希望这对某人有用。我也对这个设计的任何和所有批评/反馈感兴趣。