繁体   English   中英

如何为县,市和州构建MySQL数据库

[英]How to structure a MySQL database for counties, cities, and states

我正在为拥有当地酒精法的律师重新设计数据库。 这个想法是,某人可以抬头看看自己的县或城市,找出他们上一次或第一次来酒吧喝酒或在商店买酒的时间。 我遇到的问题是法律管辖范围过于复杂。 问题包括:

  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 ,如果他们推迟其法律县。

  • 通过使locality表中的county_id为空,解决了问题1。
  • 通过允许多个具有相同名称但县编号不同的地区来解决问题2。
  • 问题3仍然困扰着我。 我不知道如何解决。 有人能帮忙吗? 还是我应该把NYC塞进一个特殊情况?

(请注意,我将其与Google Maps API结合使用,根据地址,交叉点或纬度/经度来确定一个人的城市和县(如果存在)。还请注意,由于跨地区搜索,因此无法进行zip搜索。)

从地区表中删除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

您将为每个县获得一份记录。 而且这些记录中的每一个都将包含有关初始县和地区的重复信息,因此您需要很好地使用代码剥离重复项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM