我正在开发一个使用 PHP 和 MySQL 的网站,用户可以在其中注册。在注册表单中,他们需要填写国家、州和城市。我想知道将它保存在我的数据库中是否是个好主意。我很困惑,因为 Facebook、谷歌和其他人都有自动填写表单,这些输入标签会建议你所在的国家、州甚至城市。
6 回答
您不应该单独保存所有三个,country_id
例如state_id
和city_id
。原因是这是冗余信息。一个城市隐含地属于一个国家属于一个国家。通过将它们保存为单独的值,您不会获得任何信息,只会引入混淆数据的风险(因为您可以将日本、华盛顿、柏林保存为一组,这是无效且不一致的信息)。
您应该在数据库中创建一个层次树。城市有一个母州有一个母国。然后你只需要向用户询问他们的城市,所有其他信息都是隐含的。从哪里获取数据是一个不同的主题。例如,您可以尝试 Google 的 API。
问题是你是否想让它适用于世界上的每个人,或者只适用于美国地址——以及你试图收集信息的目的是什么。
如果您的网站是电子商务网站并且您想收集送货地址,则您需要对您的输入进行相当高质量的验证——否则 UPS 不会将这些东西交付给您的客户。
另一方面,如果您只是想对人们的位置有一个相当好的了解,但邮政地址质量并不重要,只需使用像 PlaceFinder 这样的免费网络服务
http://developer.yahoo.com/geo/
它应该允许您让您的用户只输入地址而不将其拆分为城市/州/国家/地区,并且只需将生成的地点 ID (woeid) 存储在您的数据库中。
一般来说,我建议你有只读的国家列表,所以用户只能选择但不能添加。然后,对于州和引用,有一个预先加载的列表,但允许用户添加一个。(您可以从任何您想要的 Internet 数据库或服务中预加载此列表,例如 yahoo 的)。
在所有情况下,建议对他们(因为可用性)和您(因为它会减少数据重复)来说都是一个很好的加分项
希望这可以帮助。干杯
Also take into account, that there are cities which have the same name but are located in separate countries. Riga is a capital city of Latvia and also Riga is in USA, Michigan.
这取决于您的业务需求。如果您想提供区域化服务(具有基于用户地理区域的 logc),那么是的,您绝对应该将这些区域保存在数据库中。
另一方面,您必须设计您的数据库来保存您的区域(至少有 3 个表处于 1-n 关系或 1 个表具有父/子关系)并用有效数据填充该数据库 - 您是否拥有所有国家/地区/来自世界各地的州和城市?
CREATE TABLE `pl_countries` (
`countryID` int(4) NOT NULL auto_increment,
`iso` char(2) NOT NULL,
`name` varchar(80) NOT NULL,
`printable_name` varchar(80) NOT NULL,
`iso3` char(3) default NULL,
`numcode` smallint(6) default NULL,
`top_flag` tinyint(1) NOT NULL,
`status` tinyint(1) NOT NULL,
PRIMARY KEY (`countryID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE `cities` (
`city_id` bigint(20) NOT NULL auto_increment,
`countryID` bigint(20) NOT NULL,
`city` varchar(30) NOT NULL default '',
`top_city` tinyint(1) NOT NULL,
PRIMARY KEY (`city_id`),
KEY `country_id` (`country_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
使用上述结构进行城市到国家的映射。您还可以标记顶级城市和国家。