概述:我正在制作一个活动概念网站,因为活动可以在一个国家和世界各地巡回演出,我想让那些正在添加活动的人们轻松一点,因为我们已经有一个场地列表,每天都会添加新的场地,我们已经使用下表设置了数据库ER
国 州 郊区
州表使用国家/地区的ID链接回国家/地区表,而郊区表则链接回州。
现在虽然这一切都很好,但我认为我发现了一个问题,它更多关于如何让php代码知道该国家搜索该国家的所有场地,如果我有不在会场中存放国家或州的身份证明。我只存储了郊区。
我希望在我的数据库中拥有更少的列,但我不在想为什么不将这两个列放入,这是我们将能够找到场地,作为回报,它将找到与该场地相关的事件。
我确实想知道他们是否是更好的方法,任何反馈都会有所帮助。
澄清 场地表仅链接到郊区,郊区链接到州和州的国家链接。
以下是我的ER图的一部分副本
答案 0 :(得分:0)
4表:国家,州,郊区,地点
解决方案1:非常糟糕的SQL(不要这样做,但想出来有点好玩)
SELECT * FROM venues WHERE suburb_id IN (
SELECT suburb_id FROM suburb WHERE state_id IN (
SELECT state_id FROM state WHERE country_id IN (
SELECT country_id FROM country WHERE name = ?
)
)
)
解决方案2:创建一个这样的查找表,用于存储所有相关值的场所到位置,然后您可以通过该查找表查找所有内容
VENUE_LOCATION
id (INTEGER), PK, AUTO INCREMENT
venue_id (INTEGER), FK to venue id
suburb_id (INTEGER), FK to suburb id
state_id (INTEGER), FK to state id
country_id (INTEGER), FK to country id
唯一需要注意的是,在插入或修改记录期间,有人可能会给您无效值,因此您可以做的是使此表只读取,插入和删除,并从应用程序层强制执行完整性
因此,使代码只接受VENUE和SUBURB的输入,后端代码可以从内部查找VS用户输入中确定状态和国家ID。
然后您按国家/地区检索所有场地的查询将是:
SELECT * FROM venues WHERE venue_id IN (
SELECT venue_id
FROM venue_location INNER JOIN country
ON country.id = venue_location.country_id
WHERE country.name = ?
)