【发布时间】:2011-09-26 20:20:13
【问题描述】:
我有一个系统,允许人们从下拉框中选择他们想要填写的表单类型。由此,显示该特定表单的其余字段,用户填写它们并提交条目。
表格:
| form_id | age_enabled | profession_enabled | salary_enabled | name_enabled |
这描述了表单的元数据,以便系统知道如何绘制它。因此,如果表单应包含要为此列填写的字段,则每个 _enabled 列都是布尔值 true。
条目表:
| entry_id | form_id | age | profession | salary | name | country |
这会存储提交的表单。其中年龄、职业等存储表单中填写的实际值(如果表单中不存在,则为 null)
用户可以即时向系统添加新表单。
现在的主要问题是:我想为用户添加设计新表单的功能,以便能够包含属性的可能值列表(例如,职业是说 20 个职业的下拉列表,而不仅仅是填写表格时的文本框)。我不能简单地为每列存储一个可能值的全局列表,因为每个表单都有不同的值列表可供选择。
我能想出的唯一解决方案是在 Form 表中包含另一组列,例如professional_values,然后以字符分隔格式存储这些值。我担心某一天某一列可能有大量可能的值,而这一列会失控。
请注意,如果需要,可以稍后将新列添加到 Form(因此依次添加 Entry),但 90% 的表单具有相同的基本列集,因此我认为这种设计比 EAV 设计更好。想法?
我从未见过这样的系统(作为一个整体)的关系设计,而且我似乎无法找到一种体面的方法来做到这一点。
【问题讨论】:
-
您需要更多相关表,而不是更多列。为什么在数据库中使用 CSV?这是你出错的一个很好的线索。
-
@Orbling 我同意,但是,我认为这个问题不存在一个好的关系模式。某个地方将不得不做出一些让步才能使其发挥作用。您知道可行的架构吗?
-
@Davis Dimitriov:这是一个相当标准的关系模式问题,只要想想数据中的列表中有一个列表,那么您需要一个链接到父表的新表。有关示例架构,请参见下面的 Alex Howansky 的回答。
-
@Orbling 这不是一个标准的关系模式问题,因为关系设计不能很好地实现这种灵活性。 Alex 的帖子遵循实体-属性-值 (EAV) 设计模式,但也存在一些缺陷。我不相信你能赢得所有人,但我很想被说服
标签: database database-design data-modeling