从七个质量列表中查找具有*一个或多个*质量的数据库行的有效方法

时间:2011-01-14 00:45:30

标签: php mysql search

对于这个问题,我想看看是否有人更好地了解如何实施我目前正计划实施的内容(下图):

我正在使用数据库跟踪一组图像。每个图像由一行表示。

我希望能够使用许多不同的搜索参数搜索图像。其中一个参数涉及逐个颜色搜索选项。 (其余搜索内容目前工作正常。)

此数据库中的图像最多可包含七种颜色:

- 红色

- 橙色

- 黄色

- 绿色

-Indigo

-Violet


以下是一些示例用户查询:

“我想要一张包含红色的图片。”

“我想要一张包含红色和蓝色的图片。”

“我想要一个包含黄色和紫色的图像。”

“我想要一张包含红色,橙色,黄色,绿色,蓝色,靛蓝色和紫罗兰色的图像。”


等等。用户通过使用html表单中的复选框进行此选择。他们可以检查零复选框,全部七个,以及介于两者之间的任何内容。

我很想知道人们认为什么是执行此数据库搜索的最有效方式。

我现在有两种可能的选择,但我觉得必须有一些我没想到的更好的东西。

(选项1)
- 对于每一行,数据库中只有七个附加字段,每种颜色一个。每个字段保存1或0(真/假)值,并根据用户已检查的内容进行选择。 (我不太喜欢这个解决方案,因为添加七个额外的字段似乎有点浪费...特别是因为这个表中的大多数图片最多只有3-4种颜色,尽管有些可以最多有7个。这意味着我存储了很多零。)另外,如果我稍后添加了更多可搜索的颜色(我认为不会,但它总是可能的),我必须添加更多字段。

(选项2)
- 对于每个图像行,我可以有一个“颜色”文本字段,用于存储空格分隔的颜色名称(或者为了紧凑而使用数字)。然后我可以通过字段进行全文匹配搜索,选择包含“红黄绿”(或“1 3 4”)的行。但我有点不想进行全文搜索,因为我已经允许进行关键字搜索,而且我真的不想每次搜索图像进行两次全文搜索。另外,如果数据库变大,全文的内容可能会变慢。

我没有想到的任何更好的选择?

谢谢!

备注:我正在使用PHP来处理MySQL数据库。

3 个答案:

答案 0 :(得分:4)

您可以创建第二个名为colors的表。

  colors = (color_id, name)

和一个名为image_colors的关系表。

  image_colors = (image_id, color_id)

然后在image_colors表中为每个图像的每种颜色添加一行。

 image_colors
 Image_id     Color_id
  1            1
  2            3
  2            4

因此,图像1具有单色,但图像2具有两种颜色。

要查找说明颜色为4和5的图像,您可以

    select  i.fileName, etc
    from images i JOIN image_colors c ON
         i.image_id = c.image_id
    where
         c.color_id = 4 OR
         c.color_id = 5

此解决方案的优点是易于查询。

答案 1 :(得分:1)

假设颜色列表永远不会(或非常非常罕见)发生变化,向图像表中添加7个附加列可能更有效。对规范化它们产生的每个查询的连接和重复数据删除通常比使行宽7个字段所产生的额外I / O更昂贵。

对于它的价值,如果你有机会转向Oracle,那么bitmap indexes就是为这种事情而构建的。

答案 2 :(得分:0)

您可以存储一个额外的INT字段并存储1个数字,表示相关颜色的Flags按位定义。搜索时,您只需执行相同的按位操作即可查询特定的整数值。

请看Mark Cain对此MySql参考手册页的评论,以获得我提议的一个很好的例子:

http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html