2014-08-28 257 views
1

我目前正在開發使用SignleRSQL server一個網絡聊天應用程序的特定用戶,這是我的數據庫架構到目前爲止刪除聊天記錄從數據庫

enter image description here

我增加了一個選項,其中用戶可以Clear Chat history特定的談話,但我有與清算曆史的願望的情況下特定用戶的概念麻煩,如果用戶1擊清除歷史記錄all the messages of this conversation will not be displayed for user 1 but will still be seen for user-2

如何升級我的數據庫架構,所以我可以做這個泛函可愛嗎?

+0

'users.user_id'是否映射到'messages.message_sender_id'和'message_receiver_id'? – 2014-08-28 09:03:03

+0

是@KevinHogg他們做的:) – Sora 2014-08-28 09:11:58

回答

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個人用戶進行對話。

上述方案還允許攜帶兩個以上的人之間的對話作爲線程可以通過下面的SELECT語句有許多用戶:

迴應您的評論:

修改的MESSAGE表:

您不需要MESSAGE_SENDER_IDMESSAGE_RECIEVER_ID,因爲這些信息將通過USER_THREADS表進行標識。 編輯: 您應該保留在MESSAGEMESSAGE_SENDER_ID爲了識別發送消息的用戶。

假設用戶登錄到您的應用程序將獲得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,這與Message_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 

這將刪除整個該用戶的線程

+0

1 - 是否有消息表的任何修改 2 - 如果我想插入一條消息讓說user1發送消息給user2什麼將是插入語句 – Sora 2014-08-28 08:29:56

+0

我怎樣才能選擇一個會話在用戶1和用戶2之間 – Sora 2014-08-28 08:55:09

+0

@Sora請參閱我的更新回答 – Dimt 2014-08-28 08:57:27