0

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

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

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

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

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

该表可能有列 ID(INT PK)、imageId(INT KEY)、关键字(VARCHAR)。

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

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

4

4 回答 4

1

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

于 2012-10-15T15:11:28.017 回答
-1

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

一个图像有并且属于许多标签

图片

  • ID
  • 姓名
  • 文件
  • ETC

标签

  • ID
  • 姓名
  • 创建

图像标签

  • image_id
  • tag_id

然后,您可以在给定图像记录的所有标签上使用组串联。请参阅 -聚合函数和分组

于 2012-10-15T15:16:36.287 回答
-1

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

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

ETC

至关重要的是,您不需要包含所有这些词的 T_TAG。也就是说,你可以——如果你想要一个有限的标签宇宙,那就是。

于 2012-10-15T15:10:42.690 回答
-1

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

于 2012-10-15T15:11:05.240 回答