2009-03-05 29 views
5

Tôi đang tìm giải pháp tối ưu để đối sánh từ khóa giữa các bản ghi khác nhau trong cơ sở dữ liệu. Đó là một vấn đề cổ điển, tôi đã tìm thấy những câu hỏi tương tự, nhưng không có gì cụ thể.Giải pháp tối ưu cho kết hợp thẻ/từ khóa là gì?

Tôi đã thực hiện nó với tìm kiếm văn bản đầy đủ, tham gia và truy vấn phụ, bảng tạm thời, ... vì vậy tôi thực sự muốn xem các bạn đang giải quyết vấn đề chung như thế nào.

Vì vậy, giả sử tôi có hai bảng; ProductsKeywords và chúng được liên kết với bảng thứ ba, Products_Keywords trong mối quan hệ nhiều-nhiều cổ điển.

Nếu tôi hiển thị một bản ghi Product trên trang và muốn hiển thị các sản phẩm có liên quan hàng đầu n, lựa chọn nào là tốt nhất?

Chúng tôi nên tính đến các hồ sơ có thể chia sẻ một số từ khóa và thực tế này nên xác định thứ tự của sản phẩm có liên quan hàng đầu.

Tôi cũng đang mở cho các ý tưởng khác, nhưng T-SQL sẽ là giải pháp thích hợp hơn vì lý do hiệu suất.

+0

Cảnh báo về cảnh giác: một thứ không thể 'tối ưu nhất'. Đó là một trong hai tối ưu, cũng được gọi là 'tốt nhất', hoặc nó không phải là. ;-) – nekomatic

+0

Tôi đã chỉnh sửa :) – muerte

Trả lời

0

Vâng có lẽ giống như 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)*/ 

Bây giờ tôi nghiêm túc nghi ngờ đó là một tuyên bố sql tối ưu, nhưng nó phải được công việc làm. Tôi không thể xác minh nó mặc dù kể từ khi tôi chỉ viết nó từ đầu mà không có bảng sao lưu thực tế, hoặc dữ liệu để kiểm tra chống lại.

+0

nếu bạn muốn các từ khóa có trọng số ở trên và bạn chọn trọng số của mình là số từ 0> x> = 1, bạn có thể đặt thứ hạng thành (count (related.productId) * (tổng (pk.weight)/tổng (pk.trọng số) + 1)) như xếp hạng hoặc [C * (w/w + 1) = rank] trong đó C là số đếm và w là tổng trọng số. –

3

bắn đầu tiên của tôi sẽ là một cái gì đó như:

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 

Các tham gia của Product_Keywords để Product_Keywords (PK2 để PK1) có thể là thô, vì vậy tôi không thể nói chuyện với hiệu suất. Đây là nơi tôi sẽ bắt đầu và sau đó xem xét tối ưu hóa.

Một điều cần xem xét, như một phần tiếp theo cho nhận xét của Assaf, là bạn có thể thêm "trọng số" vào Product_Keywords và SUM (PK1.weight) + SUM (PK2.weight) để xếp hạng. Chỉ là một ý nghĩ.

EDIT: Để xây dựng trên trọng số ... bạn có thể quyết định rằng bạn muốn cho phép từ khóa được cân. Phương pháp thực tế được sử dụng để xác định trọng số sẽ là một quyết định kinh doanh mặc dù, vì vậy tôi không thể thực sự cung cấp cho bạn quá nhiều hướng dẫn ở đó.

Ví dụ: câu hỏi này là về "lập trình", "đối sánh từ khóa" và "SQL". Lập trình là khá chung chung, vì vậy nếu hai câu hỏi có chung, nó vẫn có thể không có nghĩa là chúng có liên quan, vì vậy có thể bạn chỉ cân nhắc nó như là 1. SQL cụ thể hơn một chút, để bạn có thể cân nặng như một là trọng tâm chính của câu hỏi VÀ nó khá cụ thể, vì vậy bạn có thể cân nhắc rằng với 10.

Đây chỉ là một ví dụ về khóa học và như tôi đã nói, xác định chính xác trọng số cũng như cách bạn ghi điểm nó phụ thuộc vào doanh nghiệp cụ thể. Bạn có thể quyết định rằng việc kết hợp số lượng từ khóa quan trọng hơn trọng số nên có thể trọng số chỉ được sử dụng như một bộ ngắt kết nối, v.v. HTH.

+0

Bạn có thể xây dựng một chút về khái niệm trọng lượng không? Tôi nên cân nhắc từ khóa như thế nào? – muerte

Các vấn đề liên quan