簡體   English   中英

數據庫設計以搜索多種顏色

[英]Database Design to Search Multiple Colors

問題:使用這種數據庫設計,如何最多搜索五種顏色? 如果不可能,是否有更好的解決方案?

這是我構建的一種顏色搜索,它對一種顏色非常有用,但是我正嘗試允許某人搜索多達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;

通過基於百分比計算匹配閾值,可以為PHP中的每個顏色通道動態創建查詢部分,即BETWEEN 41 AND 50之間的關系: MIN = ceil($rgb[0] * .9)MAX = ceil($rgb[0] * 1.1) 在任一方向上基本上為10%,這允許在顏色上仍與原始顏色搜索相似的顏色匹配范圍。

問題:使用這種數據庫設計,如何最多搜索五種顏色? 如果不可能,是否有更好的解決方案?

查找具有全部或部分這些顏色的介質

您的示例查詢返回的介質的顏色在第一個3-D范圍內,而第二個3-D范圍內。 顏色不在第一范圍內的介質和顏色不在第二范圍內的介質。 后者是具有第一范圍內的顏色或第二范圍內的顏色的介質。 如果您想要這些媒體,請使用OR而不是AND。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM