我对数据库设计比较陌生,而且我对某个概念有点麻烦 -
根据我所了解的情况,关系数据库应始终将信息分开,并且永远不会有重复的信息。
我正在创建一个用户可以购买产品的简单网站。这两个表可能看起来像这样:
用户:
产品:
如何在这两个表之间建立关系,以便多个用户可以在不使用数组的情况下拥有相同的产品?我想到的唯一解决方案是创建一个名为" UserOwnership"或类似的东西,每个user_id
的外键对应于每个product_id
的外键。但是,我并不认为这是一个好主意,因为所有用户都会在大型数据库中拥有无组织的条目,如下所示。
例如,user1
拥有product1
和product2
。但是,所有其他后续用户都存储在同一个表中,我认为这对于足够多的用户来说会变得混乱和无法使用。
我的另一个解决方案是使用与产品ID相对应的每个用户的信息列表,例如:
user1
拥有product1
product2
和product3
。这似乎很有效,但它违反了在一个单元格中存储多个值的规则。
我该如何解决这个问题?
答案 0 :(得分:2)
您的第一个建议是许多人决定做的事情。 UserProductAssociationtable,每个用户 - 产品关联都有一行,其中FK是用户和产品表。
答案 1 :(得分:1)
在您处理购买的情况下,您很可能希望跟踪交易的详细信息,例如时间,用户帐户,产品,已付金额等。因为购买与用户分开或者产品本身,他们可以拥有自己的表,其中包含订单号的主键,或者由用户ID和产品ID组成的复合键(假设每个用户只能购买一次相同的产品)
http://i.stack.imgur.com/3qkPH.png
通过这种方式,您可以使用purchase表来查找用户使用UserID拥有的产品,或者哪些用户拥有某种产品。
答案 2 :(得分:1)
使用像您这样的关联是一个很好的解决方案,性能应该没问题。
如果你帮助它们,关系数据库管理系统不会每次都扫描整个表。由于关联表的主键是(user_id, product_id)
对,这不是真正有用的,因此您可以在每个关联列user_id
和product_id
上创建索引。可以这样考虑:单个用户不太可能占到关联表中所有行的5%以上,并且索引将允许RDBMS快速将搜索范围缩小到O(例如O)中的相关行(记录时间。如果您有十亿用户,则只需要数据库大约30个步骤来查找给定用户购买的产品的行。
索引会增加开销,所以不要把它们放到任何地方!如果你想了解更多关于利弊的话,Postgres documentation对索引有很好的讨论。