2

我有一个“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. 移动表单类型的可能属性是模型、操作系统。
  3. Tablet 形式的可能属性是型号、屏幕尺寸、操作系统。

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 表单(带有表单字段)。

对于笔记本电脑:

在此处输入图像描述

对于手机:

在此处输入图像描述

对于平板电脑:

在此处输入图像描述

问题: 这是我的问题。

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

筛选:

在此处输入图像描述

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

4

2 回答 2

3

我想你可以去一张像

Form_Attribute_Values 或项目

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或Attribute Value进行过滤。

您的 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
                      )
于 2013-10-23T12:40:09.473 回答
1

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

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

于 2013-10-23T18:05:58.240 回答