我有一个应用程序,店主可以在其中输入 10 个邮政编码,他们可以在其中提供服务。目前,这些邮政编码存储在单个表列中。现在基于此进行搜索的最佳和有效方法是什么?我应该将所有邮政编码(所有美国邮政编码)存储在表格中并建立many to many
关系还是使用思维狮身人面像根据当前字段进行文本搜索?
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)
);
如果您使用 sphinx 进行地理空间搜索(不是真的,我想您可以使用文本文件或 xml),您将需要数据库中的邮政编码和纬度/经度。
通过地理空间搜索,我的意思是“查找您所在位置 20 英里内的商店”
为了灵活性和效率,我会选择#1 ....
“将所有邮政编码存储在一个表中并建立多对多关系”
...假设您还需要存储其他邮政编码数据字段(城市、州、县、纬度/经度等)。在这种情况下,您的交叉点将是:shop_id 到 zipcode_id(s)。但是,如果您不需要/没有扩展邮政编码数据字段,那么在我看来,一个单独的带有 shop_id 到实际邮政编码(不是 id)的表就可以了。