站內信設計


  公司的電商平台要做個站內信。主要功能是給供貨商、經銷商、分銷員這些身份的人發送消息。比如供貨商修改了商品的價格、上架了商品等操作。需要通知到經銷商。經銷商可以在自己的站內信里搜尋到消息。
  照例都是先去網上找下成熟的站內信方案。大概找了幾種方案如下
 
一、網上站內信技術方案

        站內信”不同於電子郵件,電子郵件通過專門的郵件服務器發送、保存。而“站內信”是系統內的消息,說白了,“站內信”的實現,就是通過數據庫插入記錄來實現的。

   “站內信”有兩個基本功能。一:點到點的消息傳送。用戶給用戶發送站內信;管理員給用戶發送站內信。二:點到面的消息傳送。管理員給用戶(指定滿足某一 條件的用戶群)群發消息。點到點的消息傳送很容易實現,本文不再詳述。下面將根據不同的情況,來說說“站內信”的群發是如何實現的。

 

第一種情況,站內的用戶是少量級別的。(幾十到上百)

  這種情況,由於用戶的數量非常少,因此,沒有必要過多的考慮數據庫的優化,采用簡單的表格,對系統的設計也來的簡單,后期也比較容易維護,是典型的用空間換時間的做法。

  數據庫的設計如下:表名:Message

  ID:編號;SendID:發送者編號;RecID:接受者編號(如為0,則接受者為所有人);Message:站內信內容;Statue:站內信的查看狀態;PDate:站內信發送時間;

  如果,某一個管理員要給所有人發站內信,則先遍歷用戶表,再按照用戶表中的所有用戶依次將站內信插入到Message表中。這樣,如果有56個用戶,則群發一條站內信要執行56個插入操作。這個理解上比較簡單,比較耗損空間。

  某一個用戶登陸后,查看站內信的語句則為:

  Select * FROM Message Where RecID=‘ID' OR RecID=0

第二種情況,站內的用戶中量級別的(上千到上萬)。

   如果還是按照第一種情況的思路。那發一條站內信的后果基本上就是后台崩潰了。因為,發一條站內信,得重復上千個插入記錄,這還不是最主要的,關鍵是上千 乃至上萬條記錄,Message字段的內容是一樣的,而Message有大量的占用存儲空間。比方說,Message字段有100個漢字,占用200個字 節,那么5萬條,就占用200×50000=10000000個字節=10M。簡單的一份站內信,就占用10M,這還讓不讓人活了。

  因此,將原先的表格拆分為兩個表,將Message的主體放在一個表內,節省空間的占用

  數據庫的設計如下:

  表名:Message

  ID:編號;SendID:發送者編號;RecID:接受者編號(如為0,則接受者為所有人);MessageID:站內信編號;Statue:站內信的查看狀態;

  表名:MessageText 

  ID:編號;Message:站內信的內容;PDate:站內信發送時間;

  在管理員發一封站內信的時候,執行兩步操作。先在MessageText表中,插入站內信的內容。然后在Message表中給所有的用戶插入一條記錄,標識有一封站內信。

  這樣的設計,將重復的站內信的主體信息(站內信的內容,發送時間)放在一個表內,大量的節省存儲空間。不過,在查詢的時候,要比第一種情況來的復雜。

第三種情況,站內的用戶是大量級的(上百萬),並且活躍的用戶只占其中的一部分。

  大家都有這樣的經歷,某日看一個網站比較好,一時心情澎湃,就注冊了一個用戶。過了一段時間,由於種種原因,就忘記了注冊時的用戶名和密碼,也就不再登陸了。那么這個用戶就稱為不活躍的。從實際來看,不活躍的用戶占着不小的比例。

  我們以注冊用戶2百萬,其中活躍用戶只占其中的10%。

  就算是按照第二種的情況,發一封“站內信”,那得執行2百萬個插入操作。但是其中的有效操作只有10%,因為另外的90%的用戶可能永遠都不會再登陸了。

  在這種情況下,我們還得把思路換換。

  數據庫的設計和第二種情況一樣:

  表名:Message

  ID:編號;SendID:發送者編號;RecID:接受者編號(如為0,則接受者為所有人);MessageID:站內信編號;Statue:站內信的查看狀態;

  表名:MessageText 

  ID:編號;Message:站內信的內容;PDate:站內信發送時間;

  管理員發站內信的時候,只在MessageText插入站內信的主體內容。Message里不插入記錄。

  那么,用戶在登錄以后,首先查詢MessageText中的那些沒有在Message中有記錄的記錄,表示是未讀的站內信。在查閱站內信的內容時,再將相關的記錄插入到Message中。

  這個方法和第二種的比較起來。如果,活躍用戶是100%。兩者效率是一樣的。而活躍用戶的比例越低,越能體現第三種的優越來。只插入有效的記錄,那些不活躍的,就不再占用空間了。

  以上,是我對群發“站內信”的實現的想法。

 

二、商品基本模型 已經需求

        以上是搜索到的站內信大概的設計方案。本來個人打算采用第二種方案。后來被PK掉了。先大概說下我們的商品模型和站內信的需求

    

 

        供貨商有一件商品叫做電水壺。   三個經銷商分別上架供貨商的商品。並重新命名商品的標題。分別叫做電水壺A、電水壺B、電水壺C. 並都在售賣 這件商品。

        這個時候供貨商下架了商品。  由於經銷商是從供貨商那邊發貨。經銷商本身沒有存貨。貨物都在供貨。

那里。所有供貨商下架了商品。需要系統強制下級經銷商的這些商品。  這時候就需要站內信發送消息給這些經銷商。告訴它商品下架了。

        但是這里有個問題。  對供貨商來說。 供貨商站內信的收件箱看到的信息應該是 “電水壺下架”。但是經銷商A、B、C三個人看到的消息內容分別是  “電水壺A下架” “電水壺B下架” “電水壺C下架”。 即消息內容不是完全一樣的。經銷商看到的消息內容是 經銷商商品標題。

 

由於這個需求最終沒有采用搜到的方案 原因如下。

1、不但要做收件箱還要做發件箱。  雖然是同一個操作動作引起的  消息。但是發件箱和收件箱的消息內容不一樣。而且收件箱每個人收到的消息也不同。  如果用方案二和方案三、。只保留一份消息內容的話。不符合需求

2、我們的站內信 只是正對賣家的 不是針對買家的。所有人群達到千萬級別。所有可以用簡單點的方式。方便處理和維護、

3、站內信不是郵箱。不需要一直保留所有數據。 只需要保留一段時間的數據

 

三、設計方案

流程

 

數據庫設計

 

說下這樣設計的原因以及要點。

1、這個是站內信不是郵箱不用  一直保留數據。  所有防止數據的日益增大 會有個定時crontab腳本去刪除超過100天的消息記錄。  這里的100天看產品的需求

2、這里雖然消息是系統發送的。但是觸發人士供貨商。 所有供貨商的發件箱 內容跟  經銷商的收件箱內容不一致。  所有 發件箱和收件箱 都要保留消息內容。

3,發件箱相當於簡單的落地一份數據。因為調用方需要調用 站內信服務落地消息。所有落地消息的時候。沒有邏輯。就是一份數據。  這樣能迅速完成調用方本身的操作。而不會阻塞在。不數據寫入發件箱的過程中。

4、發件箱一有新消息立馬。拋出消息。通知腳本。來處理。這里用腳本來處理  而不是調用接口的方式。原因是。  首先每個接收方  需要接受的消息內容都需要重新聚合其他信息。  消息模板會有改動。 使用腳本修改起來方便; 其次發送的人群 比較多時候。這個發送會比較耗時。  我們一般會在在系統里循環調用自己。 而是由外部觸發。 我們的系統是以API調用的方式。  每個API都有超時時間。 如果放到一個函數里循環發送消息到收件箱。  超市系統會自動結束函數。

5. 消息落地后 。收件箱查消息 非常的方便。

 

 

總結:

    1)設計方案的時候。 一定要根據自己的應用場景來。

    2)想問題要清晰和深刻。站內信不是郵箱。 有自己的特點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM