2012-07-14 46 views
0

我有一個mysql數據庫。我有一張用戶表。我想回答「一個用戶是另一個用戶的朋友嗎?」的問題。這些是單向的朋友關係。我想我有兩個選擇,並且想要更高性能的解決方案:緊湊的存儲單向朋友關係的方式?

1)保留一張朋友關係表。兩列:

username | friend_username 
-------------------------- 
mary  john 
mary  steve 
mary  kate 
... 

回答友誼的問題只是選擇其中的兩列匹配計數的用戶名1 & 2.

2)再次與兩列的表:

username | friends_serialized 
----------------------------- 
mary  john,steve,kate, 

所以「friends_serialized」列包含一個(逗號)分隔的字符串。如果我想知道瑪麗是否與朋友在一起,我可以這樣做:

select count from xxx where username="mary" AND friends_serialized LIKE "%,steve,%" 

(我不確定語法)。這對第一次實施來說真的會贏得什麼?它至少更加緊湊,當我需要向用戶發送一個朋友列表時,我可以將其讀入單個列中,而不是選擇所有匹配的列(如#1中所示)。

我的問題:我正在運行一個遊戲服務,用戶可以發送邀請到另一個玩遊戲。我想阻止陌生人發送非朋友邀請。因此,我希望能夠快速(並且緊湊地)確定向另一個用戶發送邀請的用戶是否真的是共同的朋友。

感謝

+0

第二個可能是一個有點艱難的編輯朋友,如消除了與相同名字的朋友, – 2012-07-14 04:32:14

+0

這migh是有用的將朋友的ID存儲在數據庫中並檢入這些ID。如果freind ID發現真的 – 2012-07-14 04:34:59

回答

0

你提到的第一個是在第二個最好的answer.because讓你要分析它來找到朋友的字符串,但第一個是更直接的了!

0

使用ID而不是字符串。

創建結表:

ID PersonID FriendID 
0 1  2 
1 4  2 
2 2  3 
..... 

2個人既是人1和4的朋友 人3人2

+1

沒有理由,一個ID(我假設你的意思是* key *,特別是*主鍵*)不能是一個字符串。如果「用戶名」是穩定的,不可空,且唯一,則不需要創建代理鍵。 – 2012-07-14 04:33:02

+0

最佳做法使用二進制ID /密鑰。他們更快,當人們結婚並且他們的名字改變時,你不會有更新的噩夢。但是,字符串將起作用。 – 2012-07-14 04:33:47

+0

是的,絕對沒有理由一個字符串不能成爲一個關鍵。 – 2012-07-14 04:34:12

3

給朋友您應該絕對去的第一種方法。你的第二個做法違反了甚至第一範式的關係數據庫(不是存儲在單場這種情況下友誼)多個值(

0

轉到與第一解決方案創建一個表,如:。

CREATE TABLE friendships (
    user varchar(64) NOT NULL, 
    friend varchar(64) NOT NULL, 
    PRIMARY KEY (user, friend) 
    FOREIGN KEY (user) REFERENCES users (user_name) 
     ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (friend) REFERENCES users (user_name) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB; 

這將使確保行不能插入friendships表,如果在你的users表不存在兩個用戶名(userfriend)。另外,如果你刪除一個用戶,他們所有的友誼是刪除。同樣的,更新了一個用戶名(如果你允許的話),另外,從那時起,友誼是單向的,一個給定的用戶只能與另一個用戶的朋友一起ime,這將足以使兩列你的PRIMARY KEY

那麼,這是一個非常簡單的查詢,以找到一個給定的用戶朋友們:

SELECT friend FROM friendships WHERE user='username'

+0

'關於刪除級聯' - 我不喜歡那種聲音。我認爲你不應該鼓勵改變主鍵的概念。 – dbenham 2012-07-14 05:32:05

+0

如果你不喜歡刪除級聯的聲音,你不明白他們。它們對於防止孤兒記錄非常有用。即使在用工具編輯數據庫時也是如此。 – 2012-07-14 12:03:15