У вас есть по крайней мере эти пять вариантов моделирования иерархии типов, которую вы описываете:
- Наследование отдельных таблиц : одна таблица для всех типов продуктов, с достаточным количеством столбцов для хранить все атрибуты всех типов. Это означает много столбцов, большинство из которых имеют NULL в любой заданной строке.
- Наследование классов таблицы : одна таблица для продуктов, ко всем типам продукции. Затем одна таблица для каждого типа продукта, сохраняющая атрибуты, специфичные для этого типа продукта.
- Наследование бетонных таблиц : нет таблицы для общих атрибутов товаров. Вместо этого одна таблица для каждого типа продукта, сохраняющая как общие атрибуты продукта, так и атрибуты продукта.
- Сериализованная LOB : одна таблица для продуктов, сохраняющая атрибуты, общие для всех типов продуктов. В одном дополнительном столбце хранится BLOB полуструктурированных данных в формате XML, YAML, JSON или в другом формате. Этот BLOB позволяет сохранять атрибуты, специфичные для каждого типа продукта. Вы можете использовать причудливые шаблоны проектирования, чтобы описать это, например, «Фасад» и «Memento». Но независимо от того, у вас есть blob атрибутов, которые не могут быть легко запрошены в SQL; вы должны вернуть весь blob обратно в приложение и отсортировать его там.
- Entity-Attribute-Value : одна таблица для продуктов и одна таблица, которая сводит атрибуты к строкам , вместо столбцов. EAV не является корректным проектом в отношении реляционной парадигмы, но многие люди его используют. Это «Шаблон свойств», упомянутый другим ответом. Другие вопросы с тегом eav на StackOverflow для некоторых ошибок.
Я написал об этом больше в презентации, Расширяемое моделирование данных .
Дополнительные мысли о EAV: Хотя многие люди предпочитают EAV, я этого не делаю. Это похоже на самое гибкое решение, и, следовательно, лучшее. Однако имейте в виду поговорку TANSTAAFL . Вот некоторые из недостатков EAV:
- Невозможно сделать столбец обязательным (эквивалентным
NOT NULL
). - Невозможно использовать типы данных SQL для проверки записи.
- Невозможно обеспечить постоянство написания имен атрибутов.
- Невозможно поместить внешний ключ в значения любого атрибута, например для таблицы поиска.
- Получение результатов в обычном табличном макете является сложным и дорогостоящим, потому что для получения атрибутов из нескольких строк вам нужно сделать
JOIN
для каждого атрибута.
Степень гибкости EAV дает вам жертвы в других областях, возможно, делая ваш код сложным (или хуже), чем это было бы для решения исходной проблемы более обычным способом.
И в большинстве случаев, нет необходимости иметь такую степень гибкости. В вопросе OP о типах продуктов гораздо проще создавать таблицу для каждого типа продукта для атрибутов, специфичных для продукта, поэтому у вас есть некоторая согласованная структура, принудительная, по крайней мере, для записей одного и того же типа продукта.
d использовать EAV только в том случае, если каждой строке должно быть разрешено потенциально иметь отдельный набор атрибутов. Когда у вас есть конечный набор типов продуктов, EAV является излишним. Класс Наследование наследования был бы моим первым выбором.
задан Ariella 30 August 2016 в 18:14
поделиться