как сохранить целостность данных в ситуации, когда отношение внешнего ключа может быть удалено - PullRequest
0 голосов
/ 24 марта 2012

Допустим, у меня есть таблица PlantGroups. Они зависят от таблицы Plants и имеют внешний ключ PlantId. Каждая группа PlantGroup содержит только один завод.

PlantGroups
==========
...data...
PlantId

Plants
======
PlantId

Если запись в таблице Plants удалена или требуется удалить ее, какой процесс следует предпринять для обеспечения целостности данных PlantGroups?

Более того, что, если другие данные в соответствующей записи PlantGroups (которая зависела от записи Plants, которую запрашивали для удаления) по-прежнему актуальны и стоит сохранить?

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Вне зависимости от того, если у PlantGroups может быть несколько заводов, у вас должна быть дополнительная таблица с PlantGroupID и PlantID.

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

По другим вопросам вы должны изучить каскадные удаления. Кто-то другой может предоставить дополнительную информацию об этом.

0 голосов
/ 24 марта 2012

Я собираюсь пойти с Option Other. Хотя это и не определено ни в одном из прочитанных мною руководств по целостности данных, включая Oracle, в которых в качестве параметров указаны только NULL, CASCADE, RESTRICT, NO ACTION, DEFAULT, я собираюсь свернуть свое собственное.

Вот что произойдет, если кто-то еще не убедит меня в лучшем подходе.

PlantGroups
===========
... data  ...
PlantId

Plant
=====
PlantId
bool isActive

При удалении Plant isActive будет иметь значение false. Это приведет к большому количеству дополнительной логики, которая будет включена в управление базой данных, но позволит поверхностно удалить эти зависимые поля. Вариант каскадного удаления, возможно, будет использоваться в качестве окончательного варианта где-то для устаревших данных, возраст которых превышает определенное количество лет.

1010 * Альтернативно *

У меня также может быть вторая база данных, которая имеет ту же схему, что и первая, и содержит удаленные данные.

...