从数据库生成HTML表单并将值存储到数据库中

时间:2013-10-23 12:02:08

标签: mysql database database-design normalization entity-attribute-value

我有一个“t_form”表和一个“t_attribute”表。它看起来有点像下面。

表单

form_id | form_name    | description
-----------------------------------
1       | Laptop       | Possible attributes are Model, Screen Size, OS, Cd Player
2       | Mobile       | Possible attributes are Model, OS
3       | Tablet       | Possible attributes are Model, Screen size, OS

属性表

attribute_id | attribute
------------------------
1            | Model
2            | Screen Size
3            | OS
4            | Cd Player
  1. 笔记本电脑形式的可能属性包括型号,屏幕尺寸,操作系统,CD播放器。
  2. Mobile表单类型的可能属性是Model,OS。
  3. Tablet表单类型的可能属性是Model,Screen size,OS。
  4. Form_Attribute表

    form_id | attribute_id
    ----------------------
    1       | 1 
    1       | 2
    1       | 3
    1       | 4
    2       | 2
    2       | 2
    3       | 2
    3       | 2
    3       | 2
    

    我将根据用户从数据库中选择的表单类型(笔记本电脑,手机或平板电脑)生成如下所示的HTML表单(带表单字段)。

    适用于笔记本电脑:

    enter image description here

    适用于移动设备:

    enter image description here

    对于平板电脑:

    enter image description here

    问题: 这是我的问题。

    1. 将用户输入的数据存储到数据库中的最佳方法是什么。
    2. 从数据库中检索数据有什么更好的方法,因为我想实现过滤器选项例如:我想获取笔记本电脑屏幕尺寸可从14到16获取的结果
    3. 过滤

      enter image description here

      请提供一个可行的解决方案,并提供一些示例,以便更好地了解我并帮助我实现这一目标。

2 个答案:

答案 0 :(得分:3)

我认为你可以选择像

这样的表格

Form_Attribute_Values或Items

item_id |    form_id | attribute_id | value
------------------------------------------------
1       |    1       | 1            |  SuperLap
1       |    1       | 2            |  15
1       |    1       | 3            |  MS-DOS 6
1       |    1       | 4            |  Toshiba

通过这种方式,您可以查询输入的单个项目,还可以按表格,属性或属性值进行过滤。

Form_Attribute表格非常方便,可以生成特定表格的表格(即当用户想要输入笔记本电脑或手机时)。

Items表格将是您在插入后存储项目的位置或您要查询它们的位置。

您还可以在最后添加一个时间戳列,以便在项目保存时存储,如果您的数据将由多个用户填充,则添加User_id列。如果您可以存储商店中没有的商品,或者您可以将可用性保存在单独的表格中,也可以使用额外的可用列。

如果您可以从过滤表单中获取表单和属性ID,则对屏幕尺寸为14-16的笔记本电脑的查询将如下所示:

    SELECT item_id, 
           form_name, 
           attribute_name,
           value
INNER JOIN form 
        ON item.form_id = form.form_id 
INNER JOIN attribute 
        ON item.attribute_id = attribute.attribute_id 
     WHERE item_id IN (-- here I select for Laptop and Screen Size dimension
                       SELECT item_id 
                         FROM item
                        WHERE form_id = 1
                          AND attribute_id = 2
                          AND item.value BETWEEN 14 and 16
                      )

否则你需要更复杂的东西:

    SELECT item_id
      FROM item
INNER JOIN form 
        ON item.form_id = form.form_id 
INNER JOIN attribute 
        ON item.attribute_id = attribute.attribute_id 
     WHERE item_id IN (-- here I select for Laptop and Screen Size dimension
                       SELECT item_id 
                         FROM item
                        WHERE form_id = (-- but first I need the form_id 
                                         -- for Laptop
                                         SELECT form_id 
                                           FROM form 
                                          WHERE form_name = 'Laptop')
                          AND attribute_id = (-- then I need the attribute_id 
                                              -- for Screen Size
                                              SELECT attribute_id 
                                                FROM attribute 
                                               WHERE attribute_name = 'Screen Size')
                          AND item.value BETWEEN 14 and 16
                      )

答案 1 :(得分:1)

假设表单字段的属性正在增长,那么很容易使用JASON数据格式将此记录存储到像MongoDB这样的非关系数据库中。然后,您可以轻松查询MongoDB Jason数据。

如果您使用关系模型意味着上面的答案1最适合。