公司的電商平台要做個站內信。主要功能是給供貨商、經銷商、分銷員這些身份的人傳送訊息。比如供貨商修改了商品的**、上架了商品等操作。需要通知到經銷商。經銷商可以在自己的站內信裡搜尋到訊息。
照例都是先去網上找下成熟的站內信方案。大概找了幾種方案如下
以下是原文章 位址
一、網上站內信技術方案
站內信」不同於電子郵件,電子郵件通過專門的郵件伺服器傳送、儲存。而「站內信」是系統內的訊息,說白了,「站內信」的實現,就是通過資料庫插入記錄來實現的。
「站內信」有兩個基本功能。一:點到點的訊息傳送。使用者給使用者傳送站內信;管理員給使用者傳送站內信。二:點到面的訊息傳送。管理員給使用者(指定滿足某一 條件的使用者群)**訊息。點到點的訊息傳送很容易實現,本文不再詳述。下面將根據不同的情況,來說說「站內信」的**是如何實現的。
第一種情況,站內的使用者是少量級別的。(幾十到上百)
這種情況,由於使用者的數量非常少,因此,沒有必要過多的考慮資料庫的優化,採用簡單的**,對系統的設計也來的簡單,後期也比較容易維護,是典型的用空間換時間的做法。
資料庫的設計如下:表名: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)想問題要清晰和深刻。站內信不是郵箱。 有自己的特點。
站內信設計
站內信設計 1 message表 欄位名 型別 是否null id int 自增長 否 messageid int 否 sendid int 否 reclid int 否 readstatus int 否 sendstatus int 否 id 編號 messageid 訊息id sendid 傳送...
站內信設計
一 網上站內信技術方案 站內信 不同於電子郵件,電子郵件通過專門的郵件伺服器傳送 儲存。而 站內信 是系統內的訊息,說白了,站內信 的實現,就是通過資料庫插入記錄來實現的。站內信 有兩個基本功能。第一,點到點的訊息傳送。使用者給使用者傳送站內信 管理員給使用者傳送站內信。第二,點到面的訊息傳送。管理...
站內信DB設計實現
兩年前,萬倉一黍在發了兩篇關於站內信的設計實現博文,站內信 的實現 站內信 的實現 續 其中闡述了他關於站內信 的設計思想,很具有借鑑意義。他在設計時考慮到使用者量和儲存空間的占用等問題。當然,在他的兩篇博文中強調了站內信的設計要考慮具體情況,沒有理想的設計方案,他的設計只是對於 點到面 的解決方案...