1

我有一个这样的标签表:

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 

图像表中标签列的原因是,如果检索到图像,也可以检索所有关联的标签,而无需深入到标签表中。但出于某种原因,我开始认为它最好从标签表中获取所有相关标签以减少冗余并确定它与该标签相关联(它可能已被删除或删除但数据不匹配) -
但我也再次感受到它保留标签列可能是有益的。我不知道是应该保留还是删除它。我是不是在想这个?

4

2 回答 2

4

是的,image_tags应该删除该列。

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

您的标签表可能也不应该有该image_id列。考虑使用此架构:

tags
---
tag_id *
tag_name

images
---
image_id *
image_name 

imagetags
----
it_image_id *
it_tag_id *

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

于 2013-01-26T18:35:18.053 回答
2

您需要重新设计标签表。关系数据库表单要求每列只有一个值。这意味着您应该在每列中只有一个标签。关系数据库就是这样设计的;有效地JOIN标记ON您的图像。

> 形象
编号 | 图像名称
1 条狗.jpg

> 图像标签
image_id | 标签
1 搞笑
1 条狗
1 晴天

您不需要标签的代理键,因为您的表image_id, tag中有一个主复合键 ( ) image_tag

于 2013-01-26T18:32:58.873 回答