通过PHP从Mysql数据库获取大型层次结构的数据的最佳方法

时间:2013-07-10 16:47:42

标签: php mysql sql database stored-procedures

我有这样的数据层次结构:

Country
-President // A Person
--Central
---Prime  Minister // A Person
----State
-----Chief Minister // A Person
------District
-------District Minister // A Person
--------Area
---------Area Minister (AM) // A Person

所以基本上我想在这里做的是,我想在FocusArea Minister。因为他将成为我申请的灵魂。其他人只是等级制度的一部分。因此,假设我添加Area Minister,那么他/她将在Area下,而Area位于District Minister之下且District Minister位于District之下DistrictChief Minister位于SO ON......Area Minister

之下

我在这里做的是将MySQL Database的这些详细信息添加到我的AM所以我在数据库中所做的是,我创建了以下表格:

  1. 国家/地区//添加条目
  2. 总统//在国家/地区添加总裁(所以country_id是外键)
  3. 中央//在总统下添加中心(所以president_id是外键)
  4. ...
  5. ...
  6. ...
  7. ...
  8. ...
  9. 区域//用于在区域经理下添加区域(因此,district_manager_id是外键)
  10. Area_Minister //在Area中添加区域部长(AM)(所以area_id是外键)
  11. 问题是要提取**PHP****MySQL**的详细信息。我从AM获取数据,而AM - Data是我正在寻找的核心数据,但在某些点也需要相关数据。但核心是10 - TEN TABLES。但是,如果我正在通过这种方式,我正在尝试从Area获取数据。我感到痛苦。

    因为要获取所需数据,我会在AM中匹配District Minister ID,然后在Area中匹配AM i.e Area Manager's Data ID,依此类推至层次结构的起始级别。

    我有什么方法可以尽量减少这个过程。我想要的核心数据只是AM

    任何方式我都可以很好地构建它。或者,如果有任何寻求帮助,有人可以向我提供有关如果可以通过存储过程完成此操作的见解。

    我只是在寻找一种方法来降低PHP中代码的复杂性以及MySQL中的许多表,当核心数据仅存在于{{1}}时。

    请提供建议。

2 个答案:

答案 0 :(得分:1)

您具有正确的基本表结构,并且您指定的内容似乎是表数据的合理结构。如果要减少访问区域管理器时打开的表的数量,可以执行一些操作。

  1. 使用装饰器。您可以创建一个区域管理器对象,该对象仅加载获取区域管理器时所需的最小数据。向该对象添加方法,从其他表中获取数据,并仅在需要该数据时运行查询。例如:

    class AreaManager {
    
        public function __construct() {
            //do code which loads the basic table data for an area manager
        }
    
        public function getPresident() {
             // do the SQL needed to load the president from the relational tables
        }
    
    }
    
  2. 非常规化您的数据。您可以定期运行一个脚本来获取数据并将其放入一个表中 - 因此您有一个这样的结构:

    area_manager_id | country_name | president | prime_minister | etc.
    

    此脚本必须在您更改关系时更新,但允许您通过单个查询轻松访问数据。

  3. 所有这些,您已经按照它们应该使用的方式设置了关系表,而10表查询通常不是世界末日。

答案 1 :(得分:1)

只要您索引外键,然后使用连接就可以获取内容,您的数据就不会那么糟糕。

最后不是关于你的表,因为你的表是用正确的关系键正确构建的,而是你的索引优化和你将运行的查询。