Database design 如何改进我的数据库,使之更具关系性-SQL&;PHP

Database design 如何改进我的数据库,使之更具关系性-SQL&;PHP,database-design,database-schema,erd,Database Design,Database Schema,Erd,我正在使用PHP和数据库制作一个订购系统。数据库有2个表,1个保存所有产品,1个保存通过php网站下的所有订单。 产品 productID (PK)| productName | productPrice 1 | DVD | 5.99 2 | CD | 2.99 命令 ID (PK) | orderID(PK) | productID(PK/FK) | productName | quantity | Produ

我正在使用PHP和数据库制作一个订购系统。数据库有2个表,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
使用从Products表获取数据的表单将新订单插入表中,并在提交时插入。我有一个问题,如果我要更新产品表中的a产品名称,订单表中的产品名称不会更新

根据我收集的信息,我还需要实现一个OrdersProducts表,如下所示

orderID | productID

我需要做些什么才能使每次下订单时,orderID和productID都进入此表?

您的设计缺少一些东西:

首先:您的订单表应该只包含
order\u id
order\u date
,以及客户数据,如
customer\u id


第二:您必须填写one
OrdersProducts
表,因为您的订单可能有很多一种产品,而且您还应该在其中输入以下字段:
orderID
productID
数量
ProductPrice
,但您不应该在该表中输入
productName
,您仅通过其id引用产品。此外,您可以从该表中删除<代码>产品价格> /代码>,在产品< /代码>表中考虑此价格,但如果每个客户的产品价格发生变化,则可能需要此字段。

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

首先:您的订单表应该只包含
order\u id
order\u date
,以及客户数据,如
customer\u id

第二:您必须填写one
OrdersProducts
表,因为您的订单可能有很多一种产品,而且您还应该在其中输入以下字段:
orderID
productID
数量
ProductPrice
,但您不应该在该表中输入
productName
,您仅通过其id引用产品。此外,您可以从该表中删除<代码>产品价格> /代码>,在产品表中考虑此价格,但如果每个客户的产品价格发生变化,则可能需要此字段。

产品:

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
您不需要额外的表,除非您需要存储有关订单的额外信息。您的“订单”表或多或少是一个“行项目”表。这是正常的,包括购买时的产品名称和价格的副本,这样你可以回去看看

您可以使用所谓的“触发器”在每个操作之后插入到表中,如中所述

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

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;
原因是您可能无法在插入到行项目表时自动确定要自动插入到订单表中的内容。

产品:

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
您不需要额外的表,除非您需要存储有关订单的额外信息。您的“订单”表或多或少是一个“行项目”表。这是正常的,包括购买时的产品名称和价格的副本,这样你可以回去看看

您可以使用所谓的“触发器”在每个操作之后插入到表中,如中所述

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

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;

原因是,在插入到行项目表时,您可能无法自动确定要自动插入到orders表中的内容。

插入后触发器是您要查找的for@sagi那么在将orderid productid插入ordersProducts之后?类似的东西?你可以在这里读到:或者这里:“我有个问题……”问题是什么?在设计这样的数据库时,最好从一个开始到一个更好的解决方案结束for@sagi那么在将orderid productid插入ordersProducts之后?类似的东西?你可以在这里读到:或者这里:“我有个问题……”问题是什么?在设计这样的数据库时,最好以一个更好的解决方案开始,以一个更好的解决方案结束。谢谢@BillieThompson这很有帮助!谢谢你@BillieThompson这很有帮助!感谢您的建议@goudelalfythanks@goudelalfy