我有一些产品属于某个类别.
每个类别可以具有不同的属性.
例如,
类别汽车具有属性颜色,功率,...
类别宠物有属性 重量,年龄,...
类别数量约为10-15.每个类别的属性数量为3-15.产品数量非常大.
这个应用程序的主要要求是非常好的搜索.我们将选择类别,并为此类别中的每个属性输入标准.
必须为此方案设计数据库.(SQL Server 2005)
经典的设计方法是(星号表示主键列):
Product ProductId* CategoryId: FK to Category.CategroyId Name Category CategoryId* Name Property PropertyId* Name Type CategoryProperty CategoryId*: FK to Category.CategoryId PropertyId*: FK to Property.PropertyId ProductProperty ProductId*: FK to Product.ProductId PropertyId*: FK to Property.PropertyId ValueAsString
如果您可以接受这样的事实:每个属性值都将作为字符串传递给DB,并且类型转换信息存储在Property表中,则此布局就足够了.
查询将是这样的:
SELECT Product.ProductId, Product.Name AS ProductName, Category.CategoryId, Category.Name AS CategoryName, Property.PropertyId, Property.Name AS PropertyName, Property.Type AS PropertyType, ProductProperty.ValueAsString FROM Product INNER JOIN Category ON Category.CategoryId = Product.CategoryId INENR JOIN CategoryProperty ON CategoryProperty.CategoryId = Category.CategoryId INNER JOIN Property ON Property.PropertyId = CategoryProperty.PropertyId INNER JOIN ProductProperty ON ProductProperty.PropertyId = Property.PropertyId AND ProductProperty.ProductId = Product.ProductId WHERE Product.ProductId = 1
您提供的WHERE条件越多(结合使用,例如使用AND),查询的速度就越快.如果您已正确索引表,那就是.
实际上,该解决方案对于全文索引情况并不理想.另一个表以更加非规范化的方式存储与ProductId关联的所有文本可以在这里提供帮助.此表需要通过侦听ProductProperty表中的更改的触发器进行更新.
如果应用程序的用户必须先选择一个类别才能搜索,我会按类别将您的产品分成不同的数据库表.这种解决方案也表明,类别本身的共同点很少.按类别细分它也会使每次搜索更快,因为当你的用户正在寻找宠物时,不会浪费时间搜索汽车.
将产品拆分为类别后,应使用每个类别中产品的公共属性轻松创建表.应用程序的用户界面应该是动态的(我正在考虑Web表单),因为用户可以选择的属性应该在用户选择类别时更改.
请注意,如果您要将产品列在多个类别中,则此解决方案将导致表格中出现重复数据.在设计数据库时,需要在速度和标准化之间进行权衡.如果您没有适合多个类别的产品,那么我认为这将是最快的解决方案(就搜索速度而言).