组织的多个位置的数据库结构

时间:2016-09-06 15:47:35

标签: php mysql database-design

我正在使用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查询和编程循环才能获得与区域经理相关联的用户列表。

如果这是最有效的方法,那么我只是不相信,并且我确定必须有一个更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

如果你正处理一次升级一个级别的情况,那么这里没有严重的问题。我不知道"关闭循环"将在这里考虑,这与编程相关,而不是数据库模式问题,并且主要取决于个人偏好。

只要你不违反Zero, One or Infinity Rule设计,你就应该没问题。您的多个地址字段位于此处,可能更好地表示为接受多行文本的单个字段,但这也是许多数据库传统上代表任意街道地址的方式。