Я испытываю затруднения, предлагающие решение для следующей проблемы.
Позволяет говорят, что у меня есть дб, который смотрит что-то как следующее:
Таблица проблемы
Id | Details | CreateDate | ClosedDate
Проблема отмечает таблицу
Id | ObjectId | Notes | NoteDate
Таблица присвоения проблемы
Id | ObjectId | AssignedToId| AssignedDate
Я хотел бы, позволяют соединение проблемы к другой проблеме. Я думал о добавлении столбца к таблице Issue под названием ParentIssueId, и это позволит мне способность связать проблемы, но я предвижу циклические ссылки, происходящие в таблице проблемы, если я довожу эту реализацию до конца. Существует ли лучший способ пойти о выполнении этого, и если так, как?
Спасибо
Создать таблицу:
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 для обнаружения этого круга.
Если проблема может быть связана с одной другой «родительской» проблемой, то наличие столбца «ParentId» в таблице нормально (NULL означает отсутствие родительского элемента). Если проблема может быть связана с более чем одной проблемой, то потребуется новая таблица «многие ко многим» (или «ссылка»).
В любом случае проверка и предотвращение циклических ссылок (особенно когда «круг» охватывает три или более проблем) будет сложной задачей. Либо вы проверяете круг во время ОБНОВЛЕНИЯ, основывая обновление на CTE, который проверяет циклические ссылки и не выполняет обновление, если они обнаружены, либо вы можете выполнить обновление в хранимой процедуре, которая сначала проверяет круги и выдает обновление только в том случае, если проверка проходит. (Конечно, вы должны беспокоиться о проблемах параллелизма - что, если данные будут изменены между вашей проверкой и вашим обновлением - что делает обновление на основе CTE предпочтительным, если оно более сложное.)
Вы можете добавить таблицу соединений / ссылок, которая будет выглядеть примерно так:
IssueLink
IssueId | LinkedIssueId
Где оба столбца являются внешними ключами к проблеме стол.
Это позволит вам связывать проблемы произвольно, а также позволит связать одну проблему с несколькими другими с помощью отношений родительского стиля.
Вы захотите поместить уникальный индекс в два столбца, чтобы не получить повторяющиеся данные, а также протестируйте, чтобы убедиться, что нет такого условия, как это:
IssueId & LinkedIssueId = LinkedIssueId & IssueId
(что приведет к логический дубликат)
Посмотрите здесь: http://en.wikipedia.org/wiki/Junction_table Единственное отличие состоит в том, что Junction table указывает на ту же таблицу, чтобы создать одну отношения ко многим.