【问题标题】:Storing a SQL string array, and subsequent querying存储 SQL 字符串数组,以及后续查询
【发布时间】:2012-05-03 16:14:20
【问题描述】:

我想在 SQL 数据库中存储可变大小的图像标签列表,然后能够根据标签在数据库中搜索图像。我目前正在从数据库中提取标签列表,并检查查询标签是否包含在数组中。有什么办法可以在我拉出标签后将它们格式化为 sql 查询而不是在 php 中执行它们?

列表以逗号分隔值的形式存储:

“阳光明媚,沙滩,棕榈树”-im1

“棕榈树,下雨,云”-im2

“冬天,雪,雪人,赃物”-img

我希望能够得到查询标签的联合: 查询“beach, palms”应该返回 im1 和 im2

谢谢

【问题讨论】:

    标签: mysql sql database database-design foreign-keys


    【解决方案1】:

    您需要避免在数据库中使用分隔列表 - 正如您所发现的那样,这会否定使用数据库存储结构化数据的优势。相反,您应该创建一个每行一个标签的新表,然后使用 外键 从主图像表中引用该表。

    图片表格

    • 身份证
    • 图像名称

    标签表格

    • 身份证
    • 标签名称

    Image_Tags表格

    • image_id(引用 Images 表主键)
    • tag_id(引用标签表主键)

    这样,您就可以像这样运行查询:

    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')
    

    【讨论】:

    【解决方案2】:

    @dbaseman 提供了一个good answer (+1),但它可能有点矫枉过正。假设您只想知道标签的名称,那么只有 2 个表的模型在实践中可能会表现得更好(少一个 JOIN 和更好的clustering 数据):

    图像表:

    • id PK
    • 图像名称

    image_tag 表:

    • tag_name PK
    • image_id PK、FK -> 图像

    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 中的字段顺序(出于与上述相同的聚类原因) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2017-11-11
      相关资源
      最近更新 更多