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

Mysql 从数据库生成HTML表单并将值存储到数据库中,mysql,database,database-design,normalization,entity-attribute-value,Mysql,Database,Database Design,Normalization,Entity Attribute Value,我有一个“t_表单”表和一个“t_属性”表。它看起来有点像下面 表格 form_id | form_name | description ----------------------------------- 1 | Laptop | Possible attributes are Model, Screen Size, OS, Cd Player 2 | Mobile | Possible attributes are Model, OS

我有一个“t_表单”表和一个“t_属性”表。它看起来有点像下面

表格

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
form_id | attribute_id
----------------------
1       | 1 
1       | 2
1       | 3
1       | 4
2       | 2
2       | 2
3       | 2
3       | 2
3       | 2
属性表

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
form_id | attribute_id
----------------------
1       | 1 
1       | 2
1       | 3
1       | 4
2       | 2
2       | 2
3       | 2
3       | 2
3       | 2
  • 笔记本电脑类型的可能属性包括型号、屏幕大小、操作系统、Cd播放器
  • 移动表单类型的可能属性是Model、OS
  • Tablet表单类型的可能属性包括型号、屏幕大小和操作系统
  • 表单_属性表

    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
    
    form_id | attribute_id
    ----------------------
    1       | 1 
    1       | 2
    1       | 3
    1       | 4
    2       | 2
    2       | 2
    3       | 2
    3       | 2
    3       | 2
    
    我将根据用户从数据库中选择的表单类型(笔记本电脑、手机或平板电脑)生成如下HTML表单(带有表单字段)

    笔记本电脑:

    对于移动设备:

    对于平板电脑:

    问题: 以下是我的问题

  • 将用户输入的数据存储到数据库中的更好方法是什么
  • 从数据库中检索数据的更好方法是什么,因为我想实现过滤器选项,例如:我想获取笔记本电脑屏幕大小在14到16之间的结果
  • 过滤器:


    请提供一个可行的解决方案和一些例子,以便更好地理解我,并帮助我实现这一点。

    我认为你可以选择这样的表格

    表单\属性\值或项目

    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
    
    通过这种方式,您可以查询输入的单个项目,还可以按表单、属性或属性值进行筛选

    表单属性表将非常方便地为特定表单生成表单(即,当用户想要输入笔记本电脑或移动电话时)

    Items表将是插入后存储项目的位置,或者是查询项目的位置

    如果数据将由多个用户填充,您还可以在项目保存时在末尾添加要存储的时间戳列和用户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
                          )
    

    我想你可以选一张像这样的桌子

    表单\属性\值或项目

    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
    
    通过这种方式,您可以查询输入的单个项目,还可以按表单、属性或属性值进行筛选

    表单属性表将非常方便地为特定表单生成表单(即,当用户想要输入笔记本电脑或移动电话时)

    Items表将是插入后存储项目的位置,或者是查询项目的位置

    如果数据将由多个用户填充,您还可以在项目保存时在末尾添加要存储的时间戳列和用户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
                          )
    

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


    如果您使用的是关系模型,则表示上面的答案1最适合。

    假设您的表单字段属性在增长,则表示可以使用JASON数据格式将此记录存储到非关系数据库(如MongoDB)中。然后您可以轻松地查询MongoDB Jason数据


    如果您使用的是关系模型,则表示上述答案1最适合。

    关于性能,我要问这个问题。表“Form_Attribute_Values”的“value”字段肯定是char/varchar类型的,因为它包含许多类型的值,例如INT表示屏幕大小,varchar表示模型。如果我将“屏幕大小”存储为一个单独的列,则获取时间将非常快,因此如何获得更高的性能。我认为,如果要在该表中输入数百万行,我们应该担心性能。如果您希望只有几千个项目/属性,那么您不必太担心。您是对的,数字字段的速度会更快,但是您必须为不同类型的值管理不同的列。查询的最佳解决方案是创建一个完全不同的表结构,每个属性有一个列(然后您可以自由地定义正确的数据类型),但这也意味着填充和维护该表。你准备好了吗?:)感谢您的回复,是的,这是一个商业项目,在未来将有超过数百万行。你能提出更好的数据库设计方法吗?你能用一些示例数据告诉我吗,我不太清楚。告诉我对于表单类型laptop的条目,我想在数据库中存储数据(类型laptop表单的可能属性是型号、屏幕大小、操作系统、Cd播放器)。如何按照第二种方法将其存储在表中?einterview如果要处理数百万行,您需要的不仅仅是StackOverflow。也就是说,为了便于查询,您需要的是一个维度模型。我建议您从Kimball Data Warehouse Toolkit这本书开始,它将为您打开一个关于性能的全新世界,我要问这个问题。表“Form_Attribute_Values”的“value”字段肯定是char/varchar类型的,因为它包含许多类型的值,例如INT表示屏幕大小,varchar表示模型。如果我将“屏幕大小”存储为一个单独的列,获取时间将非常快,那么如何获得更高的性能呢