Полный Вопрос:
С ребенком таблицы, связанной со строкой в его прародителя таблицы внешний ключ (ссылки прародитель первичный ключ), можно использовать поле из ссылочного прародителя строки в композитной чуждого дочернего стола ключ?Возможно ли использовать поле из строки grandparent по ссылке (через внешний ключ) в составном внешнем ключе дочерней таблицы?
В моей текущей базе данных есть основная родительская таблица, Проекты. Проекты имеет два детских стола, Рабочие места и Задачи. Задачи затем имеет детский стол Подзадачи. Подзадачи затем имеет детский стол Задания, который представляет собой таблицу x-ref, служащую сотрудниками на Подзадачи. Проблема, которую я придумал, заключается в назначении JobTitles - Задания; JobTitles принадлежит проекту, и как таковой Подборки при любом данных проекте должен только быть в состоянии ссылаться JobTitles, которые разделяют проект. Недавно я спросил this question относительно ограничения выбора JobTitle тем, кто использует проект. Однако с тех пор я нашел сложный внешний ключ, чтобы быть более чистым решением.
Простой макет базы данных:
- Проекты
- JobTitles
- Задачи
- подзадач
- Задания
- подзадач
Я нашел, как создать составной ключ here, но для этого мне нужно будет использовать первичный ключ Проекта как часть составного ключа.
Таблицы:
- Проекты
- ProjectName (PK)
- ProjectID (уникальный индекс)
- JobTitles
- Jo BTITLE
- ProjectID (Foreign Key -> Projects.ProjectID) (Composite PK: JobTitle-ProjectID)
- JobTitleID (уникальный индекс)
- Задачи
- TaskName
- ProjectID (Внешний ключ -> Projects.ProjectID) (Композитный ПК: TaskName-ProjectID)
- TaskID (Uni Индекс дие)
- подзадачи
- SubtaskName
- TaskID (Foreign Key -> Tasks.TaskID) (Composite PK: SubtaskName-TaskID)
- SubtaskID (уникальный индекс)
- Задания
- EmployeeID (Foreign Key)
- SubTaskID (Foreign Key -> Subtasks.SubtaskID) (Composite PK: EmployeeID-SubtaskID)
- JobTitleID (Foreign Key -> JobTitles.JobTitleID)
- AssignmentID (уникальный индекс)
для того, чтобы назначить JobTitle к уступке, я хочу, чтобы создать составной внешний ключ с помощью присвоения в ProjectID (от родительского Task) и его выбранной JobTitleID. Единственная проблема заключается в том, что я понятия не имею, как захватить ProjectID, который находится на расстоянии двух поколений, для использования в ключе. Можно было бы передать ProjectID вниз через каждое поколение, обернув его составным ключом в каждой таблице, но составные клавиши не могут что-то бросать вокруг волей-неволей, учитывая то, что они берут на себя производительность (не говоря уже о передаче значения вниз кажется немного неряшливым). Есть ли способ добраться до ProjectID для использования в ключе, не передавая его через другие таблицы?
Да, если я не могу получить доступ к ProjectID напрямую, это, безусловно, лучший способ сделать это. Мне очень нравится идея рекурсивных задач (я только недавно научился использовать фактический идентификационный индекс как PK вместо поля ID), но макет задачи является статическим (всегда project-> task-> subtask, не более/менее). Спасибо за вашу помощь! – PeaBucket