【问题标题】:MySQL relations for country region and town tables国家地区和城镇表的 MySQL 关系
【发布时间】:2011-06-30 05:46:48
【问题描述】:

我正在尝试找出关联国家、地区和城镇表的最佳方法。

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

目前我的桌子是这样的

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)

但我认为这是不必要的,只会使问题进一步复杂化?

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

所以问题:

我可以设想这样的陷阱,例如重复数据或可能被覆盖的数据。有没有更好的方法来构建表格以适应我想要的方法?

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

此外,由于用户的城镇条目可能为空,并且可能包含也可能不包含对区域的外键引用,因此如何最好地创建一个考虑到这一点的视图?

由于它将被托管,我宁愿不使用 MySQL 函数。

如果您需要任何说明,请告诉我。在继续之前,我真的很想在第一次做到这一点,所以您的帮助将是无价的。

【问题讨论】:

    标签: php sql mysql relationship relation


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我也这么想,我的 SQL 技能很差,所以我想在承诺之前先联系一下。尽管如果不将视图分类,我将无能为力:由于用户城镇条目可能为空,并且可能包含或可能不包含对区域的 FK 引用,如何最好创建一个考虑到这一点的视图?因此,一个视图包含 tbl>users.*,然后是城镇、地区和国家作为附加列,并从他们尊重的表中填充,前提是它们不为空。
    • 以下似乎可行,但这只是我的想法,有没有更简洁的方法? SELECT * FROM tbl_users left join tbl_towns on tbl_towns.id = tbl_users.birthPlace left join tbl_regions on tbl_regions.id = tbl_towns.regionID left join tbl_countries on tbl_countries.id = tbl_regions.countryID
    【解决方案2】:

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

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

    如果您要走这条路,我能给您的最佳建议是摆脱身份证号码。 ISO 发布国家和国家分部的标准代码。您可以在Wikipedia 中查找它们。存储自然键会将连接数从 3 减少到 0。零连接几乎总是要执行 3 次连接。

    您可能需要使用外连接来创建视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2018-10-01
      • 1970-01-01
      • 2014-03-17
      相关资源
      最近更新 更多