2010-03-16 2 views
3

Любые предложения о том, лучше ли ограничение проверки, или больше? Как они должны быть сгруппированы, если вообще?Одно ограничение проверки или несколько ограничений проверки?

Предположим, у меня есть 3 столбца, которые являются VARCHAR2(1 BYTE), каждый из которых является флагом 'T'/'F'. Я хочу добавить контрольное ограничение для каждого столбца, указав, что разрешены только символы IN ('T', 'F').

Если у меня есть 3 отдельных проверочных ограничений, по одному для каждого столбца:

COL_1 IN ('T', 'F') 

COL_2 IN ('T', 'F') 

COL_3 IN ('T', 'F') 

Или одно проверочное ограничение:

COL_1 IN ('T', 'F') AND COL_2 IN ('T', 'F') AND COL_3 IN ('T', 'F') 

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

(PARENT_CNT > 0 AND PRIMARY_PARENT IS NOT NULL) OR (PARENT_CNT = 0 AND PRIMARY_PARENT IS NULL) 

ответ

8

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

+0

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

+0

Проверяющие ограничения могут также использоваться оптимизатором, и чем они более гранулированы, тем чаще их можно использовать. –

+0

@OMG Ponies, я предпочитаю только таблицы кодов FK для столбцов, которые имеют много значений или нестандартных значений «S» = отправлено, «P» = ожидающий просмотр и т. Д. Для общих «Y» es/«N» или « T "rue /" F "alse только столбцы Мне нравятся контрольные ограничения вместо кодов FK. При использовании ограничения проверки я удостоверяюсь, что столбец назван таким образом, что значение имеет смысл: HasShipped «Y» или «N». –

0

Я рекомендую не использовать varchar вообще. Это не стандартная практика того, как люди хранят логические значения в базах данных без булева типа данных. Я рекомендую ваш наименьший целочисленный тип, где 0 = False и отличное от нуля = True. Ограничения становятся тривиальными для проверки на этом этапе (даже ненужные).

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

+0

Я не делал downvote, но Oracle имеет только тип данных NUMBER. Использование 'NUMBER (1)' допускает значения от 0 до 9 iirc. До сих пор у Oracle нет булевского типа данных: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6263249199595 –

+0

Я с OMG Ponies.Oracle не имеет целочисленного типа, поэтому ваш NUMBER (1) займет 4 байта пространства вместо 2 байтов для CHAR (1). –

+1

Не согласен - моделируйте их как число (1,0) с контрольным ограничением 'my_boolean_column in (1,0)' - по крайней мере, тогда вы можете сделать правильную логику против них. Беспокойство в отношении двух байтов в обмен на способность делать собственную логику против них, вероятно, стоит того, особенно если вам когда-либо нужно заниматься интернационализацией/глобализацией. T & F имеют ценность для англоязычных, но ничего не значат для неанглийских докладчиков. –

-1

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

Для примера, когда существует глобальный идентификатор и локальный идентификатор, если вы хотите, чтобы такое условие, как оба, не могло быть нулевым. И либо один из них имеет значение null, либо оба не равно null. Но вам нужно проверить, что ни одно из них не равно null, либо оба значения не равны нулю.

Пример: У меня есть две колонки BatchId int NULL и SuperBatchId int NULL. Тогда мое контрольное ограничение:

CHECK((BatchId IS NOT NULL) OR (SuperBatchId IS NOT NULL)) 

Это пример ограничения проверки для двух столбцов.

Смежные вопросы