2010-08-26 72 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