【发布时间】:2016-09-12 19:24:37
【问题描述】:
我正在使用 PHP (Codeigniter/MySQL) 创建一个应用程序,应用程序中有组织。
每个组织可以有多个位置、区域、部门等(我称这些区域)
每个区域都有一个管理员,有时我需要将事情升级到更高的区域。
我目前已经在 1 个表中获得了所有数据,并且我正在使用 parent_area_id 和 area_level 来确定父母、孩子等。
但我认为这是非常低效的,而且我一直指向闭环,我对此一无所知。
这里是数据库表,这样可以吗,效率高还是有更好的办法?
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| area_id | int(12) | NO | PRI | NULL | auto_increment |
| area_title | varchar(40) | NO | | NULL | |
| area_name | varchar(40) | NO | | NULL | |
| address1 | varchar(40) | YES | | NULL | |
| address2 | varchar(40) | YES | | NULL | |
| address3 | varchar(40) | YES | | NULL | |
| town | varchar(20) | YES | | NULL | |
| county | varchar(20) | YES | | NULL | |
| post_code | varchar(10) | YES | | NULL | |
| has_ra | varchar(1) | YES | | 0 | |
| org_id | int(12) | NO | MUL | NULL | |
| parent_area_id | int(8) | YES | | NULL | |
| area_level | int(1) | YES | | NULL | |
+----------------+-------------+------+-----+---------+----------------+
编辑:
(更好地解释这是如何使用的)
1) 仅与企业客户相关的领域。
2) 区域是客户可能拥有的不同区域(区域、位置、部门)。 (南部地区,牛津办事处,会计部)。
3) 每个区域可能分配了许多员工。
所以
例如,如果我有一个区域管理员,他们可能有以下区域:例如:
- 南部地区
- 牛津办事处
- 销售部
- 会计部
- 伦敦办事处
- 营销
- 规划
- 牛津办事处
所以
如果我想获取区域管理员下所有员工的user_id,使用上面的数据库结构,我需要:
1) 查询 db 获取所有 area_id 的 parent_area_id 为区域管理员。
2) 循环遍历每个返回的area_id,并查询db并获取所有area_id的parent_area_id为返回的area_id
3) 继续循环返回的 area_id,直到我们到达底层
4) 查询数据库以获取所有具有以上所有返回记录的 area_id 的 user_id
所以
这似乎效率不高,并且需要多个 SQL 查询和编程循环来获取与区域经理关联的用户列表。
如果那是最有效的方法,那很好,我似乎不相信,我确定一定有更简单的方法吗?
【问题讨论】:
-
INT(12)列是怎么结束的?默认INT是INT(11)。还涉及:parent_area_id的INT(8)。尝试使用普通的旧INT,除非您有非常令人信服的理由不这样做。这些微小的差异可能会导致巨大的问题。 -
感谢@tadman 及时提醒
-
另外值得注意的是:大多数
_id类型的字段都需要一个索引才有用,就好像那里有一个关联,它可能会被查询,如果要查询,你希望它是高性能的。跨度> -
我所有的 ID 都有索引吗? PK或FK
-
parent_area_id在 Key 列中没有任何指示。这就是为什么发布SHOW CREATE TABLE通常比DESCRIBE更好。
标签: php mysql database-design