I have an app where shop owners can enter 10 zip codes in which they can provide services. Currently these zip codes are stored in single table column. Now what is the best and efficient way to do search based on this? Should I store all zip codes(all US zip codes) in a table and establish many to many
relationship or do text search based on the current field using thinking sphinx?
3 に答える
データベース担当者の視点 . . .
Sphinx の使用について話しているので、このように 10 個の郵便番号すべてを 1 つの行に格納していると思います。
shop_id zip_codes
--
167 22301, 22302, 22303, 22304, 22305, 22306, 22307, 22308, 22309, 22310
検索や他のいくつかの理由から、このように保存する方がはるかに良いでしょう。
shop_id zip_codes
--
167 22301
167 22302
167 22303
167 22304
167 22305
167 22306
167 22307
167 22308
167 22309
167 22310
-- Example in SQL.
create table serviced_areas (
shop_id integer not null references shops (shop_id), -- Table "shops" not shown.
zip_code char(5) not null,
primary key (shop_id, zip_code)
);
この 1 つの変更を行った後は、停止することをお勧めします。
ただし、dbms が正規表現をサポートしている場合は、データベースに他の変更を加えることなく、データの整合性を大幅に向上させることができます。この種の dbms サポートにより、zip_code 列に 5 つの整数のみが含まれ、文字が含まれていないことを保証できます。(5 つの整数と文字なしを保証する他の方法があるかもしれません。)
郵便番号のテーブルを使用すると、データの整合性がさらに向上します。しかし、ショップのオーナーは最初から有効な郵便番号を入力することに既得権を持っており、これ以上努力する価値はないと簡単に主張できます。郵便番号は頻繁に変更されます。郵便番号の「完全な」表が非常に長い間正確であるとは思わないでください。また、新しい郵便番号と期限切れの郵便番号の両方を処理するための明確な手順が必要です。
-- Example in SQL
create table zip_codes (
zip_code char(5) primary key
);
create table serviced_areas (
shop_id integer not null references shops (shop_id),
zip_code char(5) not null references zip_codes (zip_code),
primary key (shop_id, zip_code)
);
sphinx を使用して地理空間検索を行う場合は、データベースに郵便番号と緯度/経度が必要になります (実際には、テキスト ファイルまたは xml を使用できると思います)。
地理空間検索とは、「現在地から 20 マイル以内の店舗を探す」のようなものです。
柔軟性と効率性のために、私は 1 番を選びます ....
「すべての郵便番号をテーブルに保存し、多対多の関係を確立する」
...他の郵便番号データ フィールド (都市、州、郡、緯度/経度など) も格納する必要があると仮定します。その場合、交差点は次のようになります: shop_id から zipcode_id(s)。ただし、郵便番号データ フィールドを拡張する必要がない、または拡張していない場合は、実際の郵便番号 (id ではない) への shop_id を持つ単一の個別のテーブルで問題ないと思います。