BIRTに問題があります。301,90,96,121,139,367,291,296,298を文字列としてこのクエリ「SELECTdishs.namefromdiaches.idIN(?)」に渡すことができないことに気付きました。しかし、私のデータベースは、コンマ単位のIDを使用する必要があるように構成されています。これを解決する方法はありますか?ありがとう!
1 に答える
回避策は、MySQL関数FIND_IN_SET()を使用することです。
SELECT dishes.name from dishes where FIND_IN_SET(dishes.id, ?)
ただし、これはひどく実行されることに注意してください。カンマで区切られた値のリストの途中に検索のインデックスを付ける方法はありません。したがって、これは毎回テーブルスキャンを引き起こすことになります。
リスト内の個々の値を検索する必要がある場合は、リストをコンマ区切りの文字列として保存しないことをお勧めします。
コメントを再確認してください。
デフォルトとして正規化します。次に、非正規化して特定のクエリを最適化します。非正規化は、他のクエリを犠牲にして、データに対して1つのクエリを最適化することに注意してください。
たとえば、がある場合はbooks <--> authors
、本の著者をコンマ区切りのリストとして本のテーブルに保存することで、非正規化できます。これにより、結合を回避できるため、本のすべての著者をすばやく照会できます。ただし、特定の著者のすべての本を照会するのは効率が悪くなります。
したがって、どのクエリを最も効率的にする必要があるのか、どのクエリを効率を下げることができるのかを知る必要があります。これは完全にアプリケーションに依存します。
すべてのクエリを同等に効率化する必要がある場合は、データを正規化された形式で保持してください。