點到點的消息傳送:數據庫
點到面的消息傳送網絡
對於用戶很是少的狀況,沒有必要深刻的考慮數據庫的優化,採用簡單的表設計:架構
如表message優化
列名 | 字段 |
---|---|
sendId | 發送者id |
recId | 接受者id |
message | 站內信內容 |
status | 查看 |
create_date | 發送日期 |
點對點的信息發送,只須要在表中插入一條數據,記錄雙方的ID以及信息便可。查看本身是否有信息也很簡單:表中recId字段值等於本身的ID且status爲0(未讀)的信息就是本身須要查看的信息設計
店對面的操做和點對點的信息發送一致。索引
若是按照少許用戶的設計思路來處理中量用戶的狀況,會出現什麼問題?假設用戶數量10000,管理員要向全部用戶發送系統通知。那麼,上述的表就須要一次操做插入10000條數據,這並沒什麼,但裏面的message就必須重複10000次,這意味着,100個漢字的消息,一次消息發送,就會佔用2M的空間,多發幾回,這張表就冗餘到不能接受了。table
那爲何不用recId=0來表明向全部人發送,這樣不就能夠解決message重複10000次的問題了。固然能夠這樣作,但必須引入另外一張表,否則,就無法記錄哪個用戶讀過系統消息,哪個用戶沒有讀過。效率
所以,表設計以下:基礎
表messagedate
列名 | 字段 |
---|---|
sendId | 發送者id |
recId | 接受者id |
messageId | 站內信內容id |
status | 查看 |
create_date | 發送日期 |
表message_text
列名 | 字段 |
---|---|
messageId | 編號 |
message_content | 內容 |
create_date | 發送日期 |
點對點的信息發送,首先在message_text表中插入一條記錄,獲得對應的ID,而後在message表中插入一條記錄,記錄相關發送人,接收人以及信息的ID
點對面的操做和點對點相似,一一對記錄好便可
這樣設計,每一次的信息發送操做,都只會記錄一條信息數據而不會重複。這樣能有效解決信息重複記錄致使佔用大量空間的問題。固然也會這樣也不是完美的
一樣,若是在百萬級的狀況下,使用中量用戶的方案會出現什麼問題?
從功能出發,管理員要向全部用戶發送站內信,那麼,message表中一會兒就得涌入百萬條數據,這個數據量對於數據庫來講,簡直可怕!並且,着還意味着,這張表有着百萬次潛在的是否已讀的修改請求。而且是每一個用戶在百萬條數據中尋找本身的那一條數據進行修改。這個效率是徹底不能接受的。
所以,咱們能夠設計一條規則來優化這個問題:
羣發的消息,接收人的ID爲0。這樣雖然能夠避免巨量操做,可是會引入另外一個問題:我怎麼知道那個用戶讀了?那個用戶沒讀?
那麼,我們就要將總體結構拆分爲三張表:
表設計以下:
表message
列名 | 字段 |
---|---|
sendId | 發送者id |
recId | 接受者id |
messageId | 站內信內容id |
create_date | 發送日期 |
表message_text
列名 | 字段 |
---|---|
messageId | 編號 |
message_content | 內容 |
create_date | 發送日期 |
表message_customer
列名 | 字段 |
---|---|
customerId | 用戶id |
messageId | 信息id |
status | 閱讀狀態 |
這樣每次點對面的消息發送,首先在message_text表中插入一條數據,獲得ID,而後在message記錄相應的數據。用戶在閱讀後,會在message_customer表中插入一條數據,代表本身已經閱讀了。這樣就即解決沒發知道那個用戶是否已經閱讀的問題,也解決了須要在百萬表中查找修改狀態的問題。固然也會引入其餘問題,好比說:
固然,還能夠在其餘當面對站內信作一些優化操做,好比說:
上述的站內信只是在單應用系統下的一個很初步的設計,能夠這樣說,哪怕是按照大量用戶來設計單應用系統的站內信,也會出現這這那那的瓶頸,不只是數據庫的,還有網絡的,IO操做的等;所以,對於基礎單應用系統的站內信設計,只推薦使用中量用戶的設計,大量用戶的設計是一個很是複雜的架構,並非再分一個表就能解決的。
總結一下