1

我正在尝试使用最佳实践来设计数据库结构,但我无法理解一些我确信是基本的东西。数据库供用户(100+)订阅他们阅读的杂志(100+)。

我有一个包含用户名、用户信息和杂志标题的表格,但我不确定在哪里列出每个用户关注的杂志。我是在用户表中添加一列并将其链接到杂志表,还是每个用户都设置有自己的“关注”表,其中列出了杂志?我让自己感到困惑,我认为任何帮助都会很棒。

问候

瑞安

4

6 回答 6

4

您正在努力解决的问题称为多对多关系。

为了解决这个问题,你需要第三个表——也许叫做user_magazines. 第三个表应该有两个关键字段,一个来自用户表,另一个来自杂志表。例如,user_id列和magazine_id列。这称为复合键。通过这两个列,您现在可以辨别哪个用户已经阅读了哪些书籍。

最好从视觉上理解:

在此处输入图像描述

在上图中,您可以看到第三个表(中间表,stock_category)使我们能够知道哪些库存项目属于哪些类别。

于 2012-08-17T04:31:40.957 回答
0

一个User_To_Magazine表,它有两列 -UserIdMagazineId,并且键是包含两列的组合

于 2012-08-17T04:31:52.163 回答
0

您应该有一个users表,其中包含自动递增的主键、用户名以及您想要存储的有关该用户的任何其他内容。

接下来,一个magazines包含另一个自动递增主键的表、杂志的名称以及您需要存储的关于该杂志的任何其他内容。

最后,一张subscriptions桌子。这应该有一个自动递增的主键(实际上这在这张表上并不是真正需要的,但我个人会添加它)、一个 user_ID 列和一个 magazine_ID 列。

要添加订阅,只需在订阅表中添加一条新记录,其中包含用户 ID 和相关杂志的 ID。这允许用户订阅多个杂志。

如果你想变得花哨,你可以给subscriptions表添加引用完整性约束——这告诉数据库管理系统一个特定的列是对另一个表的引用,并且可以指定修改它时要做什么(例如,你可以有 DBMS如果特定用户被删除,则自动删除该用户拥有的订阅)

于 2012-08-17T04:34:22.103 回答
0

您应该创建一个名为UserMagazineSubs. 将UserID+ MagazineTileID 设为复合键。

此表将捕获所有 UserMagazine关系详细信息。

于 2012-08-17T04:37:14.350 回答
0

您绝对不想在用户表中添加一列并让它引用杂志表。用户只能关注或订阅一本不反映现实世界的杂志。

您将需要一个包含 userId 和 magazineId 的连接表。对于用户订阅的每本杂志,连接表中都会有一个条目。

我在推断您的表结构,但如果您有:

User (id, login)
Magazine (id, name)
User_Magazine (userId, magazineId)

也许最后一个表应该称为订阅,因为可能还有其他信息,例如您想要跟踪的订阅结束日期,而这正是它在现实世界中所代表的。

您可以在 User_Magazine 表中为每个订阅添加一个条目。

如果您想查看登录 jdoe 的用户的所有杂志,您会这样做:

SELECT name 
  FROM User, Magazine, User_Magazine 
  WHERE login = 'jdoe'
    AND User.id = User_Magazine.userId
    AND Magazine.id = User_Magazine.magazineId
于 2012-08-17T04:51:31.910 回答
0

首先,您必须了解多对多关系,例如以用户和杂志为例。先了解一下场景:一个用户可以关注很多杂志,一个杂志可以关注很多用户,所以用户和杂志之间存在多对多的关系。

每当两个实体之间存在多对多关系时,我们必须在它们之间引入第三个实体,称为关联实体!

因此您必须根据您的选择引入第三个实体,它将包含有关哪个用户正在关注哪个杂志的信息

您可以访问http://sqlrelationship.com/many-to-many-relationship/使用图表更好地理解

于 2012-08-17T05:57:27.013 回答