【问题标题】:Database Design to Search Multiple Colors用于搜索多种颜色的数据库设计
【发布时间】:2016-09-18 09:16:33
【问题描述】:

问题:如何使用这种数据库设计搜索最多五种颜色?如果不可能,有没有更好的解决方案?

这是我建立的颜色搜索,它适用于一种颜色,但我试图让某人搜索多达 1-5 种颜色,理想情况下它会找到具有全部或部分颜色的媒体颜色。

查询输入以十六进制代码开头,然后转换为 RGB。我目前最多存储 5 种颜色(将来可能最多存储 8 种)。

CREATE TABLE `media_has_colors_unique_index` (
  `media_id` int(9) unsigned NOT NULL,
  `red` int(3) unsigned NOT NULL,
  `green` int(3) unsigned NOT NULL,
  `blue` int(3) unsigned NOT NULL,
  `hex` varchar(6) NOT NULL DEFAULT '',
  `percentage` double unsigned NOT NULL,
  `sequence` int(11) unsigned NOT NULL,
  PRIMARY KEY (`media_id`,`red`,`green`,`blue`),
  KEY `index_on_hex` (`hex`),
  KEY `index_on_percentage` (`percentage`),
  KEY `index_on_timestamp` (`sequence`),
  KEY `index_on_media_id` (`media_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以下是我在包含大约一百万条记录的临时数据库上运行的查询示例:

SELECT media_id, hex, percentage
FROM media_has_colors_unique_index
WHERE 
((red BETWEEN 41 AND 50) AND (green BETWEEN 166 AND 203) AND (blue BETWEEN 216 AND 264)) 
    AND 
((red BETWEEN 137 AND 168) AND (green BETWEEN 215 AND 262) AND (blue BETWEEN 223 AND 272))
GROUP BY media_id
HAVING percentage > 0.3
LIMIT 100;

查询中读取BETWEEN 41 AND 50 的部分是通过基于百分比计算匹配阈值为PHP 中的每个颜色通道动态创建的:MIN = ceil($rgb[0] * .9)MAX = ceil($rgb[0] * 1.1)。在任一方向上基本上为 10% — 这允许在视觉上与原始颜色搜索相似的一系列颜色匹配。

问题:如何使用这种数据库设计搜索最多五种颜色?如果不可能,有没有更好的解决方案?

【问题讨论】:

  • 你不清楚你想要什么。 “按多种颜色搜索”是什么意思?还是“搭配多种颜色”?请阅读有关 MVCE 的信息。示例输入、查询和所需输出很有帮助。您的示例查询返回颜色在第一个 3-D 范围且是第二个 3-D 范围内的媒体。不是颜色在第一范围内的介质和颜色在第二范围内的介质。后者是颜色在第一个范围内或在第二个范围内的媒体。如果您想要这些媒体,请使用 OR 而不是 AND。 (但不清楚你想要什么。)
  • @philipxy 嗯我不确定如何让我的问题更清楚......但它仍然是“我如何使用这个数据库设计搜索多种颜色,或者如果不是这个,我可以使用什么数据库设计?”对我来说,很明显在搜索时你想要匹配,所以“搜索依据”或“匹配依据”确实是一回事。但基本上我试图让某人搜索多达 1-5 种颜色,理想情况下它会找到具有全部或部分颜色的媒体。
  • 您最后说“查找具有所有或部分颜色的媒体”。 (尽管“全部”是多余的。)“搜索”和“匹配”表示您在寻找某些东西,但它们并没有表达 标准 是什么。例如,与“查找媒体(具有所有这些颜色)”进行比较。写一些的东西符合你的理解是不够的,你必须写一个规范合同导致对方心中的那种理解。 (事实证明,“颜色”的意思是“3-D 颜色范围”。)

标签: mysql schema database-schema


【解决方案1】:

查找具有所有或部分颜色的媒体

您的示例查询返回颜色在第一个 3-D 范围内且是第二个 3-D 范围内的媒体。不是颜色在第一范围内的介质和颜色在第二范围内的介质。后者是具有在第一个范围内或在第二个范围内的颜色的媒体。如果您想要这些媒体,请使用 OR 而不是 AND。

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2019-05-23
    • 2013-08-02
    相关资源
    最近更新 更多