数据库设计帮助 - EAV + 表单构建器

5
我正在尝试构建一种表单生成器,它将允许我以灵活的方式定义、显示和存储“测试”。即允许用户通过Web界面创建新的测试/表单类型(“分组”),并定义将在表单上显示的一组字段(任何类型的字段,包括日期、文本、单选框、复选框等)。我还需要一个结果表,用于存储每个表单/测试中保存的值。
作为不充分的示例,到目前为止我有以下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之旅之前,请先阅读我的回答。 - Stephanie Page
4个回答

4
为了包含组合框值,您需要通过以下方式扩展模型:
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"

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


3

首先,要注意内部平台效应

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


3
听起来这是使用EAV模型的好案例。

OP的问题中的表已经是EAV模型的一个例子。 - Paul Sasik
谢谢,知道它的名称帮助我找到了大量的帮助 - 它确实是EAV,并且根据我目前所读的内容来看 - 是正确的选择(用于健康记录)。 - Mikalee
等一下,(健康记录)?你不是说代数测试吗? - Stephanie Page
是的,我在您下面的帖子中解释了(我正在处理健康记录)。 - Mikalee

1

好的,那么在您的回答和评论中,您描述了两种非常不同的情况。

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

然而,

如果像您在评论中所说的那样是健康记录,那就是一个完全不同的问题。健康记录很奇怪,因为基本上有无数的症状和重要缺乏的症状。比如你做了手术,就会发烧。这可能表明感染。如果没有伤口发红、肿胀、触痛或流脓,那就是重要的症状缺失。

将健康记录视为Facebook。当您访问朋友的页面时,数据库具有该人的PK,然后通过该PK获取所有内容。例如,您通常不会按家乡和婚姻状况对用户进行计数。这种查询对EAV来说是一种痛苦。健康记录也是如此。患者123出现了,您只需要他/她的图表。您不需要查询所有共享6个症状的人。(顺便说一句,在研究中确实会发生这种情况,但这些EAV记录必须进行过滤、旋转和转换为更多的3nf格式。)
如果您正在处理健康记录,我建议您研究一些专门设计用于健康记录的新EAV RDBMS。

抱歉使用了不同的示例。事实上,我正在处理健康记录,并最初只给出了数学示例,因为它似乎更容易解释。尽管如此,我正在处理健康记录,但我正在寻找一个稍微更明确定义的数据集。我倾向于使用EAV模式的主要原因是,虽然有一组已知的测试(实验室/诊断/体检等),但每个医院/部门似乎都以略微不同的方式捕获它们。因此,我想使用EAV根据医院和部门轻松定制测试的显示和捕获。 - Mikalee
另外,我应该补充一点,每隔几个月添加新类型的测试(作为分组)或测试中的字段并不罕见。 - Mikalee
最好告诉我们你实际在做什么。稍微偏离一点可能会使答案完全相反。 - Stephanie Page
就像我说的一样,EAV对于健康记录来说是有意义的。当你说“不同的医院在捕获这些数据时略有不同”时,那么你要将其作为SaaS服务提供出售吗?你想开发一个多租户的SaaS应用程序吗? - Stephanie Page
没错...这是一个基于Web的SaaS应用程序,从3个站点开始,计划扩展到其他站点。因此,似乎EAV是临床结果的最佳选择。感谢您的反馈。 - Mikalee

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