使用(或不使用)联结表

时间:2016-02-08 23:20:34

标签: mysql sql database database-design

我正在为学校开发一个小项目,我不确定设计选择。

这是我想要实现的目标:

我有一个用户表,允许订阅/取消订阅存储在第二个表中的不同杂志。

我的问题相当容易。这是否证明使用连接表是正确的?我最初考虑将订阅者的ID直接包含在杂志表中,并附加一列。感觉很草率。

另一方面,如果我使用联结表,无论​​如何,我仍然会将多个ID(用户或杂志)存储到一个列中,因此感觉就像联结表没有用处。 / p>

你对它的看法是什么?

2 个答案:

答案 0 :(得分:1)

您正在处理多对多的关系 - 学生可以订阅多个杂志,而杂志可以有多个订阅者。

处理此问题的方法是使用联结表,否则您最终会在学生或杂志表中找到重复的数据。

考虑:

student
id   name   mag_id
---------------------
 1   Joe     1
 1   Joe     2
 1   Joe     3
 2   Tom     1
 etc

为了适应M-N关系,这里不必重复条目。

从长远来看,联结表将使事情变得更容易:

student
id    name
 1    Joe
 2    Tom

magazine
id    name
 1    Weekly
 2    Sports

junction
id  stud_id    mag_id
 1     1         1
 2     1         2
etc

通过这种方式,您可以为每个学生杂志配对添加唯一条目,减少其他字段条目的重复,并且更容易查询数据。

答案 1 :(得分:0)

不,联结表将完全避免在一行中有多个用户标识或杂志。你有两个关系:

CREATE TABLE users (
                    userid int,
                    username text,
                    ...
)

CREATE TABLE magazines (
                    magid int,
                    magname text,
                    ...
)

您的联结表连接这些表(多对多关系):

CREATE TABLE user_magazine (
                    userid int,
                    magid int
)

现在每个abonnement在联结表user_magazine中输入一个条目。通常,您还会对user_magazine中的字段使用外键约束,并设置适当的索引。

明确地推荐这个设计超过你的第二个提议选项。