Tôi có hai thực thể trong cơ sở dữ liệu của mình được kết nối với nhiều mối quan hệ. Tôi đã tự hỏi điều gì sẽ là cách tốt nhất để liệt kê những thực thể nào có nhiều điểm tương đồng nhất dựa trên nó?Kết hợp các thực thể tương tự dựa trên nhiều mối quan hệ
Tôi đã thử đếm (*) với giao nhau, nhưng truy vấn mất quá nhiều thời gian để chạy trên mọi mục nhập trong cơ sở dữ liệu của tôi (có khoảng 20 nghìn bản ghi). Khi chạy truy vấn tôi đã viết, mức sử dụng CPU nhảy tới 100% và cơ sở dữ liệu có vấn đề về khóa.
Dưới đây là một số mã hiển thị những gì tôi đã cố gắng:
bảng của tôi trông giống cùng những dòng này:
/* 20k records */
create table Movie(
Id INT PRIMARY KEY,
Title varchar(255)
);
/* 200-300 records */
create table Tags(
Id INT PRIMARY KEY,
Desc varchar(255)
);
/* 200,000-300,000 records */
create table TagMovies(
Movie_Id INT,
Tag_Id INT,
PRIMARY KEY (Movie_Id, Tag_Id),
FOREIGN KEY (Movie_Id) REFERENCES Movie(Id),
FOREIGN KEY (Tag_Id) REFERENCES Tags(Id),
);
(này hoạt động, nhưng nó là terribly chậm) Đây là câu hỏi mà Tôi đã viết để thử và liệt kê chúng: Thông thường tôi cũng lọc với đầu trang 1 & thêm mệnh đề where để có được một bộ dữ liệu liên quan cụ thể.
SELECT
bk.Id,
rh.Id
FROM
Movies bk
CROSS APPLY (
SELECT TOP 15
b.Id,
/* Tags Score */
(
SELECT COUNT(*) FROM (
SELECT x.Tag_Id FROM TagMovies x WHERE x.Movie_Id = bk.Id
INTERSECT
SELECT x.Tag_Id FROM TagMovies x WHERE x.Movie_Id = b.Id
) Q1
)
as Amount
FROM
Movies b
WHERE
b.Id <> bk.Id
ORDER BY Amount DESC
) rh
Giải thích: Phim có thẻ và người sử dụng có thể được cố gắng tìm phim tương tự như một trong đó họ lựa chọn dựa trên các bộ phim khác mà có thẻ tương tự.
Cảm ơn. Tôi đã viết một giải pháp tương tự với các kết nối. – newb
Và hiệu suất đạt được như thế nào? BTW. Tôi nghĩ rằng, bạn có thể kiếm được một số tốc độ theo chỉ mục cho ID thẻ – barat
1 giờ -> 40 giây – newb