我正在使用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)每个区域可能分配了许多员工。
SO
例如,如果我有区域管理员,他们可能会有以下区域:例如:
SO
如果我想获得区域管理员下所有员工的user_id,使用上述数据库结构,我需要:
1)查询数据库以获取具有区域管理员的parent_area_id的所有area_id。
2)遍历每个返回的area_id,并查询db并获取所有具有返回的area_id的parent_area_id的area_id
3)继续循环返回的area_id,直到我们达到底层
4)查询数据库以获取具有以上所有返回记录的area_id的所有user_id
SO
这看起来效率不高,需要多个SQL查询和编程循环才能获得与区域经理相关联的用户列表。
如果这是最有效的方法,那么我只是不相信,并且我确定必须有一个更简单的方法吗?
答案 0 :(得分:2)
如果你正处理一次升级一个级别的情况,那么这里没有严重的问题。我不知道"关闭循环"将在这里考虑,这与编程相关,而不是数据库模式问题,并且主要取决于个人偏好。
只要你不违反Zero, One or Infinity Rule设计,你就应该没问题。您的多个地址字段位于此处,可能更好地表示为接受多行文本的单个字段,但这也是许多数据库传统上代表任意街道地址的方式。