【问题标题】:What is the best way to insert many checkbox inputs into database?将许多复选框输入插入数据库的最佳方法是什么?
【发布时间】:2012-10-26 14:30:12
【问题描述】:

您好,

我有一个表单,它有近 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 多个复选框的大组来说效率不高。所以我更喜欢制定一种将在应用程序中实现的方式

如果您有任何建议或更好的方法,请随时告诉。 非常感谢

【问题讨论】:

    标签: database forms checkbox bit-manipulation


    【解决方案1】:

    判断

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

    这表明只能选择一个选项,因此这组复选框可以表示为单个枚举值(1 代表“甜蜜的家”,2 代表“农场”,等等)。

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

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

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

    因此,在此示例中,User 代表正在填写的表格的每次运行,Division 代表每个部门/组/块,Value 将是所选互斥值的枚举器或用于多项选择的位交换。

    通过一些巧妙的 OOP 包装,您可以通过一个漂亮的 API 接口和一个代表所有数据的 4 列表来使这项工作成为您的优势。如果您愿意,可以删除 ID 列并使用 User 和 Division 的复合键。

    【讨论】:

    • 非常感谢您的回答,请花点时间检查一下。
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多