如何改进我的数据库以使其更具关系性 - SQL & PHP

How to improve my database to be more relational - SQL & PHP

我正在使用 PHP 和数据库制作一个订购系统。数据库有 2 个 table,其中 1 个包含所有产品,1 个包含通过 php 网站发出的所有订单。 产品

productID (PK)| productName | productPrice
1             | DVD         | 5.99
2             | CD          | 2.99

订单

ID (PK) | orderID(PK) | productID(PK/FK) | productName | quantity | ProductPrice
1       | 1           | 1                | DVD         | 1        | 5.99
2       | 1           | 2                | CD          | 2        | 5.98

正在使用从产品 table 获取数据的表单将新订单插入 table 并在提交时插入。我有一个问题,如果我要更新产品 table 中的产品名称,订单 table 中的产品名称不会更新。

此外,根据我收集到的信息,我还需要像这样实施 OrdersProducts table

orderID | productID

我需要做什么才能在每次下订单时将 orderID 和 productID 放入此 table?

您的设计遗漏了一些东西:

首先:您的订单 table 应仅包含 order_idorder_datecustomer_id

等客户数据

其次:你必须做OrdersProducts table,因为你的订单可能有很多一个产品,你也应该把这些字段放在里面:orderID, productID, quantity, ProductPrice 但你不应该把 productName 放在这个 table 中,你只能通过它的 id 引用产品。您也可以从此 table 中删除 ProductPrice 并在 Products table 中考虑此价格,但如果您的产品价格针对每个客户发生变化,您可能需要此字段。

产品:

productID (PK)| productName | productPrice
1             | DVD         | 5.99
2             | CD          | 2.99

订单项:

ID (PK) | orderID(FK) | productName | quantity | productPrice
1       | 1           | DVD         | 1        | 5.99
2       | 1           | CD          | 2        | 5.98

订单:

ID (PK) | some other fields - maybe some order time details?
1       | some other data

您不需要额外的 table,除非您需要存储有关订单的额外信息。您的 "Orders" table 或多或少是 "Line Items" table。这在购买时附上产品名称和价格的副本是正常的,以便您返回查看。

您可以使用所谓的 "trigger" 在每个操作后插入 tables,这在 mysql manual.

中有描述

但是我建议改为使用事务将多个命令转换为单个原子插入

START TRANSACTION;
INSERT INTO Orders (ID, someotherfields) VALUES (1, etc); 
INSERT INTO LineItems (ID, orderID, productName, quantity, productPrice) VALUES (1, 1, "DVD","5.99");
COMMIT;

原因是您可能无法在插入订单项 table.

时自动确定要自动插入到订单 table 中的内容