2014-03-19 64 views
1

在數據庫網站上提到這個問題,但它似乎很慢。所以我一般都是SQL和數據庫的新手,我使用過的SQL數據庫唯一使用的是一對多關係。我想知道在我的數據庫中爲用戶實現「最愛」機制的最簡單方法 - 類似於Youtube等網站的負載情況。用戶當然是獨一無二的,因此一個用戶可以擁有很多收藏夾,但是一個用戶也可以被很多用戶收藏。這被認爲是多對多的關係嗎?這樣做的典型設計模式是什麼?多對多的關係看起來像一個頭痛的問題(我使用SQLAlchemy,所以我的表與相似的對象交互),但這似乎是一個相當常見的網站功能,所以我想知道什麼是最直接簡單的方法去做。謝謝用戶收藏夾的SQL數據庫設計模式?

回答

0

我從來沒有見過任何明確的數據庫設計模式(除了幾年前它成爲時尚的時候,'設計模式'這個短語的一些瑣碎的濫用)。 M:M關係正常:使用鏈接表(又名關聯表等)等等。你的用戶和喜歡的例子確實聽起來像M:M。

create table LinkTable 
(
    Id int IDENTITY(1, 1), -- PK of this table 
    IdOfTable1 int, -- PK of table 1 
    IdOfTable2 int -- PK of table 2 
) 

...並在(IdOfTable1,IdOfTable2)上創建一個UNIQUE索引。或者取消Id列並使PF開啓(IdOfTable1,IdOfTable2)。

4

是的,這是一種經典的多對多關係。通常情況下,對付它的方法是創建一個鏈接表,所以說,T-SQL你必須......

create table user 
(
    user_id int identity primary key, 
    -- other user columns 
) 

create table item 
(
    item_id int identity primary key, 
    -- other item columns 
) 

create table userfavoriteitem 
(
    user_id int foreign key references user(user_id), 
    item_id int foreign key references item(item_id), 
    -- other information about favoriting you want to capture 
) 

要看看誰收藏的東西,所有你需要做的就是運行查詢userfavoriteitem表格,該表格現在將成爲關於哪些項目受歡迎以及誰喜歡他們的各種有用統計數據的數據庫。

select ufi.item_id, 
    from userfavoriteitem ufi 
where ufi.user_id = [id] 

或者你甚至可以使用下面的查詢,但如果你有大量的用戶,這將得到緩慢得到您的網站上最受歡迎的項目,其結果應保存在一個特殊的表被更新每隔一段時間安排在後臺工作...

select top 10 ufi.item_id, count(ufi.item_id), 
    from userfavoriteitem ufi 
where ufi.item_id = [id] 
GROUP BY ufi.item_id