2010-08-26 69 views
0

我需要建立朋友系統的幫助。PHP:朋友系統的想法?

我在想如何讓兩個用戶都能看到他們是朋友在一起。

我應該只是做一個user1字段和user2字段,然後當顯示他/她的朋友時,它應該選擇哪裏user1 ='$ id'或user2 ='$ id'?

或者每次人們都成爲朋友時,我應該做兩行?

智能的方式和示例將不勝感激。謝謝。

我在mysql數據庫中存儲。

我的想法正是我應該如何列出誰是誰的朋友。假設我使用方法1)與user1和user2列,那麼我應該有WHERE user1或user2是$ id(用戶id),但可以正常工作嗎?

我只是嘗試這樣做,它表明,對於user2的用戶ID在user1's friendslist, 但在user2's friendslist它只是顯示自己的用戶ID,而不是user1s ..

+0

您能解釋的背景和你希望擺脫它呢?目前還不清楚,所以幫助並不容易。 – FrustratedWithFormsDesigner 2010-08-26 19:20:40

+0

更新希望它可以幫助 – Karem 2010-08-26 19:38:47

回答

0

在與分片一個大項目你應該總是複製每個用戶的數據。

對於不是那麼大的項目,可以爲user_id保留一個帶有「發起者」和「接受者」字段的表。不要忘記爲友誼添加索引和「狀態」字段

+0

複製是什麼意思? – Karem 2010-08-26 19:30:03

+0

@Karem: 1.重複過程:重複,複製或重現某些東西的過程 – abhi 2010-08-26 19:36:39

+0

@Karem,當您爲不同的用戶/表/數據庫/服務器複製某些數據時。例如如果您將用戶存儲在不同的服務器上,那麼您可能更願意將用戶朋友存儲在每個用戶的服務器上 – bobrik 2010-08-27 22:01:31

0

我假設你將它們存儲在數據庫中。一個簡單的方法就是創建一個新表格,讓它稱爲「友誼」,分爲兩列,user_1,user_2。如果兩個用戶是朋友,他們應該在此表中有一行。這是一個非常簡單的方法來實現這一點,但它應該工作。

+0

什麼查詢可用於顯示用戶的朋友?我的意思是,它應該檢查user1和user2列的用戶ID,以顯示用戶的朋友?它不應該只檢查1列(例如用戶1),因爲那麼如果他讓你成爲朋友,所以你的ID在用戶2 .. – Karem 2010-08-26 19:32:37

+0

我沒有想到這一點,你可以運行兩個查詢來檢查每一列。如果您保持一致地存儲友情的方式,則可以知道哪個用戶發起了好友請求。運行兩個查詢類似於爲每個用戶複製數據並運行一個查詢。這是磁盤空間與查詢時間折衷的問題。 – sjobe 2010-08-26 20:20:07

0
SELECT users.name, fr.name 
FROM users, friends, users AS fr 
WHERE users.user_id = ? 
AND users.user_id = friends.user_id1 
AND friends.user_id2 = fr.user_id 
UNION 
SELECT users.name, fr.name 
FROM users, friends, users AS fr 
WHERE users.user_id = ? 
AND users.user_id = friends.user_id2 
AND friends.user_id1 = fr.user_id 

這將允許您檢查中間表爲您的多對多關係,而不必重複(反)行。

CREATE TABLE `users` (
    `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    PRIMARY KEY (`user_id`), 
); 

CREATE TABLE `friends` (
    `user_id1` bigint(20) unsigned NOT NULL, 
    `user_id2` bigint(20) unsigned NOT NULL, 
    PRIMARY KEY (`user_id1`,`user_id2`) 
); 
0

這裏有一些很好的答案,如果我不得不這樣做我會做的一種方式,這種方式可以決定是否友誼得到了證實,並確保友誼是相互的,因此,例如

讓我們假設狀態有兩個值

0 = Unconfirmed 
10 = Confirmed 

使用簡單的表格與接受水平狀態

CREATE TABLE `users` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    PRIMARY KEY (`user_id`), 
); 

CREATE TABLE `friend` (
    `user_id` bigint(20) unsigned NOT NULL, 
    `friend_id` bigint(20) unsigned NOT NULL, 
    `status` int(11) unsigned NOT NULL, 
    PRIMARY KEY (`user_id`,`friend_id`) 
); 

INSERT INTO `users` (`id`, `name`) VALUES 
    (1, 'Jack'), 
    (2, 'John'); 

傑克想成爲朋友約翰,所以你會創建兩個只有一條路之間的關係:

INSERT INTO `friend` (`user_id`, `friend_id`, `status`) VALUES (1, 2, 0); 

現在,您可以查詢數據庫,找到千斤頂朋友或千斤頂請求和約翰的朋友或約翰請求使用簡單的查詢

爲了找到傑克,你會使用類似

SELECT users.* FROM users JOIN friend ON users.id = friend.user_id WHERE friend.friend_id = 1 AND friend.status = 0 

要找到千斤頂確認的朋友,你會使用類似

未經證實的朋友
SELECT users.* FROM users JOIN friend ON users.id = friend.user_id WHERE friend.friend_id = 1 AND friend.status = 10 

要找到千斤頂任何好友請求,你會使用類似

SELECT users.* FROM users JOIN friend ON users.id = friend.user_id WHERE friend.friend_id = 1 

當有人友誼的確認,你將執行2個查詢,一個用於更新記錄,一個作爲反向確認

UPDATE friend SET status = 10 WHERE user_id = 1 AND friend_id = 2; 
INSERT INTO `friend` (`user_id`, `friend_id`, `status`) VALUES (2, 1, 10); 

在不同的音符,我也將使用複雜關係查詢圖形數據庫,而在MySQL數據庫中保持堅定的副本

圖傳情的朋友的朋友建立關係

MATCH (Person { id: 1 })-[:knows*2..2]->(friend_of_friend) WHERE NOT (Person)-[:knows]->(friend_of_friend) AND NOT friend_of_friend.id = 1 RETURN friend_of_friend.id, friend_of_friend.name LIMIT 10