将许多复选框输入插入数据库的最佳方法是什么?

时间:2010-07-10 13:30:12

标签: database forms checkbox bit-manipulation

问候,

我有一个表格,它有近150个复选框,但它们不在一个地方,表格被分成几个部分,每个部门都有块,复选框放在这些块中,取决于他们的组 你可以在这个地方找到四个复选框,其中八个在其他地方,30个在其他地方,所以继续 所以我创建了一个两个表来存储组和其他存储复选框以及它们属于哪个组。

FormBlocks
    --------------------------
    |  ID  |       key       |
    --------------------------
    |   1  |  property_type  |
    |   2  |    providors    |
    --------------------------

BlocksCheckBoxes
    ------------------------------------------------
    |  ID  |     Label    |   Key  |  FormBlockId  |
    ------------------------------------------------
    |   1  |  Sweet Home  |  home  |       1       |
    |   2  |     Farm     |  farm  |       1       |
    |   3  |  Invst Bank  |  bank  |       2       |
    |   4  |  Constructor | constr |       2       |
    ------------------------------------------------

我有两种存储价值的方法:
第一个将复选框值存储为其键的串联字符串,并将其直接插入指定的表,例如:

UserProperties
    ----------------------------------------
    |  ID  |  Customer  |  PropertiesType  | 
    ----------------------------------------
    |   1  |    Cat     |     home,farm    |
    ----------------------------------------

专业人士:非常容易实现,我只需要添加一个列就可以了,理论上它更快了 缺点:将丢失数据完整性的数据库级别,这将取决于应用程序级别(我想我可以活下去)

我为每个块创建表的第二种方式,例如:

UserProperties
    ---------------------
    |  ID  |  Customer  |
    ---------------------
    |   1  |    Cat     |
    ---------------------

UserPropertiesTypes
    --------------------------------------
    |  ID  |  CustomerId  |  CheckBoxId  | 
    --------------------------------------
    |   1  |       1      |       1      |
    --------------------------------------
    |   1  |       1      |       2      |
    --------------------------------------

专业人员:我认为这是专业的方式,可确保数据库级别的数据完整性 缺点:我需要为每个具有复选框组的部分创建表格,如果您在表单中有许多组,这对于开发来说是一个令人头疼的问题。

我没有考虑按位,因为我必须为每个复选框创建一个列,我发现它对于拥有超过30个复选框的大组来说效率不高。所以我更愿意采用一种将在应用程序中实现的方法

如果您有任何建议或更好的方法,请不要犹豫。 非常感谢你

1 个答案:

答案 0 :(得分:1)

判断

BlocksCheckBoxes
------------------------------------------------
|  ID  |     Label    |   Key  |  FormBlockId  |
------------------------------------------------
|   1  |  Sweet Home  |  home  |       1       |
|   2  |     Farm     |  farm  |       1       |
|   3  |  Invst Bank  |  bank  |       2       |
|   4  |  Constructor | constr |       2       |
------------------------------------------------

建议只能选择一个选项,因此这个复选框可以表示为单个枚举值(“Sweet Home”为1,“Farm”为2等)。

然后可以使用位掩码完成多个选项复选框(如果值太多,则不必使用内置数据库)。

如果选择足够大的枚举器/位掩码值(无符号32位int将执行400万个枚举器和32位掩码)。每个填写'Form'的每个'Division'可以是一个单独的行 - 但所有部门的值列都相同。

Surveys
------------------------------------------
|  ID  | User | Division |  Value        |
------------------------------------------
|   1  | 1    | 1        |       7       |
|   2  | 1    | 2        |    234234     |
|   3  | 2    | 1        |       7       |
|   4  | 2    | 2        |  23491032     |
------------------------------------------

因此,在此示例中,User用于填充表单的每次运行,Division用于每个分区/组/块,Value将是所选互斥值的枚举器或用于多选的bitswap。

通过一些聪明的OOP包装,您可以通过一个漂亮的API接口和一个代表所有数据的单个4列表来使这项工作发挥作用。如果您愿意,可以删除ID列,而使用User和Division的复合键。