连接表的替代品?

时间:2015-10-09 09:01:29

标签: mysql database database-design many-to-many relational-database

我正在设计一个关系数据库表,用于存储有关我需要存储的电子商务场景的数据

  • 用户购买的产品列表
  • 购买特定产品的用户列表。

它有多对多的关系。


到目前为止,我只能想到这样做 创建一个存储订单的表格

    table recordorders(
       userID // foreign key from users table
       productID, // foreign key from products table
       dateofpurchase,
       quantity,
       price_per_unit,
       total_amount
    )

它就像一个交接表。

这是一个很好的方法,还有除联结表之外的任何其他方法,这些方法对于查询更有效和高效吗?

2 个答案:

答案 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;