2011-07-07 52 views
2

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

回答

2

您不应单独保存所有三个,如country_id,state_idcity_id。原因是这是多余的信息。一个城市隐含属于属于一个国家的国家。你没有被保存为单独的值获得的任何信息,并且只引入搞乱了数据(因为你可以日本,华盛顿,柏林保存为一组,这是无效的和不一致的信息)的风险。

你应该在数据库中创建一个分层树。有一个父母国家的城市有一个父母国家。然后,您只需要向用户询问他们的城市,并且所有其他信息都是隐含的。你从哪里得到这些数据是一个不同的话题。例如,您可以尝试Google的API。

0

这取决于你的业务需求。如果你想提供区域化服务(已logc根据用户的地理区域),然后是的,你一定要在DB保持区域。另一方面,你将不得不设计你的数据库来保存你的区域(在1-n关系中至少有3个表格,或者与父/子关系有1个表格),并用有效数据填充该数据库 - 你会不会拥有来自世界各地的所有国家/州和城市?

1

一般情况下,我建议你到具有只读的国家名单,因此用户只能选择但不能添加。然后,对于州和省,有一个预先加载的列表,但允许用户添加一个。 (你可以从任何你想要的互联网数据库或服务中预先加载这个列表,比如雅虎)。

在所有情况下,这是一个很好的加分,对他们(因为可用性)和你(因为这将减少数据复制)

希望这有助于。欢呼声

2

问题是你想让它适用于世界上的每个人,还是仅仅为了美国的地址 - 也是你想要收集信息的目的。

如果您的网站是电子商务,并且您希望收集送货地址,则需要对输入的验证质量有相当高的质量 - 否则UPS不会将这些内容交付给客户。

如果在另一方面,你只是想拥有的,人们是一个相当不错的主意,但它有邮寄地址质量不是必需的,只用一个免费的网络服务像PlaceFinder

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

它应该允许你让用户只需输入地址,而不必将其分解到城市/州/国家,只需将产生的地点ID(woeid)存储在数据库中。

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 ; 

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

+0

那州/省/地区呢? – Tech4Wilco

0

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