sql – ECommerce Storefront网站:以编程方式发现类似产品
我正在开发一个店面网络应用程序.当潜在客户在网站上查看产品时,我想从数据库中自动建议一组类似的产品(而不是要求人们明确地输入产品相似性数据/映射).
事实上,当你想到它,大多数店面数据库已经有很多相似性数据可用.在我的情况下,产品可能是: >映射到制造商(又名品牌), 通过计算产品和所有其他产品之间的共享属性数量,您可以计算一个“相似度分数”,用于将其他产品与客户正在查看的产品进行比较.这是我的初始原型实现: ;WITH ProductsRelatedByTags (ProductId,NumberOfRelations) AS ( SELECT t2.ProductId,COUNT(t2.TagId) FROM ProductTagMappings AS t1 INNER JOIN ProductTagMappings AS t2 ON t1.TagId = t2.TagId AND t2.ProductId != t1.ProductId WHERE t1.ProductId = '22D6059C-D981-4A97-8F7B-A25A0138B3F4' GROUP BY t2.ProductId ),ProductsRelatedByCategories (ProductId,COUNT(t2.CategoryId) FROM ProductCategoryMappings AS t1 INNER JOIN ProductCategoryMappings AS t2 ON t1.CategoryId = t2.CategoryId AND t2.ProductId != t1.ProductId WHERE t1.ProductId = '22D6059C-D981-4A97-8F7B-A25A0138B3F4' GROUP BY t2.ProductId ) SELECT prbt.ProductId AS ProductId,IsNull(prbt.NumberOfRelations,0) AS TagsInCommon,IsNull(prbc.NumberOfRelations,0) AS CategoriesInCommon,CASE WHEN SimilarProduct.ManufacturerId = SourceProduct.ManufacturerId THEN 1 ELSE 0 END as SameManufacturer,CASE WHEN SimilarProduct.ManufacturerId = SourceProduct.ManufacturerId THEN IsNull(prbt.NumberOfRelations,0) + IsNull(prbc.NumberOfRelations,0) + 1 ELSE IsNull(prbt.NumberOfRelations,0) END as SimilarityScore FROM Products AS SourceProduct,Products AS SimilarProduct INNER JOIN ProductsRelatedByTags prbt ON prbt.ProductId = SimilarProduct.Id FULL OUTER JOIN ProductsRelatedByCategories prbc ON prbt.ProductId = prbc.ProductId WHERE SourceProduct.Id = '22D6059C-D981-4A97-8F7B-A25A0138B3F4' 其结果是这样的数据: ProductId TagsInCommon CategoriesInCommon SameManufacturer SimilarityScore ------------------------------------ ------------ ------------------ ---------------- --------------- 6416C19D-BA4F-4AE6-AB75-A25A0138B3A5 1 0 0 1 77B2ECC0-E2EB-4C1B-A1E1-A25A0138BA19 1 0 0 1 2D83276E-40CC-44D0-9DDF-A25A0138BE14 2 1 1 4 E036BFE0-BBB5-450C-858C-A25A0138C21C 3 0 0 3 我不是一个SQL性能大师,所以我有以下问题给你SQL大师: >在这种用例中,common-table-expressions(CTE)是否适合/最适合? (他们确实看起来更容易阅读/跟随SQL).在上面提供的模型中有没有办法保存加入? 和 >这将是索引视图(持久性)的好候选者,还是增加源数据更改的成本?在这种情况下,我将使这个存储过程更新任何给定产品的PhysicalProductMappings表. 解决方法你问了很多问题.我会尝试和解决每个人,而不会过多的细节.> CTE与派生表是语法糖.在性能上没有差别.使用它们的唯一好处是可以重用它们,而不是再次复制/粘贴/输出派生表.但是,在这种情况下,您不会重复使用它,因此取决于您. 阅读这篇文章:http://technet.microsoft.com/en-us/library/ms187864(v=sql.105).aspx 注意大约3/4的页面,它谈到在哪里不使用一个,我认为你的情况适合你不应该使用的情况下的4/5. 关于保存联接…记住FULL OUTER加入是效率最差的罪犯之一.在我看来,这是唯一的原因,是因为你不是在你的CTE中包括制造商.您可以将其包含在您的CTE中,然后在最终查询中将cat / tag的匹配数量合并在一起,以获取您的分数.这样你只有两个左外连接(每个CTE一个),然后将两个计数合并在一起并由同一制造商(案例陈述),productId等组合. 另外,如果没有其他的话,请确保您至少在Web /应用程序服务器上缓存此信息.有一件事是肯定的,如果你去上面的解决方案,那么你需要在你的网站上建立一些东西,所以它不等待数据返回并缓存它. 希望有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |