我正在试图找出关联国家,地区和城镇表的最佳方法。
在我的网站上,我希望用户能够进入一个城镇。然后选择国家和地区,这两者都需要输入或根本不输入。
目前我的表格是这样的
tbl>用户拥有townID(FK)
tbl> town有id(PK)townName regionID(FK DEFAULT NULL)
tbl> region具有id(PK)regionName countryID(FK NOT NULL)
tbl>国家/地区拥有ID(PK)countryName
我认为可能会进一步向用户吐出城镇关系:
tbl>用户具有locationID(FK)
tbl> location具有id(PK)townID(FK)regionID(FK)countryID(FK)
但我认为这是不必要的,只会使问题进一步复杂化?
国家/地区数据库已填充。我打算建立我自己的城镇参考&gt; <地区>用户输入的国家关系。因此,如果用户进入没有地区和国家的城镇,则如果没有具有相同名称且没有区域ID的城镇,则将其输入到没有regionID的tbl&gt;城镇。对于已由用户输入区域和国家ID的城镇,这是相同的。只有我检查一下还没有一个城镇&gt; <地区>进入之前已经存在的国家关系。稍后在网站的开发中,我将根据用户输入的城镇为国家/地区提供Ajax建议。
所以问题:
我可以设想这样的陷阱,例如重复数据或数据可能被覆盖。有没有更好的方法来构建表格以适应我想要的方法?
前面的问题可能会回答这个问题:但是我可以做些什么来减少表格的PHP处理。显然我更愿意只插入一个PHP语句,但我认为有太多的注意事项可以立即执行。
此外,由于用户城镇条目可能为空,并且可能包含也可能不包含对某个地区的外键引用,如何最好创建一个考虑到这一点的视图?
由于它将被托管,我宁愿不使用MySQL函数。
如果您需要任何澄清,请告诉我。我真的希望在继续之前第一次做到这一点,所以你的帮助将非常宝贵。
答案 0 :(得分:0)
我不认为你减少了代码,因为它太明确了。你可以改变它,但它不会更好。
答案 1 :(得分:0)
您使数据库变得复杂。一旦经历了“链式选择框”的概念。您可以通过Google搜索找到解决方案。
答案 2 :(得分:0)
接受没有地区和国家/地区的城镇名称就像让某人输入他们的名字而没有他们的中间名或最后名。这是数据,但它不是标识符。
Fullerton的全名是“美国加利福尼亚州富勒顿”。通过不要求Fullerton的全名,您放弃了用于数据完整性的外键。 (“富勒顿,加利福尼亚,美国”是一个城市;“富勒顿,美国阿拉巴马州”不是。)祝你好运。
如果你走这条路,我能给你的最好建议就是摆脱身份证号码。 ISO发布国家/地区和国家/地区的标准代码。您可以在Wikipedia中查找它们。存储自然键会将连接数从3减少到零。零连接几乎总是会执行3次连接。
您可能需要使用外部联接来创建视图。