0

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

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

所以基本上我在这里要做的是,我想Focus继续Area Minister。因为他将是我申请的灵魂。其他只是等级制度的一部分。所以可以说,如果我要添加 anArea Minister那么他/她将在 an 之下Area,并且Area在 a之下,并且在District Minister并且District MinisterDistrictandDistrict之下Chief MinisterSO ON......

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

  1. Country // 用于添加条目
  2. 总统 // 用于在国家/地区添加总统(因此 country_id 是这里的外键)
  3. Central // 用于在总裁下添加中心(因此,president_id 是这里的外键)
  4. ...
  5. ...
  6. ...
  7. ...
  8. ...
  9. Area // 用于在 District manager 下添加区域(因此 District_manager_id 在这里是外键)
  10. Area_Minister // 用于在区域中添加区域部长(AM)(因此 area_id 在这里是外键)

问题是用于获取AMthrough的详细信息**PHP**。我正在从我正在寻找的核心数据中获取数据**MySQL**AM但在某些时候也需要相关数据。但核心是AM - Data。但是,如果我通过这种方式,我正在尝试从10 - TEN TABLES. 我觉得是痛苦。

因为要获取所需的数据,我将AreaID in匹配AM,然后将District MinisterID inArea等匹配到层次结构的起始级别。

有什么办法可以减少这个过程。因为我想要的核心数据只是AM i.e Area Manager's Data.

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

我只是在寻找一种方法来降低 PHP 中代码的复杂性和 MySQL 中如此多的表,而核心数据只是在那里AM

好心劝告。

4

2 回答 2

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.
    

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

话虽如此,您已经按照应该使用的方式设置了关系表,并且 10 表查询通常不是世界末日。

于 2013-07-10T17:04:54.037 回答
1

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

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

于 2013-07-10T17:08:23.370 回答