我一直在阅读类似的问题,但我认为我的情况有点复杂。
我有一个注册项目的表单。这些项目可能包含子选项(复选框和单选按钮)选项:
复选框和单选按钮的数量可能会减少/增加,但设计好结构的真正痛苦在于复选框,因为这些复选框必须具有(至少我认为如此)固定名称列。
单选按钮的情况更容易,因为我只为每个按钮分配一个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 |
+-----------+--------------+--------------+
我需要什么样的结构来动态生成这些子选项(复选框)?
答案 0 :(得分:1)
这样的事情怎么样?
您的模型将选项键作为列,将值作为行。为什么键和值都是行?如果您不需要复杂的基于类型的验证,那么只需要一个选项表,其中一个选项表与自身之间可选择多个关系,以便考虑子选项。要枚举所有选项和值,只需从表中检索所有行。如果ParentOptionId
为null,则它是基本级别选项;否则它是一个子选项。
UML& ER版本如下。
编辑:在再次阅读您的问题和评论之后,我想出了一个更复杂但更强大的设计供您考虑:
它的工作原理如下:
Option
。每个选项都包含显示文本(OptionText
),工具提示/子文本/等(Description
),默认值,然后是用户提供的值(Value
),值类型({{1布尔值,文本,日期等)。它还有ValueType
,因此您可以知道将其置于其组中的其他DisplayOrder
的位置。 Options
也可以与其他Options
建立父/子关系。如果你愿意,你可以为其他实体做同样的事情,但我没有对其进行建模。Options
都包含在Option
中,其中包含0个或更多同级OptionGroup
。 Options
只是一个或多个相关OptionGroups
的集合。 Options
字段指示表单构建器如何处理该组。最明显的例子是你的单选按钮组;其中每个都是GroupType
,每个单选按钮都是OptionGroup
中的布尔Option
。 OptionGroup
可以轻松处理多选复选框组或只需要一些需要常用标题文本的相关文本输入(如街道地址)。OptionGroup
包含在OptionGroups
中,即使表单中只有一个默认GroupSections
。GroupSection
为您的最终实际用户界面表单建模,并由一个或多个Form
组成。这应该足够灵活,可以根据自己的喜好进行调整。你觉得怎么样?
最后注意事项:如果您正在考虑在Javascript中动态构建表单,请查看一些框架,例如X-editable或formly。他们使用JSON或配置对象,并从那里使用validation / etc构建整个表单,同时为您提供一些事件处理钩子。除非你想让你的实现尽可能简单和具体,否则你可能不需要完全重新发明轮子。