1

我有一个应用程序,店主可以在其中输入 10 个邮政编码,他们可以在其中提供服务。目前,这些邮政编码存储在单个表列中。现在基于此进行搜索的最佳和有效方法是什么?我应该将所有邮政编码(所有美国邮政编码)存储在表格中并建立many to many关系还是使用思维狮身人面像根据当前字段进行文本搜索?

4

3 回答 3

3

数据库专家的观点。. .

由于您在谈论使用 Sphinx,我假设您将所有 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)
);
于 2012-10-25T15:32:54.823 回答
1

如果您使用 sphinx 进行地理空间搜索(不是真的,我想您可以使用文本文件或 xml),您将需要数据库中的邮政编码和纬度/经度。

通过地理空间搜索,我的意思是“查找您所在位置 20 英里内的商店”

于 2012-10-25T22:50:48.603 回答
0

为了灵活性和效率,我会选择#1 ....

“将所有邮政编码存储在一个表中并建立多对多关系”

...假设您还需要存储其他邮政编码数据字段(城市、州、县、纬度/经度等)。在这种情况下,您的交叉点将是:shop_id 到 zipcode_id(s)。但是,如果您不需要/没有扩展邮政编码数据字段,那么在我看来,一个单独的带有 shop_id 到实际邮政编码(不是 id)的表就可以了。

于 2012-10-29T16:23:47.273 回答