【问题标题】:Shopping Cart tables - Feedback Database Design购物车表 - 反馈数据库设计
【发布时间】: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


【解决方案1】:

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

以下是需要考虑的事项:

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

【讨论】:

  • 我同意这种布局。我唯一的问题是一个项目是否属于一个类别或多个。但是你打破关系似乎是合乎逻辑的,当然也是正常化的。伟大的工作。
  • 良好的布局,但在我的商业模式中,项目只属于一个类别。我清楚地从您的布局中理解,但我会有数千个不同的选项名称。我想你也许可以更新你的布局以遵循我的表格设计?
  • @User,如果一个项目只属于一个类别,那么您只需删除到 CategoryItems 表并在 Items 表中放置一个 CategoryId (FK)。无论您是否有数千个不同的选项名称,都需要 OptionExtra 来规范化您的表,这是最佳实践。
  • @user622378 - 你问你的数据库设计有什么可以改进的。我提出的设计规范化得更好。
  • @user622378 我学到了一个艰难的方法,即一对多关系很快就会变成多对多,并且以后更改数据库要困难得多。所以我建议您将 CategoryItems 表添加到您的设计中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2012-02-25
  • 2015-01-26
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多