【问题标题】:Database structure for multiple locations of an organisation一个组织的多个位置的数据库结构
【发布时间】: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) 列是怎么结束的?默认INTINT(11)。还涉及:parent_area_idINT(8)。尝试使用普通的旧INT,除非您有非常令人信服的理由不这样做。这些微小的差异可能会导致巨大的问题。
  • 感谢@tadman 及时提醒
  • 另外值得注意的是:大多数_id 类型的字段都需要一个索引才有用,就好像那里有一个关联,它可能会被查询,如果要查询,你希望它是高性能的。跨度>
  • 我所有的 ID 都有索引吗? PK或FK
  • parent_area_id 在 Key 列中没有任何指示。这就是为什么发布SHOW CREATE TABLE 通常比DESCRIBE 更好。

标签: php mysql database-design


【解决方案1】:

如果您正在处理一次升级一个级别的情况,那么这里没有严重的问题。我不知道“闭环”会如何影响这里,这是与编程相关的,而不是数据库架构问题,并且很大程度上取决于个人喜好。

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

【讨论】:

  • 我已经用更多的使用数据编辑了上述问题
  • 您的问题的范围已经很广泛了,但是这个新的编辑让它不合理地被解释了。你必须尝试一些东西,看看你遇到了什么问题。听起来您还需要详细了解 JOIN 的工作原理,因为这可以大大减少您需要在精心设计的架构中执行的查询数量。
猜你喜欢
  • 2017-04-16
  • 2014-06-22
  • 2011-05-06
  • 2014-04-28
  • 1970-01-01
  • 2019-06-06
  • 2015-12-16
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多