2016-06-04 4 views
0

У меня есть несколько справочных таблиц, то есть AuditType, StatusType и т. Д. Эти таблицы содержат стандартные данные ENUM. Мое намерение состоит в том, чтобы переустанавливать данные этих таблиц каждый раз, когда я развертываю свои изменения в базе данных, т. Е. Эти таблицы не являются идентификаторами.Справочные таблицы данных ссылочной целостности

Однако эти таблицы могут иметь отношение внешнего ключа к некоторым другим таблицам транзакций. Проблема заключается в том, что, хотя я пытаюсь перестроить данные в этих (справочных) таблицах, я не могу удалить данные, поскольку они уже упоминаются.

Правильно ли иметь отношение внешних ключей в таблице транзакций? Если не так, как я могу справиться с этим сценарием?

Заранее спасибо.

+0

- эта справочная таблица со статическими данными? – Rahul

+0

Что вы подразумеваете под статическими данными? – Immortal

ответ

2

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

Вы должны заполнить эти таблицы при создании базы данных, а затем использовать insert и delete для внесения изменений.

Как только внешние ключи находятся на месте, база данных будет обеспечивать соблюдение реляционной целостности. Это обычно означает, что база данных проверяет правильность строк в таблице транзакций. Это хорошая вещь. Это «C» в свойствах ACID баз данных.

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

+1

Решение Gordons окупится в неизменную пользу для вас на протяжении многих лет. В этой ситуации вы часто обнаруживаете, что это скомпилированный клиентский код, который фактически владеет перечислением. Вот почему он никогда не может измениться, даже если это легко сделать в БД. –

+1

Еще одно предостережение, которое следует иметь в виду, заключается в том, что если у вас есть сохраненный процесс, который загружает таблицу транзакций перечислениями, но у вас действительно нет собственных перечислений, тогда вам, возможно, придется автоматически вставлять в runtime новое перечисление в родительскую таблицу принять транзакцию. Это часто бывает, когда ваша таблица транзакций представляет собой журнал уже завершенных транзакций, поэтому вы предпочтете получить фактическую транзакцию, а не потерпеть неудачу с точки зрения целостности ref, потому что отсутствует перечисление. –

+0

@ Gordon, Спасибо за тонну за ответ, мне жаль, что я так объяснил все, ссылки на самом деле так, как вы их упомянули, таблица транзакций действительно имеет внешние ключи к справочным таблицам. Я так рад тому, что вы придумали, и это действительно изменило (в хорошем смысле) то, как я смотрю на несколько других вещей. – Immortal