Database design 数据库设计:如何用其他关系限制n:m关系?

Database design 数据库设计:如何用其他关系限制n:m关系?,database-design,architecture,relational-database,cardinality,Database Design,Architecture,Relational Database,Cardinality,我认为最好根据一个例子来提问:有人、有客户、有项目 人与客户之间是一种n:m关系。人们可以为多个客户工作 项目与客户之间是1:n关系。一个项目总是属于某个客户,但是一个客户当然可以有多个活动项目 人员对客户是一种n:m关系,但受项目对客户和人员对客户分配的限制 更多详情: 我们的一些员工为多个客户工作,但仅为这些客户的少数项目工作 假设客户A有项目1,2,3,客户B有项目4,5,6 现在,Fred在项目1中为客户A工作,在项目5和6中为客户B工作。 相反,Tim在项目2、3上为客户A工作,在项目

我认为最好根据一个例子来提问:有人、有客户、有项目

人与客户之间是一种n:m关系。人们可以为多个客户工作

项目与客户之间是1:n关系。一个项目总是属于某个客户,但是一个客户当然可以有多个活动项目

人员对客户是一种n:m关系,但受项目对客户和人员对客户分配的限制

更多详情: 我们的一些员工为多个客户工作,但仅为这些客户的少数项目工作

假设客户A有项目1,2,3,客户B有项目4,5,6

现在,Fred在项目1中为客户A工作,在项目5和6中为客户B工作。 相反,Tim在项目2、3上为客户A工作,在项目6上为客户B工作。 我们的特别工作人员Nick只为客户B工作,但目前未被分配到任何项目。客户可以稍后将其分配到项目中

现在,我如何确保,使用良好的关系数据库设计,我可以在没有项目的情况下将人员分配给客户(如Nick),并且以后可以将他们分配给任何客户的项目——仅限于分配给他们的项目

那么,我是否需要设计我的表,以便数据库模型确保在没有首先将Nick分配给客户A的情况下,不可能将Nick分配给项目1、2或3


谢谢你的建议:)

下面是一个SQL示例:

CREATE TABLE Project
 (ProjectID INT NOT NULL PRIMARY KEY, CustomerID INT NOT NULL,
 UNIQUE (ProjectID, CustomerID));

CREATE TABLE EmployeeProject
 (EmployeeID INT NOT NULL, ProjectID INT NOT NULL, CustomerID INT NOT NULL,
  FOREIGN KEY (EmployeeID, CustomerID) REFERENCES EmployeeCustomer (EmployeeID, CustomerID),
  FOREIGN KEY (ProjectID, CustomerID) REFERENCES Project (ProjectID, CustomerID),
  PRIMARY KEY (EmployeeID, ProjectID));

在此模型中,
项目
分配
的子类型。例如,分配类型可以是
P=project
O=Open

  • 每个任务(开放或项目)仅属于一个客户
  • 可以有多个员工在不同的时间段执行一项任务
应在业务逻辑(应用程序层)中处理重新分配约束。可以通过结束该员工分配的期间(
EndDate
)并为该员工-客户组合定义一个
type=project
的新分配,从开放分配切换到项目


我真的很感激这个解决方案。它很棒,也很简单。