Hi,
You could try something more object oriented.
1. Define a base table for Products
Products(ProductID, CategoryID, <any other common properties>)
2. Define a table Categories
Categories(CategoryID, Name, Description, ..)
From here you have a lot of options and almost all of them will break the normalization of your database.
Solution A.
Will be a maintaince nightmare if you need to add new products
A1. Define a separate table for each of the categories
Cars(CarID, ProductID, ..)
Pets(PetID, ProductID, ..)
A2. Join the tables based on the relationships in order to use the data
SELECT <fields> FROM Cars INNER JOIN Products ON Cars.ProductID = Products.ProductID
Solution B.
Maintainance nightmare for different types of properties (i.e. int, varchar, etc)
B1. Define a table for Properties
CategoryProperty (CPID, Name, Type)
B2. Define a table to hold the associations between Categories and the Properties
PropertyAssociation (CPID, PropertyID)
B12. Define a table to hold the properties (Alternative for B1 and B2)
Properties(CategoryID, PropertyID, Name, Type)
B3. For each type of property (int, double, varchar, etc.) add a value table
PropertyValueInt(ProductID, CPID, PropertyID, Value)
- for int
PropertyValueString(ProductID, CPID, PropertyID, Value)
- for strings
PropertyValueMoney(ProductID, CPID, PropertyID, Value)
- for money
B4. Join all the tables to retreive the desired property.
By using this approach, you will not have to manage all the properties in separate table, but the value types of them. Basically all the tables involved will be lookup tables.
The disadvantage, is that, in order to retreive each value, you have to "Case" for every value type.
Take in mind these articles (here and here) when choosing any of these approaches. This forum post is also interesting and somehow related to the subject, even though it is about localization.
You could also use Tomalak's answer and add strong typing if you feel the need.