この質問のさまざまな化身が以前にここで尋ねられましたが、もう一度試してみようと思いました.
データベースのレイアウトがひどいものでした。1 つのエンティティ (ウィジェット) が 2 つのテーブルに分割されました。
CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment)
CREATE TABLE widget_data (
widget_id int(10),
field ENUM('name','size','color','brand'),
data TEXT)
これは理想的ではありませんでした。特定の名前、色、ブランドのウィジェットを見つけたい場合は、widget_data テーブルで 3 方向の結合を行う必要がありました。だから私は合理的なテーブルタイプに変換しました:
CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment,
name VARCHAR(32),size INT(3),color VARCHAR(16), brand VARCHAR(32))
これにより、ほとんどのクエリが大幅に改善されます。しかし、それは検索を難しくします。以前は、「%black%」などのウィジェットを検索したい場合は、SELECT * FROM widget_data WHERE data LIKE '%black%'
. これにより、黒色のウィジェット、またはブラックウェル産業などによって作成されたウィジェットのすべてのインスタンスが得られます。どのフィールドが一致したかを正確に把握し、それをユーザーに表示することもできます。
新しいテーブル レイアウトを使用して同様の検索を実行するにはどうすればよいですか? もちろんできますWHERE name LIKE '%black%' OR size LIKE '%black%'...
が、それは不格好に思えます。また、どのフィールドが一致したかはまだわかりません。照合する列ごとに個別のクエリを実行できます。これにより、すべての一致とその一致方法が得られますが、パフォーマンスが低下します。何か案は?