我的數據庫中有兩個實體與多對多關係相關。我想知道什麼是最好的方式來列出哪些實體最相似的基礎上呢?基於多對多的關係來匹配相似的實體
我試着用交叉計數(*),但查詢需要太長的時間才能在我的數據庫中的每個條目上運行(大約有20k條記錄)。運行我寫的查詢時,CPU使用率跳至100%,數據庫出現鎖定問題。
下面是一些代碼顯示我已經試過:
我的表看東西沿着這些路線:
/* 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),
);
(這工作,但它是非常慢) 這是查詢我寫了試圖列出它們: 通常我還會過濾頂部1 &添加where子句以獲取特定的一組相關數據。
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
說明: 電影有標籤,用戶可以得到試圖找到類似於他們基於具有類似的標籤其他電影選擇了一個電影。
謝謝。我最終用連接寫了一個類似的解決方案。 – newb
性能如何提高? 順便說一句。我認爲,你可以通過索引獲得一些速度標籤ID – barat
1小時 - > 40秒 – newb