Вы можете попробовать что-то более объектно-ориентированное.
1. Определить базовую таблицу для продуктов
Products(ProductID, CategoryID, <any other common properties>)
2. Определить таблицу Категории
Categories(CategoryID, Name, Description, ..)
Отсюда у вас много вариантов, и почти все они нарушат нормализацию вашей базы данных.
Раствор А.
Будет кошмаром сопровождения, если вам нужно будет добавить новые продукты
A1. Определите отдельную таблицу для каждой из категорий
Cars(CarID, ProductID, ..)
Pets(PetID, ProductID, ..)
A2. Соедините таблицы на основе отношений, чтобы использовать данные
SELECT <fields> FROM Cars INNER JOIN Products ON Cars.ProductID = Products.ProductID
Раствор Б.
Поддержка кошмара для различных типов свойств (например, int, varchar и т. Д.)
B1. Определить таблицу для свойств
CategoryProperty (CPID, Name, Type)
B2. Определите таблицу для хранения связей между категориями и свойствами
PropertyAssociation (CPID, PropertyID)
B12. Определите таблицу для хранения свойств (Альтернатива для B1 и B2)
Properties(CategoryID, PropertyID, Name, Type)
B3. Для каждого типа свойства (int, double, varchar и т. Д.) Добавьте таблицу значений
PropertyValueInt(ProductID, CPID, PropertyID, Value)
- для инт
PropertyValueString(ProductID, CPID, PropertyID, Value)
- для струнных
PropertyValueMoney(ProductID, CPID, PropertyID, Value)
- за деньги
B4. Соедините все таблицы, чтобы получить желаемое свойство.
При использовании этого подхода вам не придется управлять всеми свойствами в отдельной таблице, а только их типами значений. В основном все задействованные таблицы будут таблицами поиска.
Недостатком является то, что для получения каждого значения необходимо использовать «Case» для каждого типа значения.
Помните об этих статьях ( здесь и здесь ) при выборе любого из этих подходов. Это сообщение на форуме также интересно и как-то связано с темой, хотя и о локализации.
Вы также можете использовать ответ Томалака и добавить строгий набор текста, если вы чувствуете необходимость.