我正在开发一个PHP&用户可以注册的MySQL。在注册表格中,他们需要填写国家,州和城市。我想知道将它保存在我的数据库上是否是个好主意。我很困惑,因为Facebook,谷歌和其他人都有自动填充表单,其中这些输入标签表明你的国家,州甚至城市。
答案 0 :(得分:2)
问题在于您是想让它适用于世界上的每个人,还是仅仅针对美国地址 - 以及您尝试收集信息的目的。
如果您的网站是电子商务,并且您想要收集送货地址,则需要对输入进行相当高质量的验证 - 否则UPS将无法向您的客户提供这些内容。
如果另一方面,你只是想要很好地了解人们的位置,但是拥有邮政地址质量并不是必不可少的,只需使用像PlaceFinder这样的免费网络服务
http://developer.yahoo.com/geo/
它应该允许您让用户只需键入地址,而无需将其拆分为城市/州/国家/地区,只需将生成的地点ID(woeid)存储在您的数据库中。
答案 1 :(得分:2)
您不应单独保存所有三个,例如country_id
,state_id
和city_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)
还要考虑到,有些城市名称相同但位于不同的国家/地区。里加是拉脱维亚的首都,里加也在美国密歇根州。