Сочетания клавиш внешнего ключа в таблице - PullRequest
5 голосов
/ 13 октября 2011

Представьте себе схему как таковую.

NOTE TABLE:            NoteID, Note, DetailedTaskID, .....

DETAILED TASK TABLE:   DetailedTaskID, WorkOrderID, .....

WORKORDER TABLE:       WorkOrderID, ProjectID, .....

PROJECT TABLE:         ProjectID, .....

Теперь с помощью этой схемы, скажем, я хочу получить все заметки, которые связаны с конкретным проектом, и в результате я получаю довольно много соединений.

IE: Note JOIN DetailedTask JOIN WorkOrder JOIN Project

Итак, мой вопрос заключается в следующем: когда (если вообще) уместно ли добавить «ярлык» столбца для таблицы (в данном случае ProjectID)?

Таким образом, в основном изменив таблицу заметок на это: NoteID, Note, подробныйTaskID, ProjectID

Ответы [ 2 ]

7 голосов
/ 13 октября 2011

Краткий ответ: Никогда, никогда, никогда.

Более длинный ответ: только когда:

  1. Вы определили, что производительность JOIN-соединений неприемлема (что редко бывает так).

  2. Вы действительно исчерпали все менее опасные альтернативы.

  3. Вы готовы взять на себя дополнительную работу, связанную с синхронизацией избыточной, нормализованной информации

  4. Вы готовы согласиться с тем фактом, что технически возможно, что ваша база данных сможет возвращать неверные результаты, если вам когда-либо не удастся синхронизировать данные.

1 голос
/ 13 октября 2011

То, о чем вы говорите, называется отношением внешнего ключа. Это основа для нормализации данных . Короче говоря, вы бы добавили отношение внешнего ключа (ProjectID) к своей таблице заметок, если заметка (т.е. NoteID) принадлежит проекту.

Преимущества этого состоят в том, что вы можете запрашивать эти реляционные данные, например:

select
  Note.*,
  Project.*
from Note
left join Project
on Note.ProjectId = Project.ProjectId

Этот запрос выдаст все заметки и данные проекта (если он является частью проекта), связанные с ним.

...