我正在设计一个包含照片的数据库。
照片中没有与之关联的标签。
目前,我在列中的所有标记词/关键字都以每个图像记录的空格分隔。
现在我知道这不是一个好的设计,因为它可能会有一个带有空标签/关键字列的图像记录,并且它也会使得带回包含该词的所有照片的效率低下,例如'马'英寸
所以我的问题是,在自己的表中使用关键字和每个关键字的记录会更好吗?
该表可以包含列ID(INT PK),imageId(INT KEY),关键字(VARCHAR)。
我看到的唯一问题是,每张图片最终可能会有数百个重复的关键字?
有人在工作中简要提到了一些关于查找表来解决这个问题,但他们并没有解释它究竟是什么。
答案 0 :(得分:1)
您可以添加另一个表格,包括带有字段ID,关键字的名称标签。而在表中而不是关键字使用标签表的id。
答案 1 :(得分:0)
以空格分隔或以其他方式划界可能是您最糟糕的选择。您不需要为所有标签查找表,我会做类似的事情:
T_PHOTO
photo_id = 1, photo_name = hello
T_PHOTO_TAG
photo_id = 1, tag = pretty
photo_id = 1, tag = sunset
photo_id = 1, tag = kitten
等
至关重要的是,您不需要T_TAG包含所有这些词语。也就是说,你可以 - 如果你想要一个有限的标签宇宙,那就是。
答案 2 :(得分:0)
“该表可以包含列ID(INT PK),imageId(INT KEY),关键字(VARCHAR)。”这也没有标准化,因为如果你想为多张照片添加一个关键字,它会在这样的表格中出现多次。
你需要的是m:n关系,使用第三个表:
PHOTOS – at least an ID
KEYWORDS – ID and KEYWORD
PHOTO_HAS_KEYWORD – PHOTO.ID and KEYWORD.ID as combined PRIMARY or UNIQUE key with according foreign keys on them.
您应该阅读一些数据库规范化的介绍,以了解m:n关系在这种情况下的工作原理。
答案 3 :(得分:0)
我的偏好是只存储一次关键字/标签,并将其重复用于其他图片。
图片拥有并属于许多标签
图片强>
<强>代码
<强> images_tags 强>
然后,您可以对给定图像记录的所有标记使用组连接。 见 - Aggregate functions and grouping