Mysql DB结构-具有动态选项数的表单
我一直在读类似的问题,但我认为我的情况有点复杂 我有一张登记物品的表格。这些项目可能具有带有子选项的选项(复选框和单选按钮):Mysql DB结构-具有动态选项数的表单,mysql,Mysql,我一直在读类似的问题,但我认为我的情况有点复杂 我有一张登记物品的表格。这些项目可能具有带有子选项的选项(复选框和单选按钮): 复选框和单选按钮的数量可能会减少/增加,但设计良好结构的真正困难在于复选框,因为它们必须(至少我认为是这样)为每个复选框指定一个固定名称列 单选按钮的情况更简单,因为我只需为每个按钮分配一个id(并将名称保存在不同的表中) 我当前的数据库结构很简单(括号中是表/列名): items表(item)的列类型为integer(用于保存单选按钮的id) 复选框的另一个表(
- 复选框和单选按钮的数量可能会减少/增加,但设计良好结构的真正困难在于复选框,因为它们必须(至少我认为是这样)为每个复选框指定一个固定名称列
- 单选按钮的情况更简单,因为我只需为每个按钮分配一个id(并将名称保存在不同的表中)
- items表(item)的列类型为integer(用于保存单选按钮的id)
- 复选框的另一个表(项_选项),列类型为整数(如果选中,则为1;如果未选中,则为0)。和1个PK列(item_id),指向items表的PK列(id)
- 和表(同样是项_选项),用于单选按钮的名称,单选按钮的PK列(id)指向选项列(这可以理解吗?对不起,我的英语不好)
+-----+----------+----------+
| id | Option_1 | Option_2 |
+-----+----------+----------+
| 123 | 3 | 1 |
+-----+----------+----------+
| 456 | 2 | 3 |
+-----+----------+----------+
| 789 | 1 | 2 |
+-----+----------+----------+
项目选项3表(需要知道哪些选项被选中):
项目选项1-2表(用于打印名称):
动态生成这些子选项(复选框)需要什么样的结构?像这样的东西怎么样 模型的选项键为列,值为行。为什么键和值都是行?如果您不需要复杂的基于类型的验证,那么拥有一个选项表就足够了,该表本身具有一对多的关系,以考虑子选项。要枚举所有选项和值,只需从表中检索所有行。如果
ParentOptionId
为空,则它是一个基本级别的选项;否则,它是一个子选项
UML&ER版本如下
编辑:在再次阅读您的问题和评论后,我提出了一个更复杂但更稳健的设计供您考虑:
它的工作原理如下:
- 每个用户输入都是一个
。每个选项都包含一个显示文本(选项
)、工具提示/子文本/etc(OptionText
)、一个默认值,然后是用户提供的值(Description
)、一个值类型(value
布尔值、文本、日期等)。它还有一个ValueType
,这样您就知道它相对于组中其他DisplayOrder
还可以与其他选项的位置了<代码>选项
建立父/子关系。如果需要,您可以对其他实体执行相同的操作,但我没有对此进行建模选项
- 每个
都包含在一个选项
中,该组有0个或多个同级选项组
<代码>选项组只是一个或多个相关的选项
。选项的集合
字段指示表单生成器需要如何处理该组。最明显的例子是你的单选按钮组;每个按钮都是GroupType
,每个单选按钮都是OptionGroup
中的布尔OptionGroup
选项。
可以同样轻松地处理多选复选框组,或者只处理一些需要公共标题文本(如街道地址)的相关文本输入OptionGroup
- 对于进一步的动态设计,
包含在optionGroup
中,即使表单中只有一个默认的GroupSection
GroupSection
- 最后,一个
为最终的实际UI表单建模,并由一个或多个表单
组部分组成
最后一点注意:如果您正在研究用Javascript动态构建表单,请查看一些类似或的框架。它们获取JSON或配置对象,并在此基础上构建整个表单和验证等,同时为事件处理提供一些挂钩。除非您希望实现尽可能简单和具体,否则您可能不需要完全重新设计轮子。我不完全理解,id和键列是一样的吗?对不起,我更注重实践而不是理论。我理解你说的最后一句话,在同一张表中有选项和子选项。您能提供一个基于复选框和单选按钮的值的示例吗?因为他们完全不同。我仍然无法描绘结构。id与键不同。例如,您可能有一个id为12的行,一个键为“CheckboxOption1”,一个描述为“I can has a cheeseburger”,值为“1”表示选中,值为“0”表示未选中。单选按钮组实际上对应于一个枚举,但只要您正确同步,就只是一组选项。也就是说,对于带有选项“红色”、“蓝色”和“绿色”的“选择颜色”问题,数据库中有3个选项(“Color1IsRed”、“Color1IsGreen”和“Color1IsBlue”),每个选项的值为0/1或真/假。您可以通过为可能的选项值创建一个表(如查找您的无线电选项)并将选项表链接到OptionValues表,使其变得更加复杂,但要使其尽可能简单,以适合您的用例。现在我看得更清楚了+我会考虑几分钟,我会接受。我会坚持你的第一个例子(复选框)。至于单选按钮,我想你不太明白:我真的不需要存储任何东西(只有在添加或删除子选项或新选项时)
+--------------+--------------+--------------+---------+
| Sub_Option_1 | Sub_Option_2 | Sub_Option_3 | item_id |
+--------------+--------------+--------------+---------+
| 1 | 0 | 1 | 123 |
+--------------+--------------+--------------+---------+
| 1 | 1 | 0 | 456 |
+--------------+--------------+--------------+---------+
| 0 | 1 | 1 | 789 |
+--------------+--------------+--------------+---------+
+-----------+--------------+--------------+
| 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 |
+-----------+--------------+--------------+