我正在尝试使用最佳实践来设计数据库结构,但我无法理解一些我确信是基本的东西。数据库供用户(100+)订阅他们阅读的杂志(100+)。
我有一个包含用户名、用户信息和杂志标题的表格,但我不确定在哪里列出每个用户关注的杂志。我是在用户表中添加一列并将其链接到杂志表,还是每个用户都设置有自己的“关注”表,其中列出了杂志?我让自己感到困惑,我认为任何帮助都会很棒。
问候
瑞安
我正在尝试使用最佳实践来设计数据库结构,但我无法理解一些我确信是基本的东西。数据库供用户(100+)订阅他们阅读的杂志(100+)。
我有一个包含用户名、用户信息和杂志标题的表格,但我不确定在哪里列出每个用户关注的杂志。我是在用户表中添加一列并将其链接到杂志表,还是每个用户都设置有自己的“关注”表,其中列出了杂志?我让自己感到困惑,我认为任何帮助都会很棒。
问候
瑞安
一个User_To_Magazine
表,它有两列 -UserId
和MagazineId
,并且键是包含两列的组合
您应该有一个users
表,其中包含自动递增的主键、用户名以及您想要存储的有关该用户的任何其他内容。
接下来,一个magazines
包含另一个自动递增主键的表、杂志的名称以及您需要存储的关于该杂志的任何其他内容。
最后,一张subscriptions
桌子。这应该有一个自动递增的主键(实际上这在这张表上并不是真正需要的,但我个人会添加它)、一个 user_ID 列和一个 magazine_ID 列。
要添加订阅,只需在订阅表中添加一条新记录,其中包含用户 ID 和相关杂志的 ID。这允许用户订阅多个杂志。
如果你想变得花哨,你可以给subscriptions
表添加引用完整性约束——这告诉数据库管理系统一个特定的列是对另一个表的引用,并且可以指定修改它时要做什么(例如,你可以有 DBMS如果特定用户被删除,则自动删除该用户拥有的订阅)
您应该创建一个名为UserMagazineSubs
. 将UserID
+ MagazineTile
ID 设为复合键。
此表将捕获所有 User
和Magazine
关系详细信息。
您绝对不想在用户表中添加一列并让它引用杂志表。用户只能关注或订阅一本不反映现实世界的杂志。
您将需要一个包含 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
首先,您必须了解多对多关系,例如以用户和杂志为例。先了解一下场景:一个用户可以关注很多杂志,一个杂志可以关注很多用户,所以用户和杂志之间存在多对多的关系。
每当两个实体之间存在多对多关系时,我们必须在它们之间引入第三个实体,称为关联实体!
因此您必须根据您的选择引入第三个实体,它将包含有关哪个用户正在关注哪个杂志的信息
您可以访问http://sqlrelationship.com/many-to-many-relationship/使用图表更好地理解