我试图向同事解释联接表的好处,下面是一个解释。我是对的吗?
目前,他有一张pic和带有两张桌子的标签之间的关系。 pic表和标签表。 pic表有tag_id
这是标签表中条目的FK。以下是我的回复:
首先让我们看看pics
和tags
表。因此,在您当前的架构中,可以想象两个图片(a& b)。我们标记照片a& b,标签为#wtf。我们现在在tags
表中有两个条目:
pic_id title
------ -----
a wtf
b wtf
你看到了这个问题吗?因此,想象一下,我们在1000个不同的图片上有1000个wtf的标签。使用相同的架构,我们现在有一个膨胀的标签表,其中包含所有这些重复数据(以及浪费的空间)。当我们有多对多的关系时就会出现这个问题。在这种情况下,许多照片可以有许多标签,许多标签可以有许多照片。我们如何解决这个问题?答案是连接表。所以我们创建一个新表。让我们称之为pic_tag
。此表格中包含pic_id
列& tag_id
。所以现在新表看起来像:
pic_tag
pic_id tag_id
------ ------
a 1
b 1
标签
id name
-- ----
1 wtf
PIC
id name
-- ----
a pic1
b pic2
所以这对我们来说有几件事情。首先,它节省了空间。我们只存储字符串'wtf'一次。其次,要查找标签为'wtf'的所有图片,我们首先转到标签表并找到'wtf'的id,然后转到pic_tag表并搜索该id,它比搜索膨胀的'标签更有效率'给定文本的表。换句话说,搜索int比搜索文本要快得多。
答案 0 :(得分:4)
主要好处是存在只能使用连接表建模的关系。
假设你有两个实体A和B.如果关系A:B是1:1,那么这两个实体可以用一个表来表示。如果A:B是1:N(比如1个客户可以有N个订单,但每个订单只来自一个客户),那么您可以将其建模为从订单表到客户表的外键。但是如果A:B是N:M(你的标签场景就是一个很好的例子),你需要一种方法来为每张图片表示0,1或N个标签。除了连接表之外,没有其他声音关系表示。
请注意,您可以在每个图片中表示多个标记,同时在单个列中打破关系设计的一些原则(例如将多个标记或FK存储到标记中)。是否这样做是一项设计决定。
其他好处:您可以改变主意,无论关系是0:1,0:N,1:(0-5),1:N等,而无需更改核心数据模型 - 在触发器中寻址该逻辑或应用逻辑。您可以创建其他索引来帮助加入。您可以引入更多唯一性约束来强制执行数据逻辑等。
但主要的好处是,连接表是模拟某些类型关系的唯一关系声音方式。