【问题标题】:How to structure a MySQL database for counties, cities, and states如何为县、市和州构建 MySQL 数据库
【发布时间】:2015-11-23 19:26:31
【问题描述】:

我正在为持有当地酒精法的律师重新设计一个数据库。这个想法是,有人可以查看他们所在的县或市,并找出他们最后一次或第一次可以在酒吧喝酒或在商店买酒的时间。我遇到的问题是法律管辖权非常复杂。问题包括:

  1. 独立的城市(没有与之关联的县, 例如,马里兰州巴尔的摩)
  2. 一个城市名称可以跨越多个司法管辖区(例如,弗吉尼亚州福尔斯彻奇是一个独立城市,弗吉尼亚州福尔斯彻奇也是费尔法克斯县的一部分)
  3. 包含县的城市(纽约州纽约市, 例如,包含五个不同的县)

我想使用这个简单的模式,但情况并不那么简单:

state {
  id (INT, PRIMARY KEY)
  name_short (CHAR(2))
  name_long (CHAR(14))
…}

county {
  id (INT, PRIMARY KEY)
  name (CHAR(30))
  state_id (INT, FOREIGN KEY, REQUIRED)
…}

locality {
  id (INT, PRIMARY KEY)
  name (CHAR(30))
  county_id (INT, FOREIGN KEY, CAN BE NULL)
  state_id (INT, FOREIGN KEY, REQUIRED)
...}    

hours {
  id (INT, PRIMARY KEY)
  locality_id (INT, FOREIGN KEY, CAN BE NULL)
  county_id (INT, FOREIGN KEY, CAN BE NULL)
  state_id (INT, FOREIGN KEY, REQUIRED)
  beer_and_wine_or_liquor (INT => 1=beer and wine only, 2=liquor only, 3=both)
  on_or_off_premises (INT => 1=on-premises only, 2=off-premises only, 3=both)
  start_time (INT => seconds after Sunday 12am)
  end_time (INT => seconds after Sunday 12am)
}

这个想法是查询一个城市并返回他们当地的酒精法。如果一个城市将其法律推迟到某个县,那么hours 中将根本没有该城市的条目,然后将在县级进行另一个查询。这可能会一直级联到州一级。这样就消除了数据冗余。如果每个城市都遵从县的法律,甚至可能没有必要在 locality 中输入每个城市。

  • 问题 #1 通过允许county_idlocality 表中解决 为空。
  • 问题 #2 通过允许使用多个位置来解决 相同的名称,但不同的县 ID。
  • 问题 #3 仍然存在问题 我。我不知道如何解决它。有人能帮忙吗?或者 我应该让纽约市陷入特殊情况吗?

(请注意,我将其与 Google Maps API 一起使用,以根据地址、交叉点或纬度/经度确定一个人的城市和县(如果存在)。另请注意,邮政编码搜索不是一个选项,因为它们跨越司法管辖区.)

【问题讨论】:

    标签: mysql google-maps database-schema


    【解决方案1】:

    从 locality 表中取出county_id 并创建一个查找表,如下所示:

    locality_counties {
        locality_id (INT)
        county_id (INT)
    }
    

    然后您可以将其用于地方和县之间的 1:1 或 1:m 关系。您的查询可能如下所示:

    SELECT
        h.*,
        s.name_short AS state_abbr,
        s.name_long as state_name,
        l.name AS locality_name,
        c.name AS county_name,
        c2.name AS alternate_county_name
    FROM
        hours h
    JOIN
        states s
        ON h.state_id = s.id
    LEFT OUTER JOIN
        counties c
        ON h.county_id = c.id
    LEFT OUTER JOIN
        localities l
        ON h.locality_id = l.id
    LEFT OUTER JOIN
        locality_counties lc
        ON l.id = lc.locality_id
    LEFT OUTER JOIN
        counties c2
        ON lc.county_id = c2.id
    

    您会为每个县返回一条记录。而且这些记录中的每一个都将包含初始县和地区的重复信息,因此您需要善于使用代码去除重复信息。

    【讨论】:

    • 谢谢!我认为这应该可以解决问题。但是,我想知道 locality 表是否需要 state_id 。我把它放进去的唯一原因是因为独立的城市。同样,我希望减少小时表中使用的外键数量,但由于小时可能适用于地方、县或州,我不明白这是怎么可能的。你有什么建议吗?
    • 就我个人而言,我会将 state_id 留在 locality 表中,以防万一您需要将该表用于不涉及小时表的事情。而且我认为您在小时表中无法绕过 FK 是正确的,因为它们可以适用于一个地方、县或州。你的桌子在宏伟的计划中仍然很薄!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    相关资源
    最近更新 更多