数据库设计:如何通过其他关系限制n:m关系?

时间:2010-12-15 08:30:40

标签: database-design architecture relational-database cardinality

我认为最好根据一个例子提出问题:有人,客户和项目。

人与顾客是一种关系。人们可以为多个客户工作。

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

人与客户之间存在关系,但受项目限制,客户和人员对客户的分配。

更多细节: 我们的一些人为多个客户工作,但仅针对这些客户的一些项目。

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

现在Fred在项目1上为客户A工作,在项目5和6上为客户B工作。 相反,Tim为项目2,3的客户A和项目6的客户B工作。 我们的特殊人Nick只为客户B工作,但目前尚未分配给任何项目。客户可以稍后将他分配给项目。

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

所以我需要设计我的表格,以便数据库模型确保在没有先将他分配给客户A的情况下无法将Nick分配给项目1,2或3吗?

感谢您的任何想法:)

2 个答案:

答案 0 :(得分:1)

以下是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));

答案 1 :(得分:0)

在此模型中,ProjectAssignment的子类型。例如,分配可以是P = projectO = Open类型。

  • 每项任务(开放或项目)仅属于一个客户。
  • 可能有几名员工在不同的时间段完成一项任务。

应在业务逻辑(应用程序层)中处理重新分配约束。从开放分配切换到项目可以通过关闭该员工分配的期限(EndDate)并为该员工 - 客户组合定义type = project的新分配来完成。

alt text

相关问题