你们# 39;s更好?是否在数据库上的国家、州和城市


What's better? Countries, States and Cities on DataBase or not?

我正在开发一个网站与PHP &MySQL用户可以在那里注册。在报名表格中,他们需要填写国家、州和城市。我想知道是否把它保存在我的数据库上是个好主意。我很困惑,因为Facebook、谷歌和其他网站都有自动完成表单,这些输入标签会提示你的国家、州甚至城市。

您不应该像country_id, state_idcity_id那样单独保存这三个。原因是这是多余的信息。一个城市隐含地属于一个州,属于一个国家。通过将它们保存为单独的值,您不会获得任何信息,并且只会引入混淆数据的风险(因为您可以将Japan, Washington, Berlin保存为一个集合,这是无效且不一致的信息)。

您应该在数据库中创建一个层次树。城市有一个母州有一个母国。然后你只需要询问用户所在的城市,其他信息都是隐式的。你从哪里得到这些数据是另一个话题。例如,你可以试试Google的API。

问题是你是想让它适用于世界上的每个人,还是只适用于美国的地址——以及你试图收集信息的目的是什么。

如果你的网站是电子商务,你想收集送货地址,你需要对你的输入有一个相当高质量的验证——否则UPS不会把东西送到你的客户那里。

另一方面,如果你只是想有一个相当好的想法,人们在哪里,但它不是必要的邮政地址质量,只需使用一个免费的web服务,如PlaceFinder

http://developer.yahoo.com/geo/

它应该允许您让您的用户只输入地址,而不将其拆分为城市/州/国家,并且只将结果位置ID (woeid)存储在数据库中。

一般来说,我建议你有一个只读的国家列表,所以用户只能选择但不能添加。然后,对于州和城市,有一个预加载的列表,但允许用户添加一个。(你可以从任何你想要的互联网数据库或服务中预加载这些列表,比如雅虎)。

在任何情况下,建议都是一个非常好的加分项,对他们(因为可用性)和对你(因为它会减少数据重复)

希望这对你有帮助。欢呼声

还要考虑到,有些城市有相同的名称,但位于不同的国家。里加是拉脱维亚的首都,也是美国密歇根州的首都。

这取决于你的业务需求。如果你想提供区域化的服务(基于用户的地理区域),那么是的,你一定要在数据库中保存这些区域。

另一方面,您将不得不设计您的数据库来容纳您的地区(至少有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 ;

使用上述结构进行城市到国家的映射。您还可以标记顶级城市和国家。