В последнее время я размышлял о некоторых вещах, и мне было интересно, каким будет ПРАВИЛЬНЫЙ способ сделать что-то вроде следующего сценария (я уверен, что ребята из DB довольно часто делают что-то подобное).
Допустим, у вас есть таблица продуктов, что-то вроде этого (MySQL):
CREATE TABLE `products` (
`id` int(11) NOT NULL auto_increment,
`product_name` varchar(255) default NULL,
`product_description` text,
KEY `id` (`id`),
KEY `product_name` (`product_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Здесь нет ничего необычного. Теперь предположим, что в другой таблице есть иерархия категорий, и есть отдельная таблица, которая связывает отношения «многие ко многим» с таблицей продуктов, так что каждый продукт принадлежит к какой-то категории (я опущу эти потому что это не проблема здесь).
Теперь наступает интересная часть - что, ЕСЛИ каждая из категорий обязывает дополнительный набор переменных к элементам продукта. Например, продукты в категории компьютерных мониторов должны иметь поле перечисления LCD / CRT, перечисление размера экрана и т. Д. - и некоторую другую категорию, например, у мороженого есть некоторые другие переменные, такие как аромат varchar, время хранения на полках int и т. Д.
Проблема в том, что все продукты имеют общий набор переменных (идентификатор, имя, описание и тому подобное), но есть дополнительные переменные, которые не согласуются между категориями - но все продукты должны иметь общий набор, потому что в конце концов, все они принадлежат к группе продуктов, поэтому можно запросить, например, SELECT * FROM products ORDER BY company_id (тривиальный пример, возможно, не репрезентативный, но вы получите представление).
Теперь я вижу несколько возможных решений:
- создать отдельную таблицу для каждой категории продуктов и хранить там продукты с соответствующими дополнительными переменными - глупо и не подходит для запросов
- таблица продуктов остается неизменной с общими переменными, и для каждой категории создайте отдельную таблицу с дополнительными переменными, связывающими две таблицы с JOIN - нормализовано, но возникают проблемы с производительностью и ясностью запросов - как бы отфильтровать продукты из категории (1-я таблица - продукты ) и дополнительный фильтр для дополнительных переменных (17-дюймовые ЖК-мониторы, т. е.) - это потребует хитрости SQL JOIN
- таблица products остается прежней и добавляет еще один текст типа переменной, который содержит, например, данные JSON, которые содержат дополнительные переменные - компактные и аккуратные, но не могут фильтровать переменные с помощью SQL
Я знаю, что упускаю что-то совершенно очевидное и простое - я немного устала от методов нормализации :)
edit: Я искал стекоперемещение, прежде чем задал этот вопрос безуспешно. Однако после того, как я опубликовал вопрос, я нажал на один из моих тегов «нормализация» и обнаружил несколько похожих вопросов, в результате чего я нашел «реляционный дизайн специализации обобщения». Суть этой истории в том, что это, должно быть, первое в моей жизни в интернете, что теги действительно полезны при поиске. Тем не менее, я все еще хотел бы услышать от вас, ребята, и ваше мнение.
edit2 : проблема с подходом № 2 состоит в том, что я ожидаю где-то около 1000 специализаций. Существует иерархия (глубина 1-4 уровня) категорий, и конечные узлы добавляют специализированные переменные - они накапливаются в порядке ~ 1000, поэтому было бы немного непрактично добавлять специализированные таблицы для объединения.
edit3 : Из-за огромного количества изменчивости атрибутов в моем случае предложенное «значение атрибута сущности» выглядит как путь. Здесь приходит запрос кошмаров! Спасибо, ребята.