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