我目前正在使用SignleR
和SQL server
开发网络聊天应用程序这是我目前的数据库架构
我添加了一个用户可以Clear Chat history
进行特定会话的选项,但是如果用户1点击清除历史记录,我在为特定用户清除历史记录时遇到问题{1}}
如何升级数据库架构以便我可以使用此功能?
答案 0 :(得分:0)
我认为您需要的是一个将多个用户与消息连接起来的复合密钥表。我还认为你缺少CONVERSATION表,它会将多条消息加入到特定的会话中。
拟议方案:
USERS USER_THREADS THREADS MESSAGES
User_ID -> User_ID
Thread_ID -> Thread_ID
Message_ID -> Message_ID
现在要清除单个用户的对话,您需要从USER_THREADS表中删除该User_ID和Thread_ID的记录。
上述方案还允许在两个以上的人之间进行对话,因为THREAD可以通过以下SELECT语句拥有许多用户:
回复您的评论:
修改MESSAGE表:
您不需要MESSAGE_SENDER_ID
和MESSAGE_RECIEVER_ID
,因为这些信息将由USER_THREADS
表标识。 修改强>
您应该将MESSAGE_SENDER_ID
保留在MESSAGE
表中,以便识别发送邮件的用户。
假设当用户登录您的应用程序时,将从USER_THREADS表中获取所有对话。
select *
from USER_THREADS as ut
inner join THREADS as t on ut.Thread_ID = t.Thread_ID
inner join MESSAGES m on m.Message_ID = t.Message_ID
where USER_THREADS.User_ID = 001
SQL INSERT语句:
当用户写入消息时,应用程序应将消息正文插入带有自动ID的MESSAGES表中,然后Message_ID将被下一个insert语句用于在THREADS表中创建新记录。您没有提到您的DBMS,但在MSSQL中,SQL语句看起来像:
DECLARE @message_id int
insert into MESSAGES values (‘message body’)
set @message_id = SCOPE_IDENTITY() -–an id of the newly inserted message
insert into THREADS values (@message_id, @thread_id)
用于清除单个用户的历史记录的SQL语法:
delete from USER_THREADS where User_ID = 0000 AND Thread_ID = 0000
这将删除该用户的整个帖子