数据库设计帮助 - EAV + 表单生成器

Posted

技术标签:

【中文标题】数据库设计帮助 - EAV + 表单生成器【英文标题】:DB design help - EAV + Form builder 【发布时间】:2010-11-22 16:48:01 【问题描述】:

我正在尝试构建一种表单构建器,它允许我以灵活的方式定义、显示和存储“测试”。 IE。允许用户通过 Web 界面创建新类型的测试/表单(“分组”)并定义将在表单上显示的一组字段(任何类型的字段,包括日期、文本、单选框、复选框, ETC)。我还需要一个结果表来存储每个表单/测试中保存的值。

作为一个不充分的例子,到目前为止,我有以下 3 个表:

dd_TestGrouping
- TestGroupingID [pk]  
- TestGroupingName  "Algebra-1"
- TestGroupingTypeID "Math"

dd_TestFields
- TestFieldID [pk]
- TestGroupingID [fk]
- TestFieldName "Circumference"
- TestFieldType "TextBox"
- Sequence

TestResults
- TestResultID [pk]
- TestFieldID [fk]
- value "50"
- Unit "CM"

上面的问题 - 如果没有别的 - 我不确定如何动态显示下拉列表和链接的单选框/复选框。另外,我该如何处理验证?

提前感谢您的任何帮助/指点。

【问题讨论】:

在开始您的 EAV 旅程之前,请阅读我的回答。 【参考方案1】:

要包含组合框值,您需要通过以下方式扩展模型:

dd_TestFields
- TestFieldID [pk]
- TestGroupingID [fk]
- TestFieldName "Gender"
- TestFieldType "Combo Box"
- Sequence

使用新表:

dd_TestFieldSelection
- TestFieldSelectioniD [pk]
- TestFieldID [fk]
- TestFieldValue "Female"
- Sequence

我认为验证自然属于您的 dd_TestFields 表:

dd_TestFields
- TestFieldID [pk]
- TestGroupingID [fk]
- TestFieldName "Age"
- TestFieldType "Number/Text Box"
- Sequence
- Required "True"
- MinValue "0"
- MaxValue "150"

这只是一个粗略的草图,但您可以根据需要扩展这些想法。

【讨论】:

【参考方案2】:

听起来像这样使用EAV model 是一个很好的例子。

【讨论】:

OPs 问题中的表格已经是 EAV 模型的示例。 谢谢,知道它叫什么帮助我找到了大量的帮助 - 它确实是 EAV 并且 - 根据我目前所读到的 - 正确的选择(用于健康记录)。 等等,(健康记录)?你不是说代数测试吗? 是的,我做到了-解释评论了您在下面的帖子(我正在处理健康记录)。【参考方案3】:

首先,提防inner platform effect。

其次,支持下拉菜单只需要有一个包含“多”类型字段的所有可能值的第四个表。

【讨论】:

【参考方案4】:

好的,所以在你的答案和 cmets 中你已经描述了两个非常不同的场景。

如果它是代数测试的表单构建器并在您的示例中进行了描述,那么请阅读 here。 EAV 非常诱人,但您会为使用普通的 RDBMS 构建该模型付出巨大的代价。

然而,

如果是您在评论中所说的健康记录。那是一场不同的球赛。健康记录很奇怪,因为基本上有无限数量的症状和明显缺乏症状。假设您有手术伤口并且发烧。这可能表明感染。如果伤口没有发红、肿胀、压痛或流脓,则表明没有明显的症状。

想想像 Facebook 这样的健康记录。当你访问一个朋友的页面时,数据库有那个人的 PK,然后得到所有的东西。例如,您通常不会按家乡和已婚来统计用户。该查询对 EAV 来说是一种痛苦。与健康记录相同。患者 123 出现,您只需要他/她的图表。您无需查询共享 6 个症状的每个人。 (顺便说一句,这确实发生在研究中,但这些 EAV 记录必须经过过滤、旋转并转换为更 3nf 的格式。)

如果您正在做健康记录,我会研究一些专门为健康记录设计的新 EAV RDBMS。

【讨论】:

为不同的例子道歉。我实际上正在研究健康记录,最初只给出了数学示例,因为它似乎更容易解释。也就是说,虽然我正在处理健康记录,但我正在寻找一组稍微更明确的数据。我倾向于 EAV 模式的主要原因是,尽管有一组已知的测试(实验室/诊断/物理/等),但每个医院/部门似乎捕捉到的它们与下一个略有不同。因此,我想使用 EAV 轻松自定义基于医院和科室的测试显示和捕获。 另外,我应该补充一点,每隔几个月在测试中添加新类型的测试(作为一个分组)或字段并不少见。 最好告诉我们您实际在做什么。稍有偏差就能将答案改变 180 度。 就像我说的。 EAV 对健康记录有意义。当您说“不同的医院对它们的捕获方式略有不同”时,您打算将其作为 SaaS 产品出售吗?您想构建多租户 SaaS 应用? 没错...这是一个基于网络的 SaaS 应用程序,从 3 个站点开始,并计划扩展到其他站点。因此,似乎 EAV 是获得临床结果的最佳方式。感谢您的反馈。

以上是关于数据库设计帮助 - EAV + 表单生成器的主要内容,如果未能解决你的问题,请参考以下文章

电子商务项目的数据库设计(我应该使用 EAV 方法)

EAV模型

实体-属性-值 (EAV) 的替代方案?

关系模型与 EAV

关系模型与EAV

数据库 结构 , Eav 模型 , 太慢 的 搜索 查询