备注
我已经完全重写了我的原始帖子,以更好地解释我试图理解的问题。我试图尽可能地概括这个问题。
另外,我要感谢回复的原始人。希望这篇文章能让事情更清楚一些。
语境
简而言之,我正在努力理解设计小型数据库来处理(我认为是)多个多对多关系的最佳方法。
想象一下公司组织结构的以下场景:
Textile Division Marketing Division
| |
---------------------- ----------------------
| | | |
HR Dept Finance Dept HR Dept Finance Dept
| | | |
---------- ---------- ---------- ---------
| | | | | | | |
Payroll Hiring Audit Tax Payroll Hiring Audit Accounts
| | | | | | | |
Emps Emps Emps Emps Emps Emps Emps Emps
注意:
Emps表示在该领域工作的雇员名单
当我第一次开始处理这个问题时,我制作了四个单独的表格:
Divisions -> 纺织、营销(PK = DivisionID)Departments -> 人力资源、财务(PK = DeptID)Functions -> 工资、招聘、审计、税务、账户(PK = FunctionID)Employees -> 所有员工列表(PK = EmployeeID)我看到的问题是存在多种多对多关系,即许多部门有许多部门,许多职能有许多部门。
问题
给出上面的数据库结构,假设我想做以下事情:
为此,我需要能够区分两个薪资部门,但我不确定如何做到这一点?
我知道我可以在部门和职能之间建立一个“链接/连接”表,以便我可以检索哪些职能在哪些部门中。但是,我仍然需要区分他们所属的部门。
研究工作
正如您所看到的,当涉及到数据库设计时,我是一个初学者。我花了最近两天研究这个问题,遍历嵌套集模型,邻接模型,阅读这个问题已知不是 NP 完全等。我确定有一个简单的解决方案?
请您参考如下方法:
根据更新后的帖子,并根据所使用的名称做出一些(相当明显的)假设,我得出以下结论。有四个实体:
这些实体之间有许多关系。其中很少有层次结构,大多数是简单的关联:
这导致了这些粗略的表格:
-- Division -----
DivisionId (primary key)
-- Department ---
DepartmentId (primary key)
-- Function ----- (assumes option A2)
FunctionId (primary key)
DepartmentId (foreign key, references Department)
-- DivisionFunctions ----
DivisionId (First column of compound primary key)
FunctionId (Second column of compound primary key)
(您可以选择包含一个代理键来唯一标识每一行,但 DivisionId + FunctionId 会起作用。)
这里没有足够的 Material 来全面描述“员工”如何融入模型。假设员工做职能的工作:一个员工可以做多个职能的工作,还是只做一项?员工是否在不考虑其所在部门的情况下执行该职能的工作,还是被分配为一个或多个部门工作?这里有两个明显的选择,尽管更复杂的变体是可能的:
鉴于这些,表格可能如下所示:
-- Employee ----- (assumes option B1)
EmployeeId (primary key)
DepartmentId (foreign key, references Department)
-- EmployeeFunction ----- (assumes option B1)
EmployeeId (First column of compound primary key)
FunctionId (Second column of compound primary key)
... 因此,所有能够执行某项职能的员工都将为所有需要该职能的部门执行该职能。或者,
-- Employee ----- (assumes option B2)
EmployeeId (primary key)
DepartmentId (foreign key, references Department)
-- EmployeeAssignment ----- (assumes option B2)
EmployeeId (foreign key, references Employee)
DivisionId (first of two-column foreign key referencing DivisionFunctions)
FunctionId (second of two-column foreign key referencing DivisionFunctions)
(或者,代替 DivisionId 和 FunctionId,包括来自 DivisionFunctions 的可选代理键。)……因此,员工被单独分配到部门要为一个部门执行的功能。
但这仍然留下了很多“如果/何时”的问题:员工是否“属于”部门?员工可以属于(工作)多个部门吗?也许员工属于部门?您是否跟踪员工可以执行哪些职能,即使他们目前没有这样做?同样,您是否跟踪员工在哪个部门工作,即使他们目前处于“职能之间”?如果员工可以执行职能 A 和 B,而一个部门需要这两种职能,是否可以指定一名员工只为该部门执行 A 而不是 B?
这里还有更多的需求研究要做,但我认为这是一个好的开始。




