按国家搜索场地似乎有问题

时间:2015-01-21 08:47:26

标签: php mysql

概述:我正在制作一个活动概念网站,因为活动可以在一个国家和世界各地巡回演出,我想让那些正在添加活动的人们轻松一点,因为我们已经有一个场地列表,每天都会添加新的场地,我们已经使用下表设置了数据库ER

国 州 郊区

州表使用国家/地区的ID链接回国家/地区表,而郊区表则链接回州。

现在虽然这一切都很好,但我认为我发现了一个问题,它更多关于如何让php代码知道该国家搜索该国家的所有场地,如果我有不在会场中存放国家或州的身份证明。我只存储了郊区。

我希望在我的数据库中拥有更少的列,但我不在想为什么不将这两个列放入,这是我们将能够找到场地,作为回报,它将找到与该场地相关的事件。

我确实想知道他们是否是更好的方法,任何反馈都会有所帮助。

澄清 场地表仅链接到郊区,郊区链接到州和州的国家链接。

以下是我的ER图的一部分副本 ER Diagram

1 个答案:

答案 0 :(得分:0)

4表:国家,州,郊区,地点

  • Venue有一个FK到郊区
  • 郊区有FK到州
  • 州有FK到国家

解决方案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 = ?
)