PostgreSQL условный ENUM - PullRequest
       1

PostgreSQL условный ENUM

0 голосов
/ 03 октября 2018

Допустим, у меня есть таблица inventory со столбцами item_id, category и size.

  1. item_id - это автоинкрементное целое число (первичный ключ)
  2. category - это ENUM
  3. size - это ENUM

Я хочу, чтобы size был условным ENUM.«Условный» означает, что для category=shoes, size имеет значения 5, 6, 7, 8, 35, 36, 37, 38 и т. Д., Тогда как для category=tshirt, size имеет значенияS, M, L и т. Д.

Для элемента с category=shoes его size не должно быть разрешено как S.

Как правильно решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Этого можно добиться с помощью сложного проверочного ограничения, например:

ALTER TABLE inventory ADD CONSTRAINT inventory_size_check
CHECK((category = 'shoes' AND size BETWEEN '5' AND '45') OR
      (category = 'tshirt' AND size BETWEEN 'S' AND 'XXL'));

Перечисление size должно содержать все размеры для всех категорий.

0 голосов
/ 03 октября 2018

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

Таким образомвы разрешаете только те комбинации, которые действительны в вашем инвентаре.

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

Чтобы добавить внешний ключ с помощьюсвою схему, сделайте это:

ALTER TABLE inventory 
ADD CONSTRAINT fk_category_size 
FOREIGN KEY (category_enum,size_enum) 
REFERENCES category_size (category_enum,size_enum);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...