2009-03-05 61 views
5

我正在寻找数据库中不同记录之间关键字匹配的最佳解决方案。这是一个经典问题,我找到了类似的问题,但没有具体的问题。什么是标签/关键字匹配的最佳解决方案?

我已经完成了全文搜索,连接和子查询,临时表......所以我真的很想看看你们是如何解决这样一个共同的问题。

所以,假设我有两张桌子; ProductsKeywords,它们与经典的多对多关系中的第三个表Products_Keywords链接。

如果我在页面上显示一个Product的记录,并且想显示顶部n相关产品,那么最好的选择是什么?

我们应该考虑到记录可能会共享几个关键字,并且这个事实应该决定顶级相关产品的排序。

我打开其他想法,但由于性能原因,T-SQL将是更可取的解决方案。

+0

Pedantry警报:某些东西不能'最优化'。它不是最优的,也被称为“最佳”,或者不是。 ;-) – nekomatic 2009-03-10 14:16:05

+0

我站在更正:) – muerte 2009-03-10 20:38:31

回答

0

嗯,也许是这样的follwing:

select p.productId, p.name, r.rank 
from products p inner join (
/* this inner select should bring in only products that have at least one keyword 
=> shared with the requested product, and will count the actual number shared (for ranking)*/ 
    select related.productId, count(related.productId) as rank 
    from 
     products_keywords related inner join 
     products_keywords pk ON (pk.productId = @productId AND related.keywordId = pk.keywordId) 
    where related.productId <> @productId 
    group by related.productId 
) r on p.productId = r.productId 
order by r.rank DESC /* added DESC (not in orignal solution, but needed to put higher ranked on top)*/ 

现在我严重怀疑这是一个最佳的SQL语句,但它应该完成这项工作。我无法验证它,因为我只是从头开始编写它,没有实际的支持表或要测试的数据。

+0

如果你想为以上加权关键字,你选择你的权重为0> x> = 1之间的数字,你可以设置排名为(count(related.productId)*(sum (pk.weight)/ SUM(峰作为等级 或[C *(w/w + 1)=等级],其中C是计数并且w是总计权重。 – 2009-03-05 17:44:07

3

我的第一个镜头会是这样的:

SELECT 
    P.product_id, 
    COUNT(*) 
FROM 
    Product_Keywords PK1 
INNER JOIN Product_Keywords PK2 ON 
    PK2.keyword_id = PK1.keyword_id 
INNER JOIN Products P ON 
    P.product_id = PK.product_id 
WHERE 
    PK1.product_id = @product_id 
GROUP BY 
    P.product_id 
ORDER BY 
    COUNT(*) DESC 

Product_Keywords的加盟Product_Keywords(PK2到PK1)可能是粗糙的,所以我不能表现说话。这是我开始的地方,然后看看优化。

作为Assaf评论的后续行动,需要考虑的一件事是您可以为Product_Keywords和SUM(PK1.weight)+ SUM(PK2.weight)添加一个“权重”以进行排名。只是一个想法。

编辑:详细说明加权...你可能会决定你想让关键字加权。虽然用于确定权重的实际方法将是一个商业决策,所以我不能真正给你太多的指导。

作为一个例子,这个问题是关于“编程”,“关键字匹配”和“SQL”。编程是非常通用的,所以如果两个问题有共同点,那么它们可能并不意味着它们是相关的,所以也许你只是把它看作是1. SQL更具体一些,所以你可以将它们权重为5.关键字匹配既是问题的主要焦点,也是非常具体的,所以你可以用一个10来加权。当然,这只是一个例子,正如我所说的那样,权重的确切确定以及得分方式它取决于具体的业务。你可能会认为匹配关键字的数量比权重更重要,所以也许权重只能用作决胜手等。HTH。

相关问题