完整问题:
从通过外键(引用祖父主键)链接到其祖父表中的行的子表中,是否可以使用子表的复合外键中引用的祖父行中的字段?
我当前的数据库设计是有一个主父表Projects。Projects有两个子表JobTitles和Tasks。Tasks然后有一个子表Subtasks。Subtasks然后有一个子表Assignments,这是一个将员工放在Subtasks上的外部参照表。我遇到的问题是将JobTitles分配给Assignments;JobTitles属于一个Project,因此任何给定Project下的Assignments应该只能引用共享一个Project的JobTitles。我最近问了这个关于将JobTitle选择限制为共享项目的人的问题。但是,从那时起,我发现复合外键是一种更清洁的解决方案。
简单的数据库布局:
- 项目
- 职称
- 任务
- 子任务
- 作业
- 子任务
我在这里找到了如何创建复合键,但为此我需要使用项目的主键作为复合外键的一部分。
表:
- 项目
- 项目名称(PK)
- ProjectID(唯一索引)
- 职称
- 职称
- ProjectID(外键-> Projects.ProjectID)(复合PK:JobTitle-ProjectID)
- JobTitleID(唯一索引)
- 任务
- 任务名称
- ProjectID(外键-> Projects.ProjectID)(复合PK:TaskName-ProjectID)
- TaskID(唯一索引)
- 子任务
- 子任务名称
- TaskID(外键-> Tasks.TaskID) (复合PK: SubtaskName-TaskID)
- SubtaskID(唯一索引)
- 作业
- EmployeeID(外键)
- SubTaskID(外键-> Subtasks.SubtaskID)(复合PK:EmployeeID-SubtaskID)
- JobTitleID(外键 -> JobTitles.JobTitleID)
- 分配 ID(唯一索引)
为了将 JobTitle 分配给分配,我想使用分配的 ProjectID(来自其父任务)及其选定的 JobTitleID 设置复合外键。唯一的问题是我不知道如何获取两代之后的 ProjectID 用于密钥。可以通过将 ProjectID 包装在每个表中的复合键中来将其传递到每一代,但考虑到它们对性能的影响(更不用说传递值),复合键并不是随便扔的东西下来似乎有点草率)。有没有办法在不通过其他表的情况下获取 ProjectID 以在密钥中使用?