2009-08-26 20 views
2

私の一般的な問題は、ユーザが実際にアイテムと関連付けるために異なるタイプのフィールドの任意の数を追加できるようにすることです。ユーザーは自分のアイテムの一部に「生年月日」パラメータを追加したい場合は、我々はパラメータテーブルに一つのパラメータを追加しますMySQLでのORDER BY COALESCEのパフォーマンスへの影響

table `items` 
item_id | name 

table `parameters` 
parameter_id | name | type 

table `values` 
item_id | parameter_id | datetimevalue | datevalue | integervalue | etc... 

、その後、一つのエントリ:だから私は検討しています一つの解決策は次のとおりです。彼がこのパラメータを持つことを望む各項目の値テーブルでは、日付はdatevalue列にあり、他のすべての 'value'フィールドはnullのままです。

は、私がこの順はパフォーマンスになり、

SELECT * from 
items 
join values on items.item_id = values.item_id 
join parameters on parameters.parameter_id = values.parameter_id 

where parameter_id = 1 
order by coalesce(values.datetimevalue, values.datevalue, values.integervalue...) 

私の具体的な質問があるだろう、= 1 PARAMETER_IDたこのパラメータを想定し、「誕生日」によって彼のアイテムを注文するには?それは指標をうまく使うのだろうか?それは不必要な仕事をしますか?

私の一般的な質問は、このアプローチは良い方法ですか?これを行うより良い方法はありますか?

答えて

1

あなたはEAVモデリングについて話しています。

は、インデックスを利用することができなくなります EAV modelling

+1

ありがとうございました!それは私が話していることです!このようにしてORDER BY COALESCEを使用することについて誰かに教えてもらえれば、私はまだ不思議です... –

0

COALESCEこの順...を見てください。 COALESCEは重要ですか?あなたが単一のパラメータを見ているのであれば、すべての値が同じ型であるため、列による順序付けで十分です。

"ORDER BY datetimevalue、datevalue、integervalue"を実行した場合、このクエリは(parameter_id、datetimevalue、datevalue、integervalue)のインデックスを利用できます。

弱点:1)ちょっと乱雑に見える2)値の列がたくさんあり、値テーブルが大きくなると、インデックスは無駄なスペースと読み書きになります。

代わりに値テーブルに「sort_order」(または何か)の列を追加して代わりに索引を付けたほうがよい場合があります。また、異なるタイプの値をソートする必要があるため、実際にCOALESCEが必要な場合は、適切な処理を行うsort_order計算を選択できます。

関連する問題