2012-10-25 123 views
1

我有一個應用程序,其中店主可以輸入10個郵政編碼,使他們能夠提供的服務。目前這些郵政編碼存儲在單個表格列中。現在,基於此的最佳和有效的搜索方式是什麼?我是否應該將所有郵政編碼(所有美國郵政編碼)存儲在一個表格中,並建立many to many關係或使用思維獅身人面像根據當前字段進行文本搜索?郵編基於搜索

+0

你知道這種寶石? https://github.com/jim/carmen(可悲的是裏面沒有郵政編碼) – apneadiving

+0

不知道。有一天會有用:) – benchwarmer

回答

3

數據庫傢伙的觀點。 。 。

既然你在談論使用獅身人面像,我想你存儲在一個單一的行中的所有10個郵政編碼,像這樣。

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) 
); 

你可以做一個很好的例子使這一單更改後停止。

但是你可以提高數據的完整性而基本上不進行任何其他更改到你的數據庫,如果你的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) 
); 
1

如果你使用的獅身人面像做地理空間搜索您需要的郵編加上經/緯度在你的數據庫(不是真的,你可以使用一個文本文件或XML我想)。

通過地理空間搜索我的意思是這樣

0

爲了提高靈活性和效率「你的位置的20英里範圍內查找商店」,我會選#1 ....

「存儲所有郵政編碼在表中,並建立多對多的關係 」

...的假設還需要存儲其他郵政編碼數據字段(市,州,縣,緯度/龍等)。在這種情況下,您的交集將是:shop_id到zipcode_id(s)。但是,如果您不需要/擴展郵政編碼數據字段,那麼在我看來,一個單獨的帶有shop_id的單獨表格可以用於acacal zipcode(不是id)。