具有多对多和一对多关系的数据库表

时间:2013-11-21 20:52:29

标签: mysql sql database relational-database

为了更多地了解数据库设计我正在制定数据库模型,我选择为社交网络网站绘制一个简单的数据库模型,以保持比普通学生/教师/班级模型更有趣。< / p>

我的问题是关于不同表格之间的关系。

我不是那么好,绘制这些文本数据库绘图像其他人一样在堆栈交换生病尝试只列出表并解释关系,如果不清楚我可以尝试绘制文本绘图。

数据库表:

  • 用户
  • 朋友
  • 新闻源

用户与朋友和群组有一对多的关系,因为一个用户可以拥有多个朋友,一个用户可以是多个群组的成员,一个群组可以拥有多个用户。

朋友与群组有多对多的关系,因为一个朋友可以是许多群组的一部分,一个群组可以包含很多朋友。与Newsfeed有一对多的关系,因为一个朋友可以有很多新闻源。

Group与Friend有多对多的关系,因为一个组可以包含很多朋友,一个朋友可以成为许多组的一部分。 Group与Newsletter建立了一对多的关系,因为一个组可以有很多新闻源。

所以现在有一个多对多关系,一个表中的一对多关系指向另外两个表,这是正确的吗?这部分内容感觉不对,特别是朋友部分,但也许我只是在这里误解了一些东西。这可能是一个愚蠢的数据库模型,但我有时会问愚蠢的问题,以便更聪明地做某事。我已经阅读并观看了一些关于数据库关系的视频,并且看起来很容易但是在绘制这个数据库模型时我很困惑,因为我突然在一个表中看到了多对多和一对多的关系怪异。

2 个答案:

答案 0 :(得分:2)

这就是我的开始:

假设我们有两个小组,A组和B组。

groups
    id              unsigned int(P)
    name            varchar(30)
    ...

+----+---------+-----+
| id | name    | ... |
+----+---------+-----+
|  1 | Group A | ... |
|  2 | Group B | ... |
| .. | ....... | ... |
+----+---------+-----+

假设A组有两个新闻源而B组没有任何新闻源:

newsfeeds
    id              unsigned int(P)
    group_id        unsigned int(F groups.id)
    name            varchar(30)
    ...

+----+----------+--------------------+-----+
| id | group_id | name               | ... |
+----+----------+--------------------+-----+
|  1 |        1 | Interesting Things | ... |
|  2 |        1 | Other Information  | ... |
| .. | ........ | .................. | ... |
+----+----------+--------------------+-----+

假设我们有三个用户:Bob,Mary和John:

users
    id              unsigned int(P)
    name            varchar(30)
    ...

+----+------+-----+
| id | name | ... |
+----+------+-----+
|  1 | Bob  | ... |
|  2 | Mary | ... |
|  3 | John | ... |
| .. | .... | ... |
+----+------+-----+

“朋友”实际上只是另一个user所以让我们创建一个表,允许两个用户之间的多对多关系。我的示例数据显示,Bob是Mary和John的朋友,而Mary只是John的朋友。 (user_id和friend_id构成主键)

users_friends
    user_id     unsigned int \_ (P) (F users.id)
    friend_id   unsigned int /      (F users.id)

+---------+-----------+
| user_id | friend_id |
+---------+-----------+
|       1 |         2 |
|       1 |         3 |
|       2 |         3 |
| ....... | ......... |
+---------+-----------+

用户可以属于多个群组,每个group可以拥有多个用户,因此我们需要一个能够提供多对多关系的表格。在我的示例数据中,我们看到Bob是A组和B组的成员,而Mary和John只是B组的成员。(user_id和group_id构成主键)

users_groups
    user_id     unsigned int \_ (P)(F users.id)
    group_id    unsigned int /     (F groups.id)

+---------+----------+
| user_id | group_id |
+---------+----------+
|       1 |        1 |
|       1 |        2 |
|       2 |        2 |
|       3 |        2 |
| ....... | ........ |
+---------+----------+

最后,我们需要一个显示newsfeedsusers之间关系的表格。我没有在这里输入任何示例数据,但此表的工作方式与users_groups表完全相同。像这样的表被称为许多不同的东西,你可以在Wikipedia阅读更多关于它们的内容。 (user_id和newsfeed_id构成主键)

users_newsfeeds
    user_id         unsigned int \_ (P) (F users.id)
    newsfeed_id     unsigned int /      (F newsfeeds.id)

答案 1 :(得分:1)

IMO,在考虑关系建模时,应该记住关系的“方向”,否则它会变得非常混乱,而且,应该记住每个“多对多”关系必须使用'一个来建模许多'。无论如何,请看这里http://screencast.com/t/sJbPrvO53MS

enter image description here

即使花了一分钟才能阅读这个问题......这是一个有趣的问题...