Ограничение значений полей базы данных на основе комбинаций других полей - PullRequest
0 голосов
/ 07 марта 2012

Моя задача - создать простую базу данных для хранения информации об ИТ-инфраструктуре на моей работе.

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

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

ANIMAL_ID, ANIMAL_NAME, SPECIES, NUMBER_LEGS, NUMBER_TOES... (терпите меня здесь).

Теперь предположим, что это укрытие хранит только two species, dogs and birds. Очевидно, вы можете ограничить NUMBER_LEGS приемом значений только от 0-4. Тем не менее,

у птиц они никогда не будут иметь более двух ног .

Точно так же у птицы с одной ногой (другая была откушена собакой) было бы максимум 3 пальца, а не шесть обычных (тогда как у собаки могло быть что угодно от 1 до 20 пальцев). ) . * * тысяча двадцать-одна

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

(например, choose animal, then choose number of legs, then number toes, etc). Тем не менее, мне интересно, если:

A) Если типично применять эти ограничения на уровне данных, чтобы база данных не могла содержать, скажем,

птица с тремя ногами или трехногая собака с 20 пальцами .

B) Если A истинно, как бы я поступил в общей реляционной базе данных?

(Обратите внимание, что хотя число пальцев ног и количество когтей являются числовыми полями, в реальной ситуации это не всегда верно. Мне может понадобиться набор определенного атрибута (скажем, ANIMAL_COLOUR), где возможные значения BLACK, BLUE, RED, PURPLE, BRINDLE и т. Д. Но тогда СОБАКА не может иметь ЦВЕТОВОГО значения PURPLE , в то время как BIRD может быть PURPLE или BLUE, но не BRINDLE .)

1 Ответ

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

Они известны как проверка ограничений .Пример для Oracle:

create table ANIMALS
(
  ANIMAL_ID     number
 ,ANIMAL_NAME   varchar2(100)
 ,SPECIES       varchar2(100)
 ,NUMBER_LEGS   number
 ,NUMBER_TOES   number
 ,constraint NUM_TOES_CK check(NUMBER_TOES <= NUMBER_LEGS * 3)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...