Любой из определенных вами подходов сработает, да. Но по мере того, как ваш сайт расширяется и растет, вы, вероятно, столкнетесь с проблемами.
Первый предложенный вами подход имеет несколько проблем.
- При добавлении новых типов товаров, например, «шляп», вам, вероятно, потребуется добавить дополнительные столбцы для описания атрибутов шляп, которые не будут иметь отношения к автомобилям или книгам. Это приведет к малонаселенной таблице. то есть каждый продукт / строка будет иметь данные только для подраздела столбцов. Это может повлиять на хранилище, необходимое для хранения данных. (Распределяет ли ваша база данных пространство для этих пустых столбцов? Если это так, ваши требования к пространству могут быстро увеличиться.)
- При внесении изменений в вашу таблицу (добавление столбца, переименование столбца, удаление столбца) может быть огромное снижение производительности при выполнении изменения, поскольку реализация MyISAM копирует всю таблицу во временную таблицу, удаляя старую table, и переименовывает временную таблицу в исходную таблицу. (как описано здесь )
Ваш второй подход помогает решить обе проблемы, описанные выше, но вводит новые проблемы, которые стоит рассмотреть.
- Если ваша стратегия заключается в создании новой таблицы для каждого типа продукта, это может быстро привести к огромному количеству похожих, но немного отличающихся таблиц. Представьте, если бы Amazon или Newegg воспользовались этим подходом - количество таблиц приблизилось бы к абсурдно большим числам, и обслуживание стало бы проблемой. Кроме того, для всех новых продуктов потребуются изменения структуры базы данных, а также кода веб-приложения, расположенного поверх базы данных.
- Настройка индексов для поддержания производительности на тысячах таблиц продуктов представляется излишне обременительной задачей.
Решения:
Как предложил другой автор, начиная с двух простых таблиц - таблицы «product» (ID, имя) и таблицы «attribute» (ID, ProductID, Name, Value), можно было бы решить многие сложности и учесть запуск новых продуктов без изменения базовой структуры таблицы , что является огромным выигрышем. Этот подход потребует использования индексов для оптимизации производительности, но поскольку будут использоваться только две таблицы, вы можете лучше сосредоточить свои усилия.