我想在 SQL 数据库中存储可变大小的图像标签列表,然后能够根据标签在数据库中搜索图像。我目前正在从数据库中提取标签列表,并检查查询标签是否包含在数组中。有什么办法可以在我拉出标签后将它们格式化为 sql 查询而不是在 php 中执行它们?
该列表存储为以下形式的逗号分隔值:
“阳光明媚,沙滩,棕榈树”-im1
“棕榈树,下雨,云” -im2
“冬天,雪,雪人,赃物”-img
我希望能够得到查询标签的联合:“海滩,棕榈树”的查询应该返回 im1 和 im2
谢谢
我想在 SQL 数据库中存储可变大小的图像标签列表,然后能够根据标签在数据库中搜索图像。我目前正在从数据库中提取标签列表,并检查查询标签是否包含在数组中。有什么办法可以在我拉出标签后将它们格式化为 sql 查询而不是在 php 中执行它们?
该列表存储为以下形式的逗号分隔值:
“阳光明媚,沙滩,棕榈树”-im1
“棕榈树,下雨,云” -im2
“冬天,雪,雪人,赃物”-img
我希望能够得到查询标签的联合:“海滩,棕榈树”的查询应该返回 im1 和 im2
谢谢
您将希望避免在数据库中使用分隔列表 - 正如您所发现的那样,这否定了使用数据库存储结构化数据的优势。相反,您应该创建一个每行一个标签的新表,然后使用主图像表中的外键引用该表。
图像表
标签表
Image_Tags表
这样,您将能够运行如下查询:
SELECT t.tag_name, i.image_name FROM image_tags it
INNER JOIN images i on it.image_id = i.id
INNER JOIN tags t on it.tag_id = t.id
WHERE t.tag_name in ('beach', 'palms')
@dbaseman 提供了一个很好的答案(+1),但它可能有点矫枉过正。假设您想知道的关于标签的唯一信息是它的名称,那么只有 2 个表的模型在实践中可能会表现得更好(少一个 JOIN 和更好的数据聚类):
图像表:
image_tag 表:
image_tag 的 PK 中的字段顺序很重要:如果您保留它,{tag_name, image_id}
它将很好地聚集数据(即,将具有相同标签的图像保存在一起),完全符合您查询的需要:
SELECT DISTINCT image.*
FROM image JOIN image_tag ON (image.id = image_tag.image_id)
WHERE image_tag.tag_name IN ('beach', 'palms')
另一方面,如果您还需要标签描述、标签作者等...,@dbaseman 的模型很好,除了您可以考虑翻转 Image_Tags PK 中的字段顺序(出于与上述相同的聚类原因)。