0

**ここで使用する PHP/MySQL **

シナリオ:

ある配送会社は全国に多数のデポ/倉庫を持っており、各デポは選択された都市/町のみをカバーしています。ユーザーがサイトにアクセスすると、最寄り/ローカルのデポを検索できます。

2 つのオプションを検討しました。それぞれを以下に説明します。

オプション 1 (機能しません):

各デポを緯度と経度で保存し、単純な半径検索を行ったので、ユーザーが都市/町に入ると、Google マップを使用してジオコーディングし、半径クエリを実行して 25 マイル以内にあるすべてのデポを取得しました。これは機能します。

しかし、これには大きな欠点があります。一部のデポは、選択した町/都市をカバーしておらず、半径検索はこれを考慮していないため、そのエリアをカバーしていなくても結果にデポ/倉庫が表示されます。

オプション 2:

町/都市のリストを 1 つのデータベース テーブルに保存し、デポを別のテーブルに保存します。次に、リレーションシップ テーブルを用意し、デポをそれらがカバーする町/都市にリンクします。ユーザーは正確な都市LIKE名 (ここでは mySQL を使用) を入力して結果を返す必要があります。これにより、都市テーブルが検索LEFT JOINされ、depots テーブルが検索されます。

ここでの欠点は、リレーションシップ テーブルが急速に大きくなり、最大 500 万のレコードを持つことができることです。これにより、後の段階でパフォーマンスの問題が発生する可能性があります。

オプション 2 のデータベース設計:

デポテーブル

-   ID
-   D_NAME
-   D_ADDRESS
-   D_POSTCODE
-   D_TEL
-   AND SO ON…

シティテーブル

-   ID
-   NAME

関係表

-   ID
-   CITY_ID
-   DEPOT_ID

質問:

私が取ることができる他のオプションはありますか?

オプション 2 は正しいアプローチであり、パフォーマンスの点で問題ありませんか?

ありがとう。

4

1 に答える 1

0

あなたが説明している関係テーブルに問題はありません。都市テーブルに検索語 (都市名だと思います) と外部キー ID の複合インデックスがある限り、問題なく動作するはずです。

完全なワイルドカード検索 (バンクーバーを見つけるため) を提供したくないでしょうがLIKE %ancouv%、検索をプレフィックス検索 ( LIKE vancou%) に制限する必要があります。そうしないと、インデックスは役に立たず、データベース サーバーは完全なテーブル スキャンを実行する必要があります。

テストするときは、EXPLAIN SELECT ...コマンドを使用して、インデックスが使用されていることを確認します。また、常に現実的な量のテスト データでテストする必要があります。テスト データのセットが小さい場合、クエリ オプティマイザーは、前述の数百万行の場合とは異なるパスを選択する可能性があります。たとえば、非常に小さなテーブルの場合、インデックス ルックアップの代わりにフル スキャンを実行する方が適切であると判断され、インデックスがまったく使用されていないと思われる可能性があります。

于 2013-03-31T15:19:30.280 に答える