数据库结构 - 具有动态数量选项的表单

时间:2016-06-13 23:57:41

标签: mysql

我一直在阅读类似的问题,但我认为我的情况有点复杂。

我有一个注册项目的表单。这些项目可能包含子选项(复选框和单选按钮)选项:

  • 复选框和单选按钮的数量可能会减少/增加,但设计好结构的真正痛苦在于复选框,因为这些复选框必须具有(至少我认为如此)固定名称列。

  • 单选按钮的情况更容易,因为我只为每个按钮分配一个id(并将名称保存在不同的表中)。

我当前的数据库结构很简单(括号之间是表/列名称):

  • items表(item)具有integer类型的列(用于保存单选按钮的id)。
  • 复选框(item_option)的另一个表,其中包含整数类型的列(如果选中则为1,如果未选中则为0)。并且1个PK列(item_id)指向items表的PK列(id)。
  • 并且表格(再次是item_option)用于带有指向选项栏的PK列(id)的单选按钮的名称(这是可以理解的吗?抱歉我的英语不好)。

我认为包含子选项的另一个表比将所有列放在主表中更好,对吗?

因此,单选按钮存储在主表中(每个选项1列),并且复选框存储在单独的表中(每个选项1个表):

项目表:

+-----+----------+----------+
| id  | Option_1 | Option_2 |
+-----+----------+----------+
| 123 | 3        | 1        |
+-----+----------+----------+
| 456 | 2        | 3        |
+-----+----------+----------+
| 789 | 1        | 2        |
+-----+----------+----------+

item_option_3表(需要知道检查了哪些表):

+--------------+--------------+--------------+---------+
| Sub_Option_1 | Sub_Option_2 | Sub_Option_3 | item_id |
+--------------+--------------+--------------+---------+
| 1            | 0            | 1            | 123     |
+--------------+--------------+--------------+---------+
| 1            | 1            | 0            | 456     |
+--------------+--------------+--------------+---------+
| 0            | 1            | 1            | 789     |
+--------------+--------------+--------------+---------+

item_option_1-2表(这将用于打印名称):

+-----------+--------------+--------------+
| option_id | name         | name_es      |
+-----------+--------------+--------------+
| 1         | Sub_Option_1 | Sub_Opción_1 |
+-----------+--------------+--------------+
| 2         | Sub_Option_2 | Sub_Opción_2 |
+-----------+--------------+--------------+
| 3         | Sub_Option_3 | Sub_Opción_3 |
+-----------+--------------+--------------+

我需要什么样的结构来动态生成这些子选项(复选框)?

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

您的模型将选项键作为列,将值作为行。为什么键和值都是行?如果您不需要复杂的基于类型的验证,那么只需要一个选项表,其中一个选项表与自身之间可选择多个关系,以便考虑子选项。要枚举所有选项和值,只需从表中检索所有行。如果ParentOptionId为null,则它是基本级别选项;否则它是一个子选项。

UML& ER版本如下。

enter image description here

编辑:在再次阅读您的问题和评论之后,我想出了一个更复杂但更强大的设计供您考虑:

它的工作原理如下:

  • 每个用户输入都是Option。每个选项都包含显示文本(OptionText),工具提示/子文本/等(Description),默认值,然后是用户提供的值(Value),值类型({{1布尔值,文本,日期等)。它还有ValueType,因此您可以知道将其置于其组中的其他DisplayOrder的位置。 Options也可以与其他Options建立父/子关系。如果你愿意,你可以为其他实体做同样的事情,但我没有对其进行建模。
  • 每个Options都包含在Option中,其中包含0个或更多同级OptionGroupOptions只是一个或多个相关OptionGroups的集合。 Options字段指示表单构建器如何处理该组。最明显的例子是你的单选按钮组;其中每个都是GroupType,每个单选按钮都是OptionGroup中的布尔OptionOptionGroup可以轻松处理多选复选框组或只需要一些需要常用标题文本的相关文本输入(如街道地址)。
  • 进一步动态设计OptionGroup包含在OptionGroups中,即使表单中只有一个默认GroupSections
  • 最后,GroupSection为您的最终实际用户界面表单建模,并由一个或多个Form组成。

这应该足够灵活,可以根据自己的喜好进行调整。你觉得怎么样?

最后注意事项:如果您正在考虑在Javascript中动态构建表单,请查看一些框架,例如X-editableformly。他们使用JSON或配置对象,并从那里使用validation / etc构建整个表单,同时为您提供一些事件处理钩子。除非你想让你的实现尽可能简单和具体,否则你可能不需要完全重新发明轮子。