gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:56:36 25 4
gpt4 key购买 nike

为了学习更多关于数据库设计的知识,我正在绘制一个数据库模型,我选择为社交网络网站绘制一个简单的数据库模型,以保持比普通学生/教师/类(class)模型更有趣。

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

我不像其他人在堆栈交换中那样擅长绘制这些文本数据库绘图,我会尝试仅列出表格并解释关系,如果不清楚我可以尝试绘制文本绘图。

数据库表:

  • 用户
  • friend
  • 动态消息

User与Friend和Group是一对多的关系,一个用户可以有很多 friend ,一个用户可以是多个组的成员,一个组可以有很多用户。

Friend 与 Group 是多对多关系,一个 friend 可以属于多个组,一个组可以包含多个 friend 。基于一个 friend 可以拥有多个新闻源,与新闻源之间存在一对多关系。

Group 与 Friend 是多对多的关系,一个 group 可以包含很多 friend ,一个 friend 可以是多个 group 的一部分。 Group 与 Newsletter 具有一对多的关系,一个 group 可以有多个 newsfeeds。

那么现在一个表中有一个多对多关系和一个一对多关系指向另外两个表,这是正确的吗?这部分感觉不对,尤其是 friend 部分,但也许我只是误解了这里的某些内容。这可能是一个愚蠢的数据库模型,但有时我需要问一些愚蠢的问题,以便在某些事情上变得更聪明。我阅读并观看了一些关于数据库关系的视频,它们看起来很简单,但是在绘制这个数据库模型时,我感到很困惑,因为我突然在一个表中得到了多对多和一对多的关系,这似乎奇怪。

最佳答案

我是这样开始的:

假设我们有两个组,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 | ... |
| .. | .... | ... |
+----+------+-----+

“ friend ”实际上只是另一个用户 所以让我们创建一个允许两个用户之间存在多对多关系的表。我的示例数据显示 Bob 是 Mary 和 John 的 friend ,而 Mary 只是 John 的 friend 。 (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)

关于mysql - 具有多对多和一对多关系的数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20131613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com