質問:このデータベースデザインでは、最大5色までどのように検索できますか?それが不可能な場合は、よりよい解決策がありますか?複数の色を検索するデータベースデザイン
これは私が作成したカラー検索で、1つの色にはうまくいきますが、誰かが最大で1〜5色を検索できるようにしようとしています。理想的には、それらの色の。
クエリ入力は16進コードで始まり、次に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%です。これにより、元のカラー検索と視覚的に似ている範囲の色一致が可能になります。
質問:このデータベースデザインでは、最大5色までどのように検索できますか?それが不可能な場合は、よりよい解決策がありますか?
あなたが望むものについては明確ではありません。 「複数の色で検索する」とはどういう意味ですか?または「複数の色と一致する」? MVCEについてお読みください。入力、クエリ、および望ましい出力の例が役立ちます。あなたのサンプルクエリは、最初の3-D範囲にあり、2番目の3-D範囲にある色のメディアを返します。最初の範囲の色のメディアと2番目の範囲の色のメディアではありません。後者は、第1の範囲にある色または第2の範囲にある色を有する媒体である。これらのメディアが必要な場合は、ANDの代わりにANDを使用します。 (しかし、あなたが望むものは明確ではありません) – philipxy
@philipxyええ、私は私の質問をより明確にすることはできません...しかし、それはまだです "このデータベースデザインでは、どうやって複数の色で検索できますか?この1つ、私は使用できるデータベース設計は何ですか?私には、あなたが検索したときに一致するものが見つかると、「検索する」または「一致する」という検索結果が実際に同じものであることは明らかです。しかし基本的には、誰かが最大で1〜5色を検索できるようにしたいと考えています。理想的には、それらの色のすべてまたは一部を持つメディアを見つけるでしょう。 – stwhite
最後に、「それらの色のすべてまたは一部を持っているメディアを見つける」と言いました。 (「すべて」は冗長ですが)「検索」と「一致」は何かを求めていると言いますが、*基準*が何であるかを表現していません。たとえば、「メディアを見つける(すべて*すべての*その色を持つ)」と比較してください。一貫した*いくつかのことを理解して書くだけでは不十分です。他の人の心にその理解をもたらす*仕様*または*契約*を書く必要があります。 (そして、 "色"は "3次元色範囲"を意味することが判明しました。) – philipxy