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