0

我觉得最好举个例子来问:有人、有客户、有项目。

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

对客户的项目是 1: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 的情况下将其分配给项目 1,2 或 3 是不可能的?

感谢您的任何想法:)

4

2 回答 2

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));
于 2010-12-15T09:01:31.387 回答
0

在此模型中,Project是 的子类型Assignment。例如,赋值可以是P = project或类型O = Open

  • 每个分配(打开或项目)仅属于一个客户。
  • 可以有多个员工在不同的时间段从事一项任务。

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

替代文字

于 2010-12-15T12:47:45.213 回答