我正在设计一个关系数据库表,用于存储有关我需要存储的电子商务场景的数据
它有多对多的关系。
到目前为止,我只能想到这样做
创建一个存储订单的表格
table recordorders(
userID // foreign key from users table
productID, // foreign key from products table
dateofpurchase,
quantity,
price_per_unit,
total_amount
)
它就像一个交接表。
这是一个很好的方法,还有除联结表之外的任何其他方法,这些方法对于查询更有效和高效吗?
答案 0 :(得分:1)
你的子弹描述了两张桌子,而不是一张。您的联结表未正确描述为两个列表。它是一组订单信息行。您提供的联结表包含“user [userID]在...上购买产品[productID]”的行。即它记录订单信息。 (订单的用户,产品,日期等的组合。)给定用户或产品,您可以通过查询订单信息表获得相应的项目符号表。
但是,您的表可能需要另一个列,该列是唯一的订单ID。否则,它无法记录所有这些列中有两个相似的订单。 (例如,如果同一个人在相同的日期以相同的数量,价格和总数购买相同的产品。)即它的行可能与订单不是1:1。这就是为什么我上面称它为订单信息表而不是订单表。它记录了某些订单具有这些属性;但如果可以订购具有相同信息的订单,则不会记录不同的订单。它实际上是一个多对多的(对于每一列)关联。这就是为什么订单ID被选为订单的唯一名称作为进一步的信息。这个新表将被称为实体表,而不是结点或关联表。它保存“按顺序[id]用户[用户]购买...”的行。
PS 订单通常可以表示为订单行<的订单ID,用户,集之间/之间/之间的关联/ em>(产品,数量,价格和总额)和其他东西(日期,总计等)。订单通常通过订单ID上的订单实体表及其用户,日期等以及订单ID上的订单行关联表及其订单行信息进行关联特征。
PPS现在是时候阅读有关信息建模和数据库设计的书了。
答案 1 :(得分:1)
您不会将这两件事“存储”在表格中(交汇处或其他方式),您可以从原始(“事实”)数据中发现它们:
使用您建议的表格:
用户购买的产品清单:
SELECT productID
FROM recordorders
WHERE userID = 123;
购买特定产品的用户列表:
SELECT userID
FROM recordorders
WHERE productID = 987;