【发布时间】:2011-08-12 14:56:42
【问题描述】:
我正在开发在线购物系统。
这是产品结构的工作原理:
有很多类别..
每个类别都有项目数。
每个项目都有一个或多个选项
一个选项可以有额外的或没有额外的
我有以下表格:
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、“谷歌”
物品表:
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、“带包”、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'];
}
}
?>
当我想删除一个项目并包括选项时,我使用与上面类似的 php 代码。
编辑:忘记添加选项表
编辑:更新了一些数据示例。
【问题讨论】:
-
你错过了选项表吗?
-
对不起,我忘了补充。刚刚更新了我的问题。谢谢!
-
您能否详细说明 options 和 extras 表实际存储的内容?什么样的信息?也许给我们一个表格中一些项目的例子。具体来说,我感兴趣的是一对一、一对多和多对多的关系。
-
这对codereview来说真的很像
-
@Tyler,我刚刚添加了一些示例,请参阅更新后的问题。谢谢
标签: php sql database database-design data-structures