Php 国家/地区和城镇表的MySQL关系

Php 国家/地区和城镇表的MySQL关系,php,sql,mysql,relationship,relation,Php,Sql,Mysql,Relationship,Relation,我正试图找出将国家、地区和城镇表关联起来的最佳方法 在我的网站上,我希望用户能够进入一个城镇。然后选择国家和地区,这两个国家和地区都需要输入,或者根本不需要输入 目前我的表是这样的 tbl>用户具有townID(FK) tbl>城镇具有id(主键)城镇名称区域id(FK默认为空) tbl>区域具有id(主键)regionName countryID(FK非空) tbl>国家/地区具有id(主键)countryName 我想可能会进一步吐露用户与城镇的关系: tbl>用户具有locationID(

我正试图找出将国家、地区和城镇表关联起来的最佳方法

在我的网站上,我希望用户能够进入一个城镇。然后选择国家和地区,这两个国家和地区都需要输入,或者根本不需要输入

目前我的表是这样的

tbl>用户具有townID(FK)

tbl>城镇具有id(主键)城镇名称区域id(FK默认为空)

tbl>区域具有id(主键)regionName countryID(FK非空)

tbl>国家/地区具有id(主键)countryName

我想可能会进一步吐露用户与城镇的关系:

tbl>用户具有locationID(FK)
tbl>位置具有id(主键)townID(FK)regionID(FK)countryID(FK)

但我认为这是没有必要的,只是使问题更加复杂

国家/地区数据库已填充。我打算建立我自己的参考城市>地区>国家关系,由用户输入。因此,如果用户输入一个没有地区和国家的城镇,那么如果还没有一个城镇没有地区ID,那么它将被输入到tbl>没有地区ID的城镇。这对于用户输入了地区和国家ID的城镇也是一样的。只有我在进入之前检查是否已经存在城镇>地区>国家关系。稍后在网站开发中,我将根据用户输入的城镇为国家/地区提供Ajax建议

关于这些问题:

我可以设想这样做的陷阱,例如重复数据或数据可能被覆盖。有没有更好的方法来构造表以适合我所需的方法

前面的问题可能会回答这个问题:但是我能做些什么来减少表的PHP处理。显然,我更喜欢只使用一条PHP语句插入,但我认为有太多的注意事项需要一次完成

此外,由于用户输入可能为空,并且可能包含或可能不包含对某个地区的外键引用,因此如何最好地创建一个考虑到这一点的视图

由于它将被托管,我不希望使用MySQL函数


如果您需要任何澄清,请告诉我。在继续之前,我真的希望第一次就把它做好,所以您的帮助将是非常宝贵的。

我不认为您减少了代码,因为它太明确了。你可以改变它,但不会更好。

接受一个没有地区和国家的城镇名称就像让一个人输入自己的名字而没有中间名或姓氏一样。它是数据,但不是标识符

富勒顿的全名是“美国加利福尼亚州富勒顿”。通过不要求Fullerton的全名,您可以放弃外键以实现数据完整性。(“美国加利福尼亚州富勒顿”是一座城市;“美国阿拉巴马州富勒顿”不是。)祝你好运

如果你要走这条路,我能给你的最好建议就是去掉身份证号码。ISO为国家和国家的分支机构发布标准代码。你可以在网上查。存储自然关键点会将连接数从3减少到零。零连接几乎总是比执行3个连接更有效


您可能需要使用外部联接来创建视图

谢谢你的回复。我也这么想,我的SQL技能很差,所以我想在下定决心之前我应该先接触一下。尽管我不能不整理视图就做任何事情:因为用户的town条目可能为空,并且可能包含或可能不包含对某个区域的FK引用,因此如何创建一个考虑到这一点的视图是最好的?因此,一个包含tbl>users的视图。*然后城镇、地区和国家作为附加列,并从它们各自的表中填充,前提是它们不为空。以下内容似乎可行,但这只是我的想法,有没有更整洁的方法?选择*FROM tbl_users left join tbl_towns on tbl_users.id=tbl_users.birthouse left join tbl_regions on tbl_regions.id=tbl_towns.region id left join tbl_countries on tbl_countries.id=tbl_regions.countryID