具有标签数据库设计考虑的图像

时间:2012-10-15 15:07:40

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

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

照片中没有与之关联的标签。

目前,我在列中的所有标记词/关键字都以每个图像记录的空格分隔。

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

所以我的问题是,在自己的表中使用关键字和每个关键字的记录会更好吗?

该表可以包含列ID(INT PK),imageId(INT KEY),关键字(VARCHAR)。

我看到的唯一问题是,每张图片最终可能会有数百个重复的关键字?

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

4 个答案:

答案 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)

我的偏好是只存储一次关键字/标签,并将其重复用于其他图片。

图片拥有并属于许多标签

图片

  • ID
  • 名称
  • 文件

<强>代码

  • ID
  • 名称
  • 创建

<强> images_tags

  • image_id
  • TAG_ID

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