购物车表 - 反馈数据库设计

时间:2011-04-25 21:45:31

标签: php sql database database-design data-structures

我正在开发在线购物系统。

这就是产品结构的工作方式:

有多个类别..

每个类别都有多个项目。

每个项目都有一个或多个选项

选项可以有额外的(或)没有额外的(s)

我有以下表格:

mysql> desc categories;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| cat_id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| company_id | int(11)      | NO   |     | NULL    |                |
| name       | varchar(100) | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

例如:12,2,“Google”

项目表:

mysql> desc items;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| item_id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| cat_id      | int(11)      | NO   |     | NULL    |                |
| name        | varchar(150) | NO   |     | NULL    |                |
| description | varchar(150) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

例如:2,12,“第1项”,“描述...... 1”

例如:3,12,“第2项”,“描述...... 2”

选项表

mysql> desc items_options;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| option_id | int(11)      | NO   | PRI | NULL    | auto_increment |
| item_id   | int(11)      | NO   |     | NULL    |                |
| name      | varchar(150) | NO   |     | NULL    |                |
| price     | decimal(6,2) | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

例如:45,2,“常规”,“2.20”

例如:46,3,“小”,“1.20”

例如:47,3,“大”,“2.20”

附加表:

mysql> desc items_options_extras;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| extra_id  | int(11)      | NO   | PRI | NULL    | auto_increment |
| option_id | int(11)      | NO   |     | NULL    |                |
| name      | varchar(150) | NO   |     | NULL    |                |
| price     | decimal(6,2) | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

例如:64,47,“With Bag”,0.10“

这是一个很好的数据库设计吗?有什么可以改进的?

我没有创建关系表,这是必要的吗?如果是这样,我不知道如何创建关系表。

目前我使用多个SELECT查询来获取这些表之间的关系,如下所示:

<?php
$q =  mysql_query("SELECT item_id, name FROM items where cat_id = '3'");
while($row = mysql_fetch_assoc($q)) {
     echo $row['name'];
     $q2 = mysql_query("SELECT price FROM items_options_extras where item_id =" . $row['item_id']);
        while($row2 = mysql_fetch_assoc($q2))
            echo $row2['price'];
        }
}
?>

当我想删除一个Item并包含选项时,我使用类似上面的php代码。

编辑:忘记添加选项表

编辑:更新了一些数据示例。

1 个答案:

答案 0 :(得分:5)

考虑一个项目可能属于多个类别。

enter image description here

以下是需要考虑的事项:

  • 如果项目的价格随类别而变化,则ItemPrice列将进入CategoryItems表。如果没有,它将进入Items表。
  • 如果选项的价格随项目而变化,则OptionPrice列将进入ItemOptions表。如果没有,它将进入Option表。