У меня есть набор продуктов с различными возможными атрибутами для каждого продукта. Например. Продукт А имеет название, размер, цвет, форму. Продукт B имеет название, калории, сахар и т. Д. Один из способов решить эту проблему:
1) Создание таблиц
Products (id, name)
Attributes (id, name)
Product_Attributes (product_id, attribute_id, value as string)
Это обеспечивает максимальную гибкость, но я слышал, что многие люди рекомендуют против этого, хотя я не уверен, почему. Я имею в виду, что если бы эти таблицы назывались Teams, Players, Team_Players, мы все согласились бы, что это правильный реляционный дизайн.
Каждый, кто объясняет мне, почему это плохо, делает это в контексте полностью гибкого реляционного дизайна, в котором вы никогда не создаете реальные таблицы за несколькими базовыми начальными таблицами (например, object, attribute, object_attribute) - что Я думаю, что мы все можем согласиться, это плохо. Но это гораздо более ограниченная и ограниченная версия (только продукты, а не каждый объект в системе), поэтому я не думаю, что было бы справедливо объединять эти две архитектуры вместе.
С какими проблемами вы столкнулись (опытные или теоретические), которые делают этот дизайн таким плохим?
2) Еще один способ решить эту проблему - создать таблицу Product с несколькими столбцами, такими как Size, Color, Shape, Weight, Sugar и т. Д., А затем добавить несколько дополнительных столбцов в конце, чтобы дать нам некоторую гибкость. Это создаст обычно разреженные строки, заполненные в основном значениями NULL. Людям нравится этот подход, но у меня вопрос: сколько столбцов может быть у вас до того, как этот подход потеряет свою производительность? Если у вас есть 200 столбцов, я думаю, что это уже не умный ход, а как насчет 100 столбцов? 50 столбцов? 25 столбцов?
3) Последний известный мне подход заключается в том, чтобы хранить все атрибуты в виде большого двоичного объекта (возможно, JSON) в одном столбце таблицы «Продукты». Мне нравится такой подход, но он не чувствуется правильным. Запросы сложны. И если вы хотите иметь возможность легко изменить имя атрибута позже, вам нужно либо проанализировать каждую запись по отдельности, либо сделать так, чтобы они вводились в ваш BLOB-объект по некоторому идентификатору. Если вы идете по пути id, вам понадобятся другие атрибуты таблицы, и все будет выглядеть как подход № 1 сверху, за исключением того, что вы не сможете присоединить attribute_id со своим BLOB-объектом, поэтому я надеюсь, что вы не хотите ничего запрашивать по имени атрибута.
Что мне нравится в этом подходе, так это то, что вы можете запрашивать один продукт, а в своем коде вы можете легко получить доступ ко всем его свойствам - быстро. И если вы удалите продукт, вам не придется очищать другие таблицы - легко оставаться последовательным.
4) Я читал кое-что о возможности индексирования строго типизированных форматов xml в некоторых СУБД, но, честно говоря, я не очень много знаю об этом подходе.
Я застрял. Я чувствую, что подход № 1 - лучшая ставка, но все, что я читаю, говорит, что так воняет. Как правильно думать об этой проблеме, чтобы иметь возможность решить, какой метод лучше всего подходит для данной ситуации? Мы приветствуем больше идей, чем я перечислил!