Я реализую базу данных продукта, используя модель наследования наследуемой (возможно более поздней классификации) таблицы для атрибутов продукта. Это все работает отлично и хорошо, но я пытаюсь понять, как лучше иметь дело с вариантами продукта, сохраняя ссылочную целостность.Ограничение на имя столбца таблицы (postgresql)
Сейчас упрощенная версия моей основной таблицы продукции выглядит следующим образом:
CREATE TABLE product (
id SERIAL NOT NULL,
name VARCHAR(100) NOT NULL,
brand VARCHAR(40) NOT NULL,
color VARCHAR(40)[] NOT NULL
)
(цвет представляет собой массив, так что все стандартные цвета любого данного продукта могут быть перечислены)
Для обработки вариантов Я рассмотрел отслеживание свойства, на которых продукты изменяются в таблице под названием product_variant_theme:
CREATE TABLE product_variant_theme (
id SERIAL NOT NULL,
product_id INT NOT NULL,
attribute_name VARCHAR(40) NOT NULL
)
которое я вставлять строки с про channel_id, и добавьте имя столбца для атрибута в поле attribute_name, например. 'цвет'.
Теперь не стесняйтесь сказать мне, является ли это совершенно глупым способом сделать это в первую очередь, но меня беспокоит отсутствие ограничения между атрибутом_имя и фактическим именем столбца. Очевидно, если изменить таблицу продуктов и удалить этот столбец, я все равно могу оставить строки в моей второй таблице, которые относятся к ней. Функциональный эквивалент того, что я ищу, будет чем-то вроде внешнего ключа в атрибуте_name для представления information_schema, которое описывает таблицы, но я не думаю, что есть какой-либо способ сделать это напрямую, и мне интересно, есть ли любой разумный способ получить такую функциональность здесь.
Спасибо.
Это будет способ EAV, но это не подходит для моих нужд, потому что это осложнит многие другие запросы позже. Если вы представляете, что у меня есть таблица с столбцом с именем «column_name», которая содержит строковое значение с фактическим именем столбца в другой таблице ... если я удалю этот столбец со второй таблицы, я бы хотел, чтобы он каскадировал удаление строки с именем этих столбцов из первой таблицы, если это имеет смысл. –