【问题标题】:Database design: How to restrict a n:m relation by other relations?数据库设计:如何通过其他关系限制 n:m 关系?
【发布时间】:2010-12-15 08:30:40
【问题描述】:

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

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

与客户的项目是一对一的关系。一个项目总是属于某个客户,但一个客户当然可以有多个活跃的项目。

人与客户是一种 n:m 关系,但受项目与客户以及人与客户分配的限制。

更多详情: 我们的一些人为多个客户工作,但只为这些客户的几个项目工作。

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

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

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

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

感谢您的任何想法:)

【问题讨论】:

    标签: database-design architecture relational-database cardinality


    【解决方案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));
    

    【讨论】:

    • 我非常感谢这个解决方案。它很棒而且很简单。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多