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)指向选项列(这可以理解吗?对不起,我的英语不好)
我认为包含子选项的不同表比将所有列放在主表中要好,对吗

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

项目表:

+-----+----------+----------+
| id  | Option_1 | Option_2 |
+-----+----------+----------+
| 123 | 3        | 1        |
+-----+----------+----------+
| 456 | 2        | 3        |
+-----+----------+----------+
| 789 | 1        | 2        |
+-----+----------+----------+
项目选项3表(需要知道哪些选项被选中):

项目选项1-2表(用于打印名称):


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

像这样的东西怎么样

模型的选项键为列,值为行。为什么键和值都是行?如果您不需要复杂的基于类型的验证,那么拥有一个选项表就足够了,该表本身具有一对多的关系,以考虑子选项。要枚举所有选项和值,只需从表中检索所有行。如果
ParentOptionId
为空,则它是一个基本级别的选项;否则,它是一个子选项

UML&ER版本如下

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

它的工作原理如下:

  • 每个用户输入都是一个
    选项
    。每个选项都包含一个显示文本(
    OptionText
    )、工具提示/子文本/etc(
    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 |
+-----------+--------------+--------------+