如何在数据库中存储复选框/下拉列表?

时间:2011-09-05 11:31:10

标签: mysql sql database database-design

请参阅下面的UI设计:

enter image description here

一个项目可以有多于一组的复选框和/或下拉列表,如何将这些数据存储在数据库中?

我想出了这个数据库设计:

items表:

+----+--------------+
| id | name         |
+----+--------------+
|  1 | Plain Burger |
+----+--------------+

extra_group表:

+----+---------+--------+--------------------+--------------+
| id | item_id | name   | description        | control_type |
+----+---------+--------+--------------------+--------------+
|  1 |       1 | Sauces |                    | checkboxes   |
|  2 |       1 | extras | Choose your extras | dropdown     |
+----+---------+--------+--------------------+--------------+

最后extras表:

+----+----------------+------------------+------+
| id | extra_group_id | value            | cost |
+----+----------------+------------------+------+
|  1 |              1 | with Kitchup     | 0.00 |
|  2 |              1 | with Mayo        | 0.00 |
|  3 |              2 | with Boiled Rice | 0.00 |
|  4 |              2 | with Chips       | 0.00 |
+----+----------------+------------------+------+

这是正确的数据库设计方式还是可以改进的方法?

由于

3 个答案:

答案 0 :(得分:2)

看起来不错, 我倾向于在item和extra_group之间添加一个表(并从extra_group中删除item_id)

item_extra_group表:

+---------+----------------+
| item_id | extra_group_id | 
+---------+----------------+
|  1      | 1              | 
|  1      | 2              | 
+---------+----------------+

这将使您能够建立多对多关系的模型, 正如我猜你会有很多重复的extra_groups例如(芝士汉堡,培根汉堡)可能会有相同的额外内容?

答案 1 :(得分:1)

那个设计很好。你使用third normal form,这是做这种事情的公认方式。

答案 2 :(得分:1)

以下是您应该做的调整设计的方法,现在非常好,但可以略微改进:

items表:

+----+--------------+ 
| id | name         | 
+----+--------------+ 
|  1 | Plain Burger | 
+----+--------------+ 

extra_group表:

+----+---------+--------+--------------------+--------------+ 
| id | item_id | name   | description        | control_type | 
+----+---------+--------+--------------------+--------------+ 
|  1 |       1 | Sauces |                    | checkboxes   | 
|  2 |       1 | extras | Choose your extras | dropdown     | 
+----+---------+--------+--------------------+--------------+ 

options,如下所示:

+-----------+------------------+------+ 
| option_id | description      | cost | 
+-----------+------------------+------+ 
|  10       | with Kitchup     | 0.00 | 
|  11       | with Mayo        | 0.00 | 
|  12       | with Boiled Rice | 0.00 | 
|  13       | with Chips       | 0.00 | 
+----+------+------------------+------+ 

已修改 extras表:

+----+----------------+-----------+
| id | extra_group_id | option_id |
+----+----------------+-----------+ 
|  1 |              1 |        10 |
|  2 |              1 |        11 |
|  3 |              2 |        12 | 
|  4 |              2 |        13 | 
+----+----------------+-----------+

此设计采用3NF格式,可以使您的数据维护更加简单,并避免额外项目定价不一致的问题。