PHP:朋友系统的想法?

时间:2010-08-26 19:17:27

标签: php

我需要帮助建立朋友系统。

我正在考虑如何让两个用户都能看到他们是朋友。

我应该只创建一个user1字段和user2字段,然后在显示他/她的朋友时,应该选择user1 ='$ id'或user2 ='$ id'的位置?

或者每次人们成为朋友时我应该两行?

聪明的方式和例子将不胜感激。谢谢。

我存储在mysql数据库中。

我的想法正是我应该如何列出谁是谁的朋友。让我说我使用方法1)与user1和user2列,然后我应该有WHERE user1或user2是$ id(用户ID),但这可以正常工作吗?

我刚试过这个,它在user1的friendslist中显示了user2的userid,  但在user2的friendslist中,它只显示自己的用户ID而不是user1s ..

4 个答案:

答案 0 :(得分:0)

在具有分片的大型项目中,您应始终为每个用户复制数据。

对于不那么大的项目,可以为user_id保留一个带有“initiator”和“accepter”字段的表。不要忘记为友谊添加索引和“状态”字段

答案 1 :(得分:0)

我假设您将它们存储在数据库中。一个简单的方法是拥有一个新表,让我们称之为“友谊”,其中包含两列,user_1,user_2。如果两个用户是朋友,他们应该在此表中有一行。这是一种非常简单的实现方法,但它应该可行。

答案 2 :(得分: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`)
);

答案 3 :(得分: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);

现在您可以使用简单查询查询数据库以查找Jacks朋友或Jacks请求以及Johns朋友或Johns请求

要找到杰克未经证实的朋友,你会使用像

这样的东西
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);

另一方面,我还会使用Graph数据库进行复杂的关系查询,同时在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