你可以尝试一些更面向对象的东西。
1。为 Products 定义一个基表
Products(ProductID, CategoryID, <any other common properties>)
2。定义表类别
Categories(CategoryID, Name, Description, ..)
从这里您有很多选项,几乎所有选项都会破坏数据库的规范化。
解决方案 A。
如果您需要添加新产品,这将是一场维护噩梦
A1。为每个类别定义一个单独的表
Cars(CarID, ProductID, ..)
Pets(PetID, ProductID, ..)
A2。根据关系加入表以使用数据
SELECT <fields> FROM Cars INNER JOIN Products ON Cars.ProductID = Products.ProductID
解决方案 B。
不同类型属性(即 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。加入所有表以检索所需的属性。
通过使用这种方法,您不必管理单独表中的所有属性,而是管理它们的值类型。基本上所有涉及的表都是查找表。
缺点是,为了检索每个值,您必须对每个值类型进行“大小写”。
在选择这些方法时,请记住这些文章(here 和 here)。 This forum post 也很有趣,并且在某种程度上与主题相关,即使它是关于本地化的。
您也可以使用 Tomalak's answer 并在需要时添加强类型。