我正在尝试使用最佳实践来设计数据库结构,但我无法理解我确信基础的东西。数据库是供用户(100+)订阅他们阅读的杂志(100+)。
我有一个用户名,用户信息和杂志标题的表格,但我不确定在哪里列出每个用户遵循的杂志。我是否在用户表格中添加了一列并将其链接到杂志表格,或者是否每个用户都设置了自己的“跟随”表格,其中列出了该杂志?我觉得自己很困惑,所以任何帮助都会很棒。
此致
瑞安答案 0 :(得分:4)
您正在努力解决的问题称为many-to-many关系。
要解决此问题,您需要第三个表 - 可能称为user_magazines
。第三个表应该有两个关键字段,一个来自用户表,另一个来自杂志表。例如,user_id
列和magazine_id
列。这称为compound key。通过这两个列,您现在可以辨别出哪个用户已阅读过哪些书籍。
最好从视觉上理解:
在上图中,您可以看到第三个表格(中间表格stock_category
)使我们能够了解哪些股票项目属于哪些类别。
答案 1 :(得分:0)
一个User_To_Magazine
表,有两列 - UserId
和MagazineId
,密钥是包含两列的复合
答案 2 :(得分:0)
您应该有一个users
表,其中包含自动递增的主键,用户名以及您要存储的有关该用户的任何其他内容。
接下来是一个magazines
表,其中包含另一个自动递增的主键,mag的名称以及您需要存储的关于该杂志的任何其他内容。
最后,一个subscriptions
表。这应该有一个自动递增的主键(实际上在这个表上并不是必需的,但我个人会添加它),user_ID列和magazine_ID列。
要添加订阅,只需在订阅表中添加一条新记录,其中包含用户ID和相关杂志的ID。这允许用户订阅多个杂志。
如果您希望获得幻想,可以将参照完整性约束添加到subscriptions
表 - 这会告诉数据库管理系统特定列是对另一个表的引用,并且可以指定在修改它时要执行的操作(例如,如果删除该用户,您可以让DBMS自动删除特定用户拥有的订阅)
答案 3 :(得分:0)
您应该创建一个名为UserMagazineSubs
的单独表格。将UserID
+ MagazineTile
ID设为复合键。
此表格将捕获所有User
和Magazine
关系详情。
答案 4 :(得分: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
答案 5 :(得分:0)
首先,您必须了解多对多关系,例如以用户和杂志为例。首先要了解情景:单个用户可以关注许多杂志,许多用户可以关注单个杂志,因此用户和杂志之间存在多对多的关系。
每当两个实体之间存在多对多关系时,我们必须在它们之间引入第三个实体,称为关联实体!
所以你必须引入一个根据你的选择命名的第三个实体,它将包含关于哪个用户正在关注哪个杂志的信息
您可以转到http://sqlrelationship.com/many-to-many-relationship/以便使用图表更好地理解