什么更好? DataBase上的国家,州和城市与否?

时间:2011-07-07 04:35:53

标签: php mysql integrity

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

6 个答案:

答案 0 :(得分:2)

问题在于您是想让它适用于世界上的每个人,还是仅仅针对美国地址 - 以及您尝试收集信息的目的。

如果您的网站是电子商务,并且您想要收集送货地址,则需要对输入进行相当高质量的验证 - 否则UPS将无法向您的客户提供这些内容。

如果另一方面,你只是想要很好地了解人们的位置,但是拥有邮政地址质量并不是必不可少的,只需使用像PlaceFinder这样的免费网络服务

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

它应该允许您让用户只需键入地址,而无需将其拆分为城市/州/国家/地区,只需将生成的地点ID(woeid)存储在您的数据库中。

答案 1 :(得分:2)

您不应单独保存所有三个,例如country_idstate_idcity_id。原因是这是多余的信息。城市隐含属于属于国家的国家。您没有通过将它们保存为单独的值来获取任何信息,并且只会引入弄乱数据的风险(因为您可以将日本,华盛顿,柏林保存为一组,这是无效且不一致的信息)。

您应该在数据库中创建一个分层树。城市拥有父国有父国。然后,您只需要询问用户他们的城市,所有其他信息都是隐含的。从中获取数据的地方是另一个主题。例如,您可以尝试使用Google的API。

答案 2 :(得分:1)

通常,我建议您拥有国家/地区的只读列表,因此用户只能选择但不能添加。然后,对于州和城市,有一个预先加载的列表,但允许用户添加一个。 (您可以从任何您想要的互联网数据库或服务预加载此列表,例如雅虎)。

在所有情况下,建议对他们(因为可用性而言)和对你来说是非常好的加分(因为它会减少数据重复)

希望这会有所帮助。干杯

答案 3 :(得分:0)

这取决于您的业务要求。如果您想提供区域化服务(具有基于用户地理区域的logc),那么您应该在数据库中保留区域。

另一方面,您必须设计数据库来保存您的区域(至少3个表为1-n关系或1个表与父/子关系)并用有效数据填充该数据库 - 你有吗?来自世界各地的所有国家/州和城市?

答案 4 :(得分:0)

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 ;

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

答案 5 :(得分:0)

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