Sql 简单的数据库表设计

Sql 简单的数据库表设计,sql,database-design,Sql,Database Design,我正试图用最佳实践设计一个数据库结构,但我不能理解一些我确信是基本的东西。DB供用户100+订阅他们阅读的杂志100+ 我有一个关于用户名、用户信息和杂志标题的表格,但我不确定在哪里列出每个用户关注的杂志。我是在用户表中添加一列并将其链接到杂志表,还是每个用户都会设置自己的跟踪表,在那里列出杂志?我弄糊涂了,我想任何帮助都会很好 问候 Ryan你正在挣扎的是所谓的关系 要解决这个问题,您需要第三个表,可能称为用户杂志。第三个表应该包含两个关键字段,一个来自用户表,另一个来自杂志表。例如,用户id

我正试图用最佳实践设计一个数据库结构,但我不能理解一些我确信是基本的东西。DB供用户100+订阅他们阅读的杂志100+

我有一个关于用户名、用户信息和杂志标题的表格,但我不确定在哪里列出每个用户关注的杂志。我是在用户表中添加一列并将其链接到杂志表,还是每个用户都会设置自己的跟踪表,在那里列出杂志?我弄糊涂了,我想任何帮助都会很好

问候


Ryan

你正在挣扎的是所谓的关系

要解决这个问题,您需要第三个表,可能称为用户杂志。第三个表应该包含两个关键字段,一个来自用户表,另一个来自杂志表。例如,用户id列和杂志id列。这被称为一个。使用这两个列,您现在可以辨别出哪个用户读过哪些书

这是最好的视觉理解:


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

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

要解决这个问题,您需要第三个表,可能称为用户杂志。第三个表应该包含两个关键字段,一个来自用户表,另一个来自杂志表。例如,用户id列和杂志id列。这被称为一个。使用这两个列,您现在可以辨别出哪个用户读过哪些书

这是最好的视觉理解:

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

一个User_to_Magazine表,它有两列-UserId和MagazineId,键是包含两列的复合键。

一个User_to_Magazine表,它有两列-UserId和MagazineId,并且键是包含这两列的复合键

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

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

最后是一个订阅表。这应该有一个自动递增的主键,实际上这在这个表上并不是必需的,但我个人会添加它,一个用户ID列和一个杂志ID列

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

如果您想获得更多乐趣,可以向subscriptions表添加引用完整性约束-这会告诉数据库管理系统某个特定列是对另一个表的引用,并且可以指定修改后要执行的操作。例如,如果某个用户被删除,您可以让DBMS自动删除该用户拥有的订阅。

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

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

最后是一个订阅表。这应该有一个自动递增的主键,实际上这在这个表上并不是必需的,但我个人会添加它,一个用户ID列和一个杂志ID列

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


如果您想获得更多乐趣,可以向subscriptions表添加引用完整性约束-这会告诉数据库管理系统某个特定列是对另一个表的引用,并且可以指定修改后要执行的操作。例如,如果某个用户被删除,DBMS可以自动删除该用户拥有的订阅。您应该创建一个名为UserMagazineSubs的单独表。将UserID+MagazineTile ID作为复合键


此表将捕获所有用户和杂志关系的详细信息。

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


此表将捕获所有用户和杂志关系的详细信息。

您肯定不希望向用户表中添加列并使其引用杂志表。用户只能关注或订阅一本不反映真实世界的杂志

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

我对您的表结构进行了一些推断,但如果您有:

User (id, login)
Magazine (id, name)
User_Magazine (userId, magazineId)
也许最后一个表应该称为subscription,因为可能还有其他信息,比如您想要跟踪的订阅结束日期,而这正是它在现实世界中所表示的

对于每个订阅,您都可以在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

您肯定不希望将列添加到用户表中并使其引用杂志表。用户只能关注或订阅一本不反映真实世界的杂志

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

我对您的表结构进行了一些推断,但如果您有:

User (id, login)
Magazine (id, name)
User_Magazine (userId, magazineId)
也许最后一个表应该称为subscription,因为可能还有其他信息,比如您想要跟踪的订阅结束日期,而这正是它在现实世界中所表示的

对于每个订阅,您都可以在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

首先,你必须理解多对多的关系,比如以用户和杂志为例。首先了解场景:一个用户可以跟随多个杂志,一个杂志可以跟随多个用户,因此用户和杂志之间存在多对多关系

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

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


为了更好地理解使用图表,您可以访问

首先,您必须理解多对多关系,例如以用户和杂志为例。首先了解场景:一个用户可以跟随多个杂志,一个杂志可以跟随多个用户,因此用户和杂志之间存在多对多关系

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

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


为了更好地理解使用图表,您可以转到另一个具有用户ID和杂志ID的表。另一个具有用户ID和杂志ID的表。