简单的数据库表设计

时间:2012-08-17 04:28:47

标签: sql database-design

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

我有一个用户名,用户信息和杂志标题的表格,但我不确定在哪里列出每个用户遵循的杂志。我是否在用户表格中添加了一列并将其链接到杂志表格,或者是否每个用户都设置了自己的“跟随”表格,其中列出了该杂志?我觉得自己很困惑,所以任何帮助都会很棒。

此致

瑞安

6 个答案:

答案 0 :(得分:4)

您正在努力解决的问题称为many-to-many关系。

要解决此问题,您需要第三个表 - 可能称为user_magazines。第三个表应该有两个关键字段,一个来自用户表,另一个来自杂志表。例如,user_id列和magazine_id列。这称为compound key。通过这两个列,您现在可以辨别出哪个用户已阅读过哪些书籍。

最好从视觉上理解:

enter image description here

在上图中,您可以看到第三个表格(中间表格stock_category)使我们能够了解哪些股票项目属于哪些类别。

答案 1 :(得分:0)

一个User_To_Magazine表,有两列 - UserIdMagazineId,密钥是包含两列的复合

答案 2 :(得分:0)

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

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

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

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

如果您希望获得幻想,可以将参照完整性约束添加到subscriptions表 - 这会告诉数据库管理系统特定列是对另一个表的引用,并且可以指定在修改它时要执行的操作(例如,如果删除该用户,您可以让DBMS自动删除特定用户拥有的订阅)

答案 3 :(得分:0)

您应该创建一个名为UserMagazineSubs的单独表格。将UserID + MagazineTile ID设为复合键。

此表格将捕获所有UserMagazine关系详情。

答案 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/以便使用图表更好地理解