EAV模型的替代方案 vs 混合策略 vs 简化和改进构建方式

8

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

这是经典的内部平台问题,我们的客户基本上希望无限定制并能够创建实体上的表单和属性,收集来自最终用户的值,并能够将所收集的信息显示在图表上。

它将成为临床医生监测患者的工具,使用EAV的原因是我们需要为不同的试验运行收集不同的信息。有时可能是他们当天吃了什么。其他时候可能是血糖或血压(这实际上是两个数字),而另一些时候可能是多个问题(您今天从1-10的疼痛情况如何?),所有这些都是根据我们永远无法预先知道客户最终会询问什么或接受什么值的想法。

我们还将始终在程序中一致地绘制这些数据,并定期生成更大的报告。

理想情况下,我希望尽可能硬编码所有这些内容,因为我们正在使用SQL,并坚持关系数据库最佳实践将简化数据库设计和应用程序设计(我都在编写)。

我们正在进行几个试运行,我的第一个想法是尽可能从客户那里获取尽可能多的信息,硬编码数据库中的表,然后从那里开始构建。如果我们发现我们需要使用属性表和属性值表来收集这些属性(以及有趣的实现表单构建器的事情,如下拉菜单-因此下拉菜单选项和验证/必填项),则可以在稍后的版本中这么做。

我已经阅读了基本上每一篇相关的堆栈溢出文章; 大多数人都说要避免EAV,更好地了解应用程序的需求,并且,在某些时候,如果客户确实需要EAV实现,那么就去做吧。

  • 是否有人使用过混合模型?能谈谈它吗?

  • 是否有人成功实施了EAV模型,能谈谈它吗?

  • 你是否曾经遇到类似的决策,决定不为看起来可能是候选者的项目实施EAV?结果如何?

以下是我找到的一些有趣阅读资料:

Here are the translations:

Name-Value Pair Design 存储时间序列数据,关系型还是非关系型? 数据库EAV的优缺点及替代方案 除了EAV之外的实体属性值(Entity-Attribute-Value)的替代方案?

多个固定表格与灵活的抽象表格相比较 - 这个链接给了我很多启发。


2
更多的思考食粮 - 从第16张幻灯片开始讨论EAV。 - Benny Hill
3
请查看我的演示文稿可扩展数据建模,了解不同选择的优缺点。 - Bill Karwin
对于其他来到这里的人 - 我阅读了此评论线程中的两个链接。它们都写得非常好,信息量大,并且如果你正在探索这条路,强烈推荐阅读。 - Squadrons
1个回答

0
经过一番思考,考虑到客户的需求和要求,在这里使用EAV模型是正确的选择。
经过更多的研究后,我决定使用Postrgresql数据库,并充分利用其HSTORE数据类型,该类型允许在单个字段中存储、搜索和索引键值对。
以下是一篇比较hstore和EAV性能的论文: http://wiki.hsr.ch/Datenbanken/files/Benchmark_of_KVP_vs.hstore-_doc.pdf 上述论文对比了hstore和EAV表的性能,结果hstore遥遥领先。
我们还考虑了另一种选项,即将所有方面都涵盖的任务表:
id、名称、value_1、value_2... note_1、notes_2。
显然,这样的想法有点让我感到沮丧,所以我要么会使用一个task_type属性表:

管理员向用户指定任务并设置任务类型,任务类型属性适用于该类型的所有任务(例如,对于一项锻炼任务,我们希望能够存储有关锻炼强度、锻炼时间等信息)。

一旦用户打开任务,他们会看到任务属性作为要填写的字段。他们输入这些字段,然后输入的属性值将与患者的任务条目相关联(还说明了他们是否完成了它、跳过了它等)。

任务属性

  • id
  • task_type_id
  • attribute
  • attribute_value_type(用于在应用程序端生成所需的字段 - 即,知道要使用下拉菜单还是文本输入)
  • min_value
  • max_value
  • required

任务条目值

  • task_entry_id
  • task_type_attribute_id
  • value

希望这对某人有用。我也很想听听这个设计的任何批评/反馈。


1
请确保使用测试数据对其进行负载测试,这些数据的大小大约是数据库在一年后的大小。您真的不想在那时发现需要重新构建。 - HLGEM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接