结 table 的替代品?

Alternatives to junction table?

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

它是多对多关系。


到目前为止,我只能想到这样做。
创建一个 table 用于存储订单

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

它将像一个路口 table。

这是一个好方法吗?还有比联结 table 更有效和高效的查询方法吗?

您的子弹描述了两个 table,而不是一个。您的联结点 table 未正确描述为两个列表。它是一组订单信息行。您提供的交汇点 table 包含 "user [userID] purchased product [productID] on ..." 处的行。即它记录订单信息。 (订单的用户、产品、日期等的组合。)给定一个用户或产品,可以通过查询订单信息table.

得到对应的子弹table

但是您的 table 可能需要另一列作为唯一订单 ID。否则它无法记录在所有这些列中有两个相似的订单。 (例如,如果同一个人在同一日期以相同的数量、价格和总数购买相同的产品。)即它的行可能不包含订单 1:1。这就是为什么我在上面将其称为订单信息 table 而不是订单 table。它记录了某些订单具有这些属性;但如果可以有具有相同信息的订单,它不会记录不同的订单。它实际上是一个多对多等(对于每一列)关联。这就是为什么选择订单 ID 作为订单的唯一名称作为进一步信息的原因。这个新 table 将被称为实体 table,而不是结点或关联 table。它包含 "in order [id] user [user] purchased ...".

PS 一个 order 通常可以被描述为关联 on/among/between order id, user, set 订单行 (产品、数量、价格和总计),以及其他内容(日期、总计等)。订单的关系特征通常是订单实体 table 的订单 ID 及其用户、日期等加上订单行关联 table 订单 ID 及其订单行信息。

PPS是时候读一本关于信息建模和数据库设计的书了。

你不会 "store" table(交汇处或其他)中的那两个东西,你会从原始 ("Fact") 数据中发现它们:

使用您建议的 table:

用户购买的产品列表:

SELECT productID
    FROM recordorders
    WHERE userID = 123;

购买特定产品的用户列表:

SELECT userID
    FROM recordorders
    WHERE productID = 987;