Database design 数据库中用户和购买之间的关系

Database design 数据库中用户和购买之间的关系,database-design,Database Design,我对数据库设计还比较陌生,对某个概念有点不太熟悉- 据我所知,关系数据库应该始终具有分离的信息,并且永远不会有重复的信息 我正在创建一个简单的网站,用户可以在其中购买产品。这两个表可能如下所示: 用户: 产品: 如何在这两个表之间建立关系,以便多个用户可以在不使用数组的情况下拥有相同的产品?我认为唯一的解决方案是创建第三个名为“UserOwnership”或类似的表,每个用户id都有一个外键,对应于每个产品id的外键。然而,我认为这不是一个好主意,因为所有用户在一个庞大的数据库中都会有无组织

我对数据库设计还比较陌生,对某个概念有点不太熟悉-

据我所知,关系数据库应该始终具有分离的信息,并且永远不会有重复的信息

我正在创建一个简单的网站,用户可以在其中购买产品。这两个表可能如下所示:

用户:

产品:

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

例如,
user1
同时拥有
product1
product2
。但是,所有其他后续用户都存储在同一个表中,我认为如果有足够多的用户,这将变得混乱和不可用

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

user1
拥有
product1
product2
product3
。这看起来效果不错,但它违反了在一个单元格中存储多个值的规则


如何解决这个问题?

你的第一个建议是许多人决定做什么。一个UserProductAssociationtable,每个用户产品关联对应一行,用户和产品表对应FK。

您的第一个建议是许多人决定做什么。UserProductAssociationtable,每个用户产品关联对应一行,用户和产品表对应FK。

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


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

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


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

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

如果您帮助关系数据库管理系统,那么它不必每次都扫描整个表。由于关联表的主键将是一对
(user\u id,product\u id)
,这不是真正有用的,因此您可以在每个关联列
user\u id
product\u id
上创建索引。这样想:单个用户不太可能占据关联表中所有行的5%以上,索引将允许RDBMS在O(logn)时间内快速缩小搜索范围,仅搜索相关行。如果您有10亿用户,那么数据库只需要大约30个步骤就可以找到给定用户购买的产品的行


索引确实会增加开销,所以不要把它们放在任何地方!如果您想了解更多的优点和缺点,可以对索引进行极好的讨论。

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

如果您帮助关系数据库管理系统,那么它不必每次都扫描整个表。由于关联表的主键将是一对
(user\u id,product\u id)
,这不是真正有用的,因此您可以在每个关联列
user\u id
product\u id
上创建索引。这样想:单个用户不太可能占据关联表中所有行的5%以上,索引将允许RDBMS在O(logn)时间内快速缩小搜索范围,仅搜索相关行。如果您有10亿用户,那么数据库只需要大约30个步骤就可以找到给定用户购买的产品的行


索引确实会增加开销,所以不要把它们放在任何地方!如果您想了解更多的优点和缺点,我们对索引进行了极好的讨论。

据我所知,除了在两个表之间使用关系表之外,没有其他解决方案,因为用户表和产品表具有多对多关系。在DB设计中,当您有这种关系时,应该有第三个表来链接它们。我不会推荐你的第二个解决方案,因为它是一个糟糕的设计。例如:如果查询用户拥有product_id=2的所有用户,则第二个设计的效率将低于第一个设计。据我所知,没有其他解决方案,只能在两个表之间使用关系表,因为users表和product表具有多对多关系。在DB设计中,当您有这种关系时,应该有第三个表来链接它们。我不会推荐你的第二个解决方案,因为它是一个糟糕的设计。例如:如果查询用户拥有产品的所有用户