MySQL データベースの「アドレス」テーブルにアドレスがあります。このテーブルには、住所 ID 列と、名前、1 行目、2 行目、郊外、州、郵便番号など、通常の住所関連の列が含まれています。多くのフィールドでは NULL が許可されます。
これは、クライアント側の Web ベースのインターフェイスで使用されます。ユーザーは、アドレスの一部をテキスト ボックスに入力することで、テーブルからアドレスを検索して選択できます。一致が表示され、ユーザーは 1 つを選択できます。
テキスト ボックス内の用語は、スペースで区切られた一連の検索用語として扱われ、選択のために表示されるには、各用語がいずれかのアドレス フィールドに存在する必要があります。
私はこれのためのいくつかの実装方法の間で引き裂かれています:
現在の方法:
- ページの読み込み時に、非同期 HTTP リクエスト (「AJAX」) を使用して、きれいにフォーマットされたリスト (空白のフィールドを考慮してすべてのフィールドを 1 行にまとめたもの) ですべてのアドレスを取得します。
- テキスト ボックスが入力を受け取るたびに、jQuery を使用して、このリスト内の一致を見つけて表示します。
このアプローチの利点は、送信する必要がある単純なクエリは 1 つだけであり、検索はクライアント側で行われるため、検索フィールドに入力してから応答を確認するまでに遅延がないことです (ただし、これはうまく拡張できない場合があります。以下を参照してください)。 . また、複雑な SQL 検索の必要性を回避します (これは嫌いではありません。概念実証として何かを実装したかっただけで、この方法の方が高速でした)。
欠点はもちろん、ページが読み込まれるときにページがすべてのアドレスを取得する必要があり、データベースが何千ものアドレスを格納することになる可能性が高いことです。
もう 1 つの方法は、ユーザーがテキスト ボックスに入力するたびに HTTP 要求を送信することです。これにより、SQL を使用したテーブルの検索に一致するアドレスが返されます。より多くのリクエストとより大きな遅延が必要ですが、毎回アドレスのサブセットを取得して転送するだけで済みます。必要に応じて、最小期間の長さとポーリング頻度を簡単に調整できます。
これのSQL側を実装する最良の方法について疑問に思っています...
検索可能なすべてのアドレス列を連結するビューを作成し、「concatcolumn LIKE '%term1%' AND concatcolumn LIKE '%term2%' AND concatcolumn LIKE '%termN%'」の行に沿って WHERE 句を含むクエリを使用するのが最善でしょうか? "?
アイデアや提案は大歓迎です。