MYSQL标签列冗余

时间:2013-01-26 18:29:29

标签: mysql database-design

我有一个像这样的标签表:

TAG ID | TAG_NAME | IMAGE_ID 

ex: 
1 | FUNNY | 10 <br />
2 | DOG   | 10
3 | SUNNY | 10 
4 | JULY  | 10 

我还保留了对图像表中图像相关的所有标签的引用

IMAGE_ID | IMAGE_NAME | IMAGE_TAGS ( varchar(255) utf8_general_ci )     

ex: 
10 | dog.jpg | FUNNY,DOG,SUNNY,JULY 

图像表中标记列的原因是,如果检索到图像,则可以检索所有相关标记,而不必浸入标记表中......但出于某种原因,我正在开始认为最好从标签表中获取所有相关标签以减少冗余,并确保它与该标签相关联(它可能已被删除或删除,但数据不匹配) -
但是我又觉得保留标签列可能是有益的。我无法弄清楚我是应该保留这个列还是放下它。我是不是在想这个?

2 个答案:

答案 0 :(得分:4)

是的,应删除image_tags列。

当您存储逗号分隔数据时,您将失去数据库引擎附带的所有索引和完整性。这就是为什么它被认为是一个sql反模式。

您的代码表可能也不应包含image_id列。考虑使用此架构:

tags
---
tag_id *
tag_name

images
---
image_id *
image_name 

imagetags
----
it_image_id *
it_tag_id *

每张图片的标签都保存在m:n表imagetags中。外键约束将有助于进一步加强数据完整性。

答案 1 :(得分:2)

您需要重新设计标签表。关系数据库表单要求每列只有一个值。这意味着每列中只应有一个标记。关系数据库是这样做的;有效JOIN您的代码ON。{

> image
id | image_name
1          dog.jpg

> image_tag
image_id | tag
1          funny
1          dog
1          sunny

您不需要代码的代理键,因为您的image_id, tag表格中有一个主要组合键(image_tag)。