Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从数据库中删除特定用户的聊天历史记录_Sql_Database - Fatal编程技术网

Sql 从数据库中删除特定用户的聊天历史记录

Sql 从数据库中删除特定用户的聊天历史记录,sql,database,Sql,Database,我目前正在使用SignleR和sqlserver开发一个web聊天应用程序,这是我目前的数据库模式 我添加了一个选项,用户可以清除特定对话的聊天历史记录,但是,如果用户1点击clear history,我在为特定用户清除历史记录这一概念上遇到了问题。对于用户1,此对话的所有消息都不会显示,但是对于用户2,仍会看到此对话的所有消息 如何升级数据库架构以实现此功能?我认为您需要的是一个组合键表,它将多个用户与消息连接起来。我还认为您缺少将多条消息连接到特定对话的对话表 拟议计划: USERS

我目前正在使用
SignleR
sqlserver
开发一个web聊天应用程序,这是我目前的数据库模式

我添加了一个选项,用户可以
清除特定对话的聊天历史记录
,但是,如果用户1点击clear history
,我在为特定用户清除历史记录这一概念上遇到了问题。对于用户1,此对话的所有消息都不会显示,但是对于用户2,仍会看到此对话的所有消息


如何升级数据库架构以实现此功能?

我认为您需要的是一个组合键表,它将多个用户与消息连接起来。我还认为您缺少将多条消息连接到特定对话的对话表

拟议计划:

USERS          USER_THREADS      THREADS            MESSAGES
User_ID   ->      User_ID          
                 Thread_ID  ->  Thread_ID
                                Message_ID  ->      Message_ID
现在,要清除单个用户的对话,您需要从user_THREADS表中删除该用户ID和Thread_ID的记录

上述方案还允许在两个以上的人之间进行对话,因为通过下面的SELECT语句,线程可以有多个用户:

回复您的评论:

delete from USER_THREADS where User_ID = 0000 AND Thread_ID = 0000
对消息表的修改:

delete from USER_THREADS where User_ID = 0000 AND Thread_ID = 0000
您不需要
MESSAGE\u SENDER\u ID
MESSAGE\u receiver\u ID
,因为这些信息将由
USER\u THREADS
表标识编辑: 您应该在
消息
表中保留
消息\u发送者\u ID
,以识别发送消息的用户

假设当用户登录到应用程序时,将从user\u 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插入语句:

delete from USER_THREADS where User_ID = 0000 AND Thread_ID = 0000
当用户写入消息时,应用程序应使用自动ID将消息正文插入到消息表中,然后下一个insert语句将使用该消息\u ID在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

这将删除该用户的整个线程

1-消息表2是否有任何修改-如果我想插入消息,让我们假设user1向user2发送了消息,插入语句将是什么样的insert语句如何选择用户1和用户2之间的对话我看到了更新,但在您的insert语句中您没有使用
User\u-thread
表,如果user1正在与User2开始新的对话,我是否应该在该表中插入一行?@Sora是的,当对话不存在时,应在
User\u-threads
表中创建一条新记录。其他问题,如果我省略了messages表中的两列,那么在您的模式中,发送者和接收者之间如何保持一致?是否
用户.user\u id
映射到
消息。消息\u发送者\u id
消息\u接收者\u id
?是@KevinHogg他们确实:)