组织/地点/部门/用户的最佳数据库结构?

时间:2016-12-01 13:00:30

标签: mysql database postgresql join database-design

我正在构建一个系统,我们应该拥有一个包含组织,位置,部门和用户的数据库。它们按照您的预期连接:

  • 每个组织可以包含一个或多个位置
  • 每个位置(建筑物)可以包含一个或多个部门
  • 在每个部门工作一个或多个用户
  • 用户可以在多个部门工作

但是:一个部门可以跨越多个地点。

直观地说,我会按如下方式创建数据库: circle 您在上面看到的结构问题是BUT;不可能有一个跨越两个地点的部门。我认为这不是一个真正的问题,因为我可以简单地为两个位置创建相同的部门。如果有这个部门的管理员,我可以简单地让他在两个地方管理。

一位程序员提出了不同的结构:

tree 他是这种结构的忠实粉丝,因为他说跨越任何事物的方式更灵活。我的问题在于,在手动读取数据库时它的可读性较差,而且在处理代码时我会更加困惑。

我的问题是;你更喜欢哪种结构?这最后一个结构的最大优点是什么?这种情况经常使用吗?欢迎所有提示!

1 个答案:

答案 0 :(得分:0)

假设:组织有多个部门,部门有多个位置,用户在该部门的一个位置为一个部门工作。

这是我的快速草图:

CREATE TABLE Users
( user_id INTEGER NOT NULL UNIQUE );

CREATE TABLE Organizations
( org_id INTEGER NOT NULL UNIQUE );

CREATE TABLE Departments
( dep_id INTEGER NOT NULL UNIQUE );

CREATE TABLE Locations
( loc_id INTEGER NOT NULL UNIQUE );

CREATE TABLE OrgDepartments
( org_id INTEGER NOT NULL UNIQUE 
     REFERENCES Organizations ( org_id ),
  dep_id INTEGER NOT NULL UNIQUE
     REFERENCES Departments ( dep_id ) );

CREATE TABLE DepartmentLocations
( dep_id INTEGER NOT NULL UNIQUE
     REFERENCES OrgDepartments( dep_id ),
  loc_id INTEGER NOT NULL
     REFERENCES Locations ( loc_id ),
  UNIQUE ( loc_id, dep_id ) );

CREATE TABLE UserLocations
( user_id INTEGER NOT NULL UNIQUE
     REFERENCES Users ( user_id ),
  dep_id INTEGER NOT NULL,
  loc_id INTEGER NOT NULL,
  FOREIGN KEY ( loc_id, dep_id )
     REFERENCES DepartmentLocations ( loc_id, dep_id ) );