Дизайн DB - Соединение с родителем без проблем циклической ссылки

Я испытываю затруднения, предлагающие решение для следующей проблемы.

Позволяет говорят, что у меня есть дб, который смотрит что-то как следующее:

Таблица проблемы

Id | Details | CreateDate | ClosedDate

Проблема отмечает таблицу

Id | ObjectId | Notes | NoteDate

Таблица присвоения проблемы

Id | ObjectId | AssignedToId| AssignedDate

Я хотел бы, позволяют соединение проблемы к другой проблеме. Я думал о добавлении столбца к таблице Issue под названием ParentIssueId, и это позволит мне способность связать проблемы, но я предвижу циклические ссылки, происходящие в таблице проблемы, если я довожу эту реализацию до конца. Существует ли лучший способ пойти о выполнении этого, и если так, как?

Спасибо

1
задан zSynopsis 29 April 2010 в 17:32
поделиться

3 ответа

Создать таблицу:

LinkedIssues
IssueIDa    pk composite primary key, fk to Issue table
IssueIDb    pk composite primary key, fk to Issue table

ПК не будет дублировать некоторые дубликаты, но создаст контрольное ограничение: IssueIDa , поэтому у вас не будет дубликата, такого как:

row 1 IssueIDa=123
      IssueIDb=987

row 2 IssueIDa=987
      IssueIDb=123

, однако, чтобы предотвратить круг вроде:

row 1 IssueIDa=123
      IssueIDb=987

row 2 IssueIDa=987
      IssueIDb=456

row 3 IssueIDa=456
      IssueIDb=123

, вам понадобится триггер, который разрешает цепочку и дает сбой на круге. Лучше всего использовать рекурсивный CTE для обнаружения этого круга.

1
ответ дан 3 September 2019 в 00:57
поделиться

Если проблема может быть связана с одной другой «родительской» проблемой, то наличие столбца «ParentId» в таблице нормально (NULL означает отсутствие родительского элемента). Если проблема может быть связана с более чем одной проблемой, то потребуется новая таблица «многие ко многим» (или «ссылка»).

В любом случае проверка и предотвращение циклических ссылок (особенно когда «круг» охватывает три или более проблем) будет сложной задачей. Либо вы проверяете круг во время ОБНОВЛЕНИЯ, основывая обновление на CTE, который проверяет циклические ссылки и не выполняет обновление, если они обнаружены, либо вы можете выполнить обновление в хранимой процедуре, которая сначала проверяет круги и выдает обновление только в том случае, если проверка проходит. (Конечно, вы должны беспокоиться о проблемах параллелизма - что, если данные будут изменены между вашей проверкой и вашим обновлением - что делает обновление на основе CTE предпочтительным, если оно более сложное.)

0
ответ дан 3 September 2019 в 00:57
поделиться

Вы можете добавить таблицу соединений / ссылок, которая будет выглядеть примерно так:

IssueLink

IssueId | LinkedIssueId

Где оба столбца являются внешними ключами к проблеме стол.

Это позволит вам связывать проблемы произвольно, а также позволит связать одну проблему с несколькими другими с помощью отношений родительского стиля.

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

IssueId & LinkedIssueId = LinkedIssueId & IssueId

(что приведет к логический дубликат)

Посмотрите здесь: http://en.wikipedia.org/wiki/Junction_table Единственное отличие состоит в том, что Junction table указывает на ту же таблицу, чтобы создать одну отношения ко многим.

1
ответ дан 3 September 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: