我创建了聊天应用程序,其聊天看起来如下所示:
chat_seen --table name
--Columns---
from_user | to_id | group_id | unseen_count
它的工作方式如下:当group_id为NULL时,表示这是一对一聊天,如果group_id不为null from_user是写入消息的最终用户,to_id是用户是组成员。我在group_id上有外键它引用了group table,我有3列的唯一键(from_user,to_id,group_id),当group_id为null时它应该有效,因为from_user和to_id在一对一聊天中应该是唯一的,但在群聊中应该是每个group_id都是唯一的,如果Unique键与NULL VALUES一起使用,这将起作用,因为如果它工作,它会将group_id NULL值计为group_id,每个NULL组from_user和to_id将是唯一的。我不能将group_id更改为任何东西,因为它有外键。< / p>
我还想实现,如果group_id不为null,to_id应该有外键,它应该引用组成员,group_id不是NULL,它应该引用用户表中的user_id。
使用示例更新版本
当组中的某个人为每个消息写入消息时,我为每个用户插入或更新(如果存在)chat_seen表,这意味着如果每个消息包含20个人,我将更新或插入20列以便稍后通知他们他们没有看到聊天。我为每个用户更新了unseen_count。
我该怎么办?有什么建议吗?
答案 0 :(得分:1)
为组分配Id字段,为同一自动序列生成器的用户分配Id字段。这可以保证给定的Id可以是用户也可以是组,但不能同时包含两者。
现在消除到表中的Group_Id。相反,只需将groupId存储在组消息的To_Id字段中,并使From_Id和To_Id唯一。
如果您只想查看发送给组的邮件,只需加入groups表即可。个人信息将退出联盟。
同样,如果您只想查看给个人的消息,只需加入users表即可。组的消息将退出联接。
答案 1 :(得分:0)
我已经解决了这个问题,有点破解。当一对一聊天插入到chat_seen表时,我检查from_user是否为null,因为我允许from_user可以为null(我稍后会解释)。然后我创建了from_user和to_id唯一键。现在我有2个唯一键1)from_user和to_id,另一个是2)to_id和group_id(我从这个唯一键中删除了from_user)。当用户使用group_chat mod插入chat_seen表时,我插入null from_user因为我想忽略1)组的Uniuqe键,如果group为null则表示一对一聊天2)唯一键将被忽略。
答案 2 :(得分:0)