一对一关系还是使用同一张表?

Posted

技术标签:

【中文标题】一对一关系还是使用同一张表?【英文标题】:One-to-One Relation or Use the Same Table? 【发布时间】:2012-11-10 17:42:05 【问题描述】:

我创建了以下表格:

动漫(id,title,date), 漫画(id,title,date), 电视剧(id,title,season,episode,date)

其中一些已经有导演、流派、文章等的外键(用于一对多或多对多关系)。

现在我想再创建两个表Reviews(id,rating,date) 和Posts(id,thumbid,articleid,reviewid)。 评论是关于一个动漫和/或漫画 TVSerie 的,反之亦然,但评论的属性可能在多个表中。帖子也一样。

这是单独表中一对一关系的典型示例,还是向现有表添加更多属性更有效? 那么更多的表和关系还是更少的表更多的列?

谢谢你,我希望我的问题不是那么愚蠢,但我有点困惑。

【问题讨论】:

【参考方案1】:

在我看来,一对一关系最好避免外键关系。它最适合一对多关系。

【讨论】:

所以您建议在现有表格中添加评论属性?因此,例如漫画将像 (id, title, date, rating, reviewdate) 和 TVSeries(id, title, season, episode, date, rating, reviewdate) 等等.. 是的..!它还提高了性能……与多个表相比。您创建的表越多,您需要编写的连接就越多。我认为我的理由很充分。如果您同意我的回答,请投票。 我不知道我是否同意,因为正如我所说,我很困惑。好吧,它是一个个人项目,因此它会不断升级,在开始编程之前,我希望拥有我可以创建的更高效和可扩展的数据库。因为例如在评论和/或帖子或任何其他表格中,我将来可能会添加更多属性。所以一个 14-15 列的表不会太“重”吗?谢谢你的回答。 如果行数这么少也没关系,随便选哪一个就行。多张桌子也可以。 没问题,迈克。如果它们是处理较少数据量的较小表,则可以使用这样的多个表,与列无关。但是如果它处理大量数据最好避免它。但是如果你使用单表,即使编写查询也会非常简单。想想吧。【参考方案2】:

我不确定您的要求是什么,但选择如下:

    评论有 2 列,或者是适用表的外键,可以为 NULL。这确实适用于单个评论可以同时涉及两者的情况。

    有一个ReviewsComics 和ReviewsAnime 表。然后,您将拥有每个表中评论的所有字段(并且没有评论表)。

    另一种方法 (2) 是将它们与评论表结合使用,那么这 2 个表只有 2 个字段,它们分别是评论和漫画/动漫的外键(因此评论和漫画之间没有直接链接/动漫)。

    有一个基表,动漫和漫画以一对一的方式链接到该基表,并且评论链接到该表。

    (编辑)如果动漫/漫画的所有字段都相同(或相似),您可以将它们合并到一个表中并添加一个类型字段,指示动漫/漫画,然后问题消失了。这类似于基表选项。

编辑:这 2 个评论表可能会提供最佳性能(除非您经常要选择其中任何一个的所有评论),但如果使用适当的索引,性能应该不会成为上述任何一个问题。

【讨论】:

让我拿起一支铅笔和一张纸,试着理解你向我解释的内容。谢谢 第一。你的意思是 2 MORE 列对吗?否则没有意义。第二。这就像:向现有表选项添加更多属性,对吗?拥有动漫表并插入具有评论、帖子等属性的列。 3rd。这更像是多对多的关系。在这种情况下有用吗?第四。为什么要这样做?我不需要动漫-漫画-电视剧直接关系,*(我认为)。 @fat_mike (1) 是的,还有 2 列。 (2) 将有以下内容:ReviewsComics、ReviewsAnime、Comics、Anime。 (3) 将与 2 相同,但也有评论(和评论漫画,评论动漫将只有字段链接评论和漫画/动漫表)。 (4) 允许您将评论指向 TVSeries 和 Comics 和 Anime,因此您不必担心直接链接评论和 Comics/Anime(评论、漫画和动漫中的 TVSeries FK 也是如此)。它们都是可行的,并且各有优缺点。 @fat_mike 如果您计划审查多达 15 种不同的东西(正如您在其中一个 cmets 中提到的那样),我肯定会从我的回答中建议 (4)。它可能是最慢的解决方案,但它是最干净的(没有空数据和很少的表),并且使用正确的索引并不需要担心性能损失。但是,如果所有字段都相同,您可以使用基表并在基表中添加一个类型字段,指示动漫/漫画(As (5)(已添加))。 第 5 个选项似乎是最好的,因为这些字段几乎相同,但很多版本在 Comics/Anime 中具有相同的标题,因此类型字段必须有多个以逗号分隔的条目,即通常不正确。是吗?

以上是关于一对一关系还是使用同一张表?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Android 房间数据库在同一张表中的一对多关系

需要在 Laravel 4 的同一张表中设置一对多关系

grails一对一关联关系

MyBatis - 关联查询

ThinkPHP5中模型的一对一关联关系

MySQL数据库8表关系