数据库中用户和购买的关系

Relationship between User and Purchases in a Database

我是数据库设计的新手,对某个概念有点困惑-

根据我的了解,关系数据库应该始终将信息分开,并且永远不会有重复的信息。

我正在创建一个用户可以购买产品的简单网站。两个 table 可能看起来像这样:

用户:

产品:

如何在这两个 table 之间建立关系,以便多个用户可以在不使用数组的情况下拥有相同的产品?我想到的唯一解决方案是创建第三个 table 称为 "UserOwnership" 或类似的东西,每个 user_id 都有一个外键,每个 product_id 对应一个外键].但是,我认为这不是一个好主意,因为所有用户在庞大的数据库中都会有无组织的条目,如下所示。

例如,user1 拥有 product1product2。但是,所有其他后续用户都存储在同一个 table 中,我认为如果用户足够多,这会变得混乱且无法使用。

我的另一个解决方案是使用与产品 ID 相对应的每个用户的信息列表,例如:

user1 拥有 product1 product2product3。这似乎很好用,但它违反了在一个单元格中存储多个值的规则。

我该如何解决这个问题?

你的第一个建议是很多人决定做的。一个 UserProductAssociationtable,每个用户-产品关联都有一行,FK 指向用户和产品 table。

在处理购买的情况下,您很可能希望跟踪交易的详细信息,例如时间、用户帐户、产品、支付金额等。因为购买与用户或产品本身,他们可以有自己的 table 主键为订单号,或由用户 ID 和产品 ID 组成的组合键(假设每个用户只能购买一次相同的产品)

http://i.stack.imgur.com/3qkPH.png

这样您就可以使用购买 table 来查找使用 UserID 的用户拥有哪些产品,或者哪些用户拥有特定产品。

像您一样使用关联是一个很好的解决方案,性能应该没问题。

关系数据库管理系统 没有 每次扫描整个 table 如果你帮助他们。由于关联 table 的主键是 (user_id, product_id) 对,这不是很有用,您可以在每个关联列 user_idproduct_id 上创建索引.可以这样想:单个用户不太可能占关联中所有行的 5% 以上 table,并且索引将允许 RDBMS 快速将搜索范围缩小到仅在关联中的相关行类似于 O(log n) 时间。如果您有 10 亿用户,数据库只需大约 30 个步骤即可找到给定用户购买的产品行。

索引确实会增加开销,所以不要将它们放在各处!如果您想了解更多关于索引的优缺点,Postgres documentation 对索引进行了精彩的讨论。