1

我有一张像friends(friendship_id, fid1, fid2, ENUM('pending', 'accepted', 'ignored'). 当用户忽略某人的好友请求时,我想确保他们不会收到“你被忽略了!”的消息,但我也希望记录该数据。关于如何解决这个问题的任何建议?

4

4 回答 4

4

显然,您应该做的第一件事是不要实现任何会显示You've been ignored!消息的代码。这解决了你的大部分问题。

但是你必须小心一点。还有一个更微妙的问题 - 从发送者的角度来看,您的系统应该在各个方面表现得好像用户没有点击忽略一样。这意味着,如果发件人发出第二个请求并且通常您的系统说“您已经向该用户发送了一个请求”,那么即使在收件人忽略了第一个请求之后,它也应该继续显示此消息。您需要注意不要通过更改消息以响应应该是私有的事件来泄露信息。


回复评论:

您是否认为最好一开始就不要发送“您已经向该用户发送了请求”消息?

我认为这有点超出了这个问题的范围,并且本身就是一个很长的讨论,所以我只会在这里触及它。答案取决于您的应用程序是如何实现的。简短的回答是:你的应用程序应该帮助你的用户并且是直观的,所以如果消息对他们有帮助,那么就添加它。

另一种方法是,如果没有回复,请求会在一周后自动过期。当前请求过期后,您可以允许用户提出新请求。您可能需要考虑忽略一个请求是否意味着只忽略该一个请求或来自该用户的所有请求。

在我当前的模式下,我还没有真正考虑过如何区分谁在忽略谁。

友谊请求是定向关系。你有一个发送者和一个接收者。另一方面,友谊通常(但不总是)被认为是无向的关系。友谊请求通常会有一条与之相关的消息“嘿,还记得我吗?我们昨晚在酒吧见过!”。另一方面,已建立的友谊通常没有与之相关的信息。因此,将这些不同类型的关系存储在数据库的不同表中可能是有意义的。

于 2010-07-16T20:29:10.783 回答
1

你如何区分谁忽略了谁?如果一个朋友忽略了另一个,那么我想这ENUM将被更改为“忽略”,而被忽略的朋友也将成为忽略的朋友。您可以分辨出谁忽略了您,因为您似乎也忽略了他们。

最好放置一个中间表,例如ignore(ignorer, ignoree),其中的列只是朋友 ID。这样,无论何时向一位朋友发送消息、更新……等等,应用程序首先检查目标朋友是否忽略了源朋友。

于 2010-07-16T20:31:56.663 回答
1

我最近在我正在编写的应用程序中实现了这一点。我实际上在数据库中有两行。我的列是 sourceUserId 和 destUserId。当某人(A 人)向另一个人(B 人)发送请求时,它会自动插入一行,其中 A 的 UserId 作为 sourceUserId,B 的 UserId 作为 destUserId。如果他们再次发送它,它会注意到该行已经存在。要让 B 批准 A,请将 B 的 UserId 作为 sourceUserId,将 A 的 UserId 作为 destUserId。

我的应用程序也有一个通知表,所以每次有人添加其他人(即成功插入 A 的 UserId=sourceUserId 和 B 的 UserId=destUserId 的行)时,都会向目的地发送通知。

要检查两个人是否是朋友,您只需检查倒数行是否存在。

于 2010-07-16T20:35:12.097 回答
0

示例: 用户 A 向用户 B 发送好友请求,用户 B 忽略此请求:用户 A 不知道他/她的请求已被忽略。对于用户 A,此请求状态应视为“待处理”。

对于相同的 2 个用户: 即使用户 B 忽略了用户 A 的请求,也不一定意味着用户 B 不能尝试与用户 A 成为朋友。这样的操作应该清除之前用户 A 的请求的“忽略”(好像它从来没有发生)。

所以你的表模式没问题。你只需要考虑所有可能场景的语言和逻辑。

于 2010-07-16T21:46:51.453 回答