гарантировать дочерние записи в одной или другой таблице, но не в обеих? - PullRequest
1 голос
/ 12 марта 2010

У меня есть таблица с двумя дочерними таблицами. Для каждой записи в родительской таблице мне нужна одна и только одна запись в одной из дочерних таблиц - ни одна в каждой, ни одна. Как мне это определить?

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

У меня есть база данных, которая содержит данные, относящиеся к опросам пользователей. Первоначально он был разработан с одним методом аутентификации для начала опроса. С тех пор требования изменились, и теперь есть два способа подписать кого-либо, чтобы начать опрос.

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

Я использую MySQL, так что, возможно, есть функция, которую MySQL не реализует, которая позволяет мне это делать.

1 Ответ

1 голос
/ 12 марта 2010

Есть несколько способов реализовать это

Логика логического флага

У вас может быть логический флаг в ParentTable, называемый ChildTableDataInserted, и вы можете обновить его до TRUE, если строка вставлена ​​в какую-либо одну таблицу. Вставлять в дочернюю строку только в том случае, если ChildTableDataInserted имеет значение False. Это, конечно, зависит от всех вставок, использующих хранимые процедуры, которые вы создаете, и может быть легко нарушено, но накладные расходы на базу данных невелики.

Триггеры

Поместите ПЕРЕД ВСТАВКОЙ на вставку данных в обе дочерние таблицы, и если ваше условие сбоя выполнено, вы можете вызвать ошибку для вставки.

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

Подробнее о триггерах читайте здесь

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

...