Создание двух каскадных внешних ключей для одной целевой таблицы - PullRequest
1 голос
/ 01 апреля 2010

У меня есть следующие таблицы:

 user (userid int [pk], name varchar(50))
 action (actionid int [pk], description nvarchar(50))

ссылается на другую таблицу, которая фиксирует взаимосвязь:

<user1> <action>'s <user2>.

Я сделал это со следующей таблицей:

userAction (userActionId int [pk], actionid int [fk: action.actionid], **userId1 int [fk ref's user.userid; on del/update cascade],  userId2 int [fk ref's user.userid; on del/update cascade]**).

Однако, когда я пытаюсь сохранить таблицу userAction, я получаю ошибку, потому что у меня есть два каскадных fk против user.userid.

Есть ли способ исправить это или я должен использовать триггер?

1 Ответ

0 голосов
/ 01 апреля 2010

Вы можете использовать триггер, но я думаю, что лучше на самом деле записывать удаления. Каскадные удаления часто являются причиной низкой производительности, если удаляется большой набор записей, и мы не разрешаем их здесь. Вы не можете основывать их использование на том факте, что приложение удаляет только одну запись за раз. Что если эта запись содержит тысячи дочерних записей? Что делать, если у него есть миллионы? Каскадное удаление или удаление других таблиц с помощью триггера является чрезвычайно рискованным поведением. Лучше написать код удаления именно того, что вы хотите, возможно, даже выполнять пакетную обработку, если слишком много дочерних записей. Кроме того, тот факт, что есть дочерние записи, часто является причиной того, почему вы не должны удалять родительскую запись. Например, предположим, что клиент A больше не является активным клиентом. Но в прошлом он купил у вас миллионы долларов. Вы действительно хотите испортить учетные записи, удалив миллион старых заказов? Может быть, лучше пометить запись как неактивную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...