5

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

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

所以,假设我有两张桌子;Products并且Keywords它们Products_Keywords以经典的多对多关系与第三个表相关联。

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

我们应该考虑到记录可能共享多个关键字,这一事实应该确定最相关产品的排序。

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

4

2 回答 2

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。

于 2009-03-05T15:56:19.340 回答
0

好吧,也许类似于以下内容:

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 语句,但它应该可以完成工作。我无法验证它,因为我只是从头开始编写它,没有实际的后备表或要测试的数据。

于 2009-03-05T15:44:05.437 回答