![](/img/trans.png)
[英]Best way to store / structure mysql world country, states, districts, cities…?
[英]How to structure a MySQL database for counties, cities, and states
我正在为拥有当地酒精法的律师重新设计数据库。 这个想法是,某人可以抬头看看自己的县或城市,找出他们上一次或第一次来酒吧喝酒或在商店买酒的时间。 我遇到的问题是法律管辖范围过于复杂。 问题包括:
我想采用这种简单的模式,但情况并非如此简单:
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。 (请注意,我将其与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.