database - 为什么多对多数据结构需要额外的两个表?

标签 database data-structures many-to-many one-to-many

本题基于the thread .

如果我们有一对多的数据结构,我们需要有一个“帮助表”来存储例如一个人的电话号码。很多人不能拥有相同的电话号码。

我期待着解释为什么我们需要两个多对多关系之间的“帮助表”。这方面的一个例子是一个问题网站,许多用户可以在其中添加相同的标签:

alt text http://files.getdropbox.com/u/175564/db/db-55.png

为什么我们需要表 Question-Tag-xrefQuestion-Tags

为什么我们不能像下面这样只有一张标签表?

   Question_id   |    tag
   1                  C 
   1                  C++
   2                  Java
   2                  C

为什么两个不同的问题具有相同的标签是计算机的问题?

最佳答案

那只是一张“额外”的 table 。

因为同一个问题可能有很多标签。

而且因为同一个标签可能被很多问题使用。

您需要在某处存储 (questionId, tagId) 并确保没有重复项。


我一直没有关注你关于这个主题的问题,但看起来这里的设计有些糟糕。我以为你只有一张额外的 table ,因为我假设你有一个合理的结构。你没有。

为什么 Question-Tags 同时具有标签字符串和标签 ID?这对我来说意义不大。


我不想回顾问题的顺序。尽管如此,我还是想尝试说明我在说什么。因此,我使用 NORMA 创建了 StackOverflow 的这一部分的非常简单的对象角色建模模型。工具:

Simple model of StackOverflow

这生成了以下 ER 图:

ER diagram

请注意,“额外”表是我们需要为标签保留的全部内容,只是因为没有保留有关标签的其他信息。此外,无需存储作为标签表外键的标签 ID,因为标签名称已经是唯一的。如果我们保留关于标签的额外数据,那么可能会有一个单独的标签表,主键仍然是标签名称。如果它成为性能问题,可以将其更改为使用整数 ID,在这种情况下,标签名称仍会在其上获得唯一索引。

关于database - 为什么多对多数据结构需要额外的两个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185626/

相关文章:

mysql - 具体外键解释

algorithm - Dijkstra 算法中堆相对于二叉树的优势

java - 多对多连接表的 JPQL 查询

java - hibernate 多对多-获取方法渴望与懒惰

python - Django 多对多

ruby - 解析大型 PDF 文件的方法

java.sql.Date错误如何避免?将日期插入我的数据库

java - ArrayList or LinkedList or TreeMap 用什么?

algorithm - 增广区间树

java - jProgressBar 与数据库