【问题标题】:Images with tags database design considerations带有标签数据库设计注意事项的图像
【发布时间】:2012-10-05 14:21:10
【问题描述】:

我正在设计一个包含照片的数据库。

一张照片可以没有或有多个与之关联的标签。

目前,我将所有标签词/关键字放在一个列中,每个图像记录用空格分隔。

现在我知道这不是一个好的设计,因为可能有一个包含空标签词/关键字列的图像记录,并且带回所有包含单词的照片也会降低效率,例如'马'。

所以我的问题是,将关键字放在自己的表中并为每个关键字创建一条记录会更好吗?

表可以有列 ID(INT PK)、imageId(INT KEY)、keyword(VARCHAR)。

我看到的唯一问题是每张图片都有数百个重复的关键字?

有人在工作中简短地提到了一些关于查找表来解决这个问题,但他们没有解释它到底是什么。

【问题讨论】:

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


    【解决方案1】:

    您可以添加另一个表,包括带有字段 id、关键字的命名标签。并在表格中代替关键字使用标签表的id。

    【讨论】:

    • 谢谢,这很有意义。我创建了一个参考表来将图像与关键字联系起来,因为参考表只是一堆数字,我没有看到任何重大的性能问题,尤其是我拥有的少量图像。
    • @imperium2335 顺便说一下,这称为表规范化。您写道:“目前,我将所有标签字/关键字放在一个列中,每个图像记录用空格分隔。”有时这也可以是数据库设计的一种方式。但总的来说,你应该避免它。它是非原子形式。一个字段不应包含多个值。
    【解决方案2】:

    空格分隔或以其他方式分隔可能是您最糟糕的选择。不过,您不需要所有标签的查找表,我会这样做:

    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。也就是说,你可以 - 如果你想要一个有限的标签宇宙,那就是。

    【讨论】:

      【解决方案3】:

      "该表可能包含列 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 关系在这种情况下是如何工作的。

      【讨论】:

        【解决方案4】:

        我的偏好是只存储一次关键字/标签,然后将它们重复用于其他图像。

        一张图片拥有并属于很多标签

        图片

        • 身份证
        • 姓名
        • 文件

        标签

        • 身份证
        • 姓名
        • 已创建

        images_tags

        • image_id
        • tag_id

        然后,您可以在给定图像记录的所有标签上使用组连接。 见-Aggregate functions and grouping

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-09
          • 2012-11-29
          • 1970-01-01
          • 2011-06-18
          相关资源
          最近更新 更多