這裏有一些很好的答案,如果我不得不這樣做我會做的一種方式,這種方式可以決定是否友誼得到了證實,並確保友誼是相互的,因此,例如
讓我們假設狀態有兩個值
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
您能解釋的背景和你希望擺脫它呢?目前還不清楚,所以幫助並不容易。 – FrustratedWithFormsDesigner 2010-08-26 19:20:40
更新希望它可以幫助 – Karem 2010-08-26 19:38:47