1

我正在创建一个简单的博客应用程序,到目前为止,我有 3 个表、帖子、评论和作者。

我将只列出每个表的主键以及外键。

帖子将包含 postid 作为主键。

评论将包含 commentid 作为主键和 postid 作为外键。

帖子与评论有 0 对多的关系。

Authors 将包含一个 authorid 作为主键。

作者将与帖子具有多对多关系,与评论具有多对多关系。

最后一句话是我最麻烦的地方。作者是否实际上与帖子和评论有多对多的关系,或者是一对一的关系。如果是多对多,我听说最好有一个中间表来描述帖子作者和评论作者之间的关系,但我不确定我会在这个表中使用什么键?

如果我口头表达为一个作者可以写很多帖子,一个作者可以写很多帖子,我认为它是一对多,但如果我从存储在表中的实际数据来看,例如帖子将包含多个帖子和作者将包含多个作者,然后看起来像是多对多,这就是交叉引用表的用途,以删除重复项。

4

7 回答 7

7

我认为帖子/评论的作者将是一对多的关系,除非您计划支持帖子可能有多个作者的情况。也许这是有道理的,但似乎不太可能有很多人会使用它。我不会为可能有 0.1% 的用户想要的功能而使我的架构复杂化。

只需将 authorId 放在 Posts 和 Comments 表上,就可以了。

于 2009-09-17T16:22:22.320 回答
4

除非您正在运行一种特殊的论坛,否则规则肯定是

  • 一个作者可以写很多帖子
  • 一个帖子必须有一个且只有一个作者
  • 一个作者可以写很多评论
  • 评论必须有一个且只有一个作者
于 2009-09-17T16:23:30.653 回答
2

不,它只是一对多。帖子或评论只能有一个作者 - 对吧?

所以你只需要在 post 和 comments 表中的外键 AuthorID

于 2009-09-17T16:21:43.060 回答
2
如果我口头表达为一个作者可以写很多帖子,一个作者可以写很多帖子,我认为它是一对多,但如果我从存储在表中的实际数据来看,例如帖子将包含多个帖子和作者将包含多个作者,然后看起来像是多对多,这就是交叉引用表的用途,以删除重复项。

我知道你在哪里感到困惑。“帖子表将包含多个帖子”和“作者表将包含多个作者”是正确的,但这不是您要表达的关系。(这只是表的本质——一个作者表将有很多行,每行代表一个作者。)

关键是,对于给定的帖子,它会有多少作者?一个,还是多个?对于给定的作者,它将有多少个帖子?一个,还是多个?

于 2009-09-17T16:40:27.277 回答
1

两者之间的交叉引用表如下所示:

create table PostsToAuthors (
    postToAuthorsId int primary key,
    postId int,
    autorId int
);

作者和帖子之间的每个关联都需要在此表中创建一条记录。请注意,此表包括您希望在此类表上使用的约束(特别是外键和唯一性)。

于 2009-09-17T16:20:47.830 回答
1

我会在 Posts 和 Comments 表中再添加一列来存储作者的外键。通常,帖子和评论只有一个作者。

所以你的架构看起来像这样:

Posts
    postid - primary key
    authorid - foreign key
Comments
    commentid - priamry key
    postid - foreign key
    authorid - foreign key
Authors
    authorid - primary key

Authors-comments - one(zero) to many relationship
Authors-posts - one(zero) to many relationship
Posts-comments - one(zero) to many relationship
于 2009-09-17T16:24:29.007 回答
1

作者将与帖子具有多对多关系,与评论具有多对多关系。

所以你是说每个作者都有很多帖子,每个帖子都有很多作者?评论也一样?

如果您正在制作 wiki,可以,但在大多数情况下,给定的帖子或评论只有一位作者。这是你的意思吗?

无论如何,假设有一个实际的多对多关系。您将创建一个关系表,例如,称为authors_posts,它将具有以下列:idauthor_idpost_id。每行表示“作者 X 和帖子 Y 相关”。

于 2009-09-17T16:24:37.027 回答