数据库中用户与购买之间的关系

时间:2015-03-14 20:50:13

标签: database-design

我对数据库设计比较陌生,而且我对某个概念有点麻烦 -

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

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

用户:

enter image description here

产品:

enter image description here

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

enter image description here

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

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

enter image description here

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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您的第一个建议是许多人决定做的事情。 UserProductAssociationtable,每个用户 - 产品关联都有一行,其中FK是用户和产品表。

答案 1 :(得分:1)

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

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

通过这种方式,您可以使用purchase表来查找用户使用UserID拥有的产品,或者哪些用户拥有某种产品。

答案 2 :(得分:1)

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

如果你帮助它们,关系数据库管理系统不会每次都扫描整个表。由于关联表的主键是(user_id, product_id)对,这不是真正有用的,因此您可以在每个关联列user_idproduct_id上创建索引。可以这样考虑:单个用户不太可能占到关联表中所有行的5%以上,并且索引将允许RDBMS快速将搜索范围缩小到O(例如O)中的相关行(记录时间。如果您有十亿用户,则只需要数据库大约30个步骤来查找给定用户购买的产品的行。

索引会增加开销,所以不要把它们放到任何地方!如果你想了解更多关于利弊的话,Postgres documentation对索引有很好的讨论。