分享網(wǎng)站群發(fā)站內(nèi)信數(shù)據(jù)庫表設(shè)計(jì)
“站內(nèi)信”有兩個(gè)基本功能。一:點(diǎn)到點(diǎn)的消息傳送。用戶給用戶發(fā)送站內(nèi)信;管理員給用戶發(fā)送站內(nèi)信。二:點(diǎn)到面的消息傳送。管理員給用戶(指定滿足某一條件的用戶群)群發(fā)消息。點(diǎn)到點(diǎn)的消息傳送很容易實(shí)現(xiàn),本文不再詳述。下面將根據(jù)不同的情況,來說說“站內(nèi)信”的群發(fā)是如何實(shí)現(xiàn)的。
第一種情況,站內(nèi)的用戶是少量級(jí)別的。(幾十到上百)
這種情況,由于用戶的數(shù)量非常少,因此,沒有必要過多的考慮數(shù)據(jù)庫的優(yōu)化,采用簡單的表格,對(duì)系統(tǒng)的設(shè)計(jì)也來的簡單,后期也比較容易維護(hù),是典型的用空間換時(shí)間的做法。
數(shù)據(jù)庫的設(shè)計(jì)如下:表名:Message
ID:編號(hào);SendID:發(fā)送者編號(hào);RecID:接受者編號(hào)(如為0,則接受者為所有人);Message:站內(nèi)信內(nèi)容;Statue:站內(nèi)信的查看狀態(tài);PDate:站內(nèi)信發(fā)送時(shí)間;
如果,某一個(gè)管理員要給所有人發(fā)站內(nèi)信,則先遍歷用戶表,再按照用戶表中的所有用戶依次將站內(nèi)信插入到Message表中。這樣,如果有56個(gè)用戶,則群發(fā)一條站內(nèi)信要執(zhí)行56個(gè)插入操作。這個(gè)理解上比較簡單,比較耗損空間。
某一個(gè)用戶登陸后,查看站內(nèi)信的語句則為:
Select * FROM Message Where RecID=‘ID' OR RecID=0
第二種情況,站內(nèi)的用戶中量級(jí)別的(上千到上萬)。
如果還是按照第一種情況的思路。那發(fā)一條站內(nèi)信的后果基本上就是后臺(tái)崩潰了。因?yàn)?,發(fā)一條站內(nèi)信,得重復(fù)上千個(gè)插入記錄,這還不是最主要的,關(guān)鍵是上千乃至上萬條記錄,Message字段的內(nèi)容是一樣的,而Message有大量的占用存儲(chǔ)空間。比方說,Message字段有100個(gè)漢字,占用200個(gè)字節(jié),那么5萬條,就占用200×50000=10000000個(gè)字節(jié)=10M。簡單的一份站內(nèi)信,就占用10M,這還讓不讓人活了。
因此,將原先的表格拆分為兩個(gè)表,將Message的主體放在一個(gè)表內(nèi),節(jié)省空間的占用
數(shù)據(jù)庫的設(shè)計(jì)如下:
表名:Message
ID:編號(hào);SendID:發(fā)送者編號(hào);RecID:接受者編號(hào)(如為0,則接受者為所有人);MessageID:站內(nèi)信編號(hào);Statue:站內(nèi)信的查看狀態(tài);
表名:MessageText
ID:編號(hào);Message:站內(nèi)信的內(nèi)容;PDate:站內(nèi)信發(fā)送時(shí)間;
在管理員發(fā)一封站內(nèi)信的時(shí)候,執(zhí)行兩步操作。先在MessageText表中,插入站內(nèi)信的內(nèi)容。然后在Message表中給所有的用戶插入一條記錄,標(biāo)識(shí)有一封站內(nèi)信。
這樣的設(shè)計(jì),將重復(fù)的站內(nèi)信的主體信息(站內(nèi)信的內(nèi)容,發(fā)送時(shí)間)放在一個(gè)表內(nèi),大量的節(jié)省存儲(chǔ)空間。不過,在查詢的時(shí)候,要比第一種情況來的復(fù)雜。
第三種情況,站內(nèi)的用戶是大量級(jí)的(上百萬),并且活躍的用戶只占其中的一部分。
大家都有這樣的經(jīng)歷,某日看一個(gè)網(wǎng)站比較好,一時(shí)心情澎湃,就注冊(cè)了一個(gè)用戶。過了一段時(shí)間,由于種種原因,就忘記了注冊(cè)時(shí)的用戶名和密碼,也就不再登陸了。那么這個(gè)用戶就稱為不活躍的。從實(shí)際來看,不活躍的用戶占著不小的比例。
我們以注冊(cè)用戶2百萬,其中活躍用戶只占其中的10%。
就算是按照第二種的情況,發(fā)一封“站內(nèi)信”,那得執(zhí)行2百萬個(gè)插入操作。但是其中的有效操作只有10%,因?yàn)榱硗獾?0%的用戶可能永遠(yuǎn)都不會(huì)再登陸了。
在這種情況下,我們還得把思路換換。
數(shù)據(jù)庫的設(shè)計(jì)和第二種情況一樣:
表名:Message
ID:編號(hào);SendID:發(fā)送者編號(hào);RecID:接受者編號(hào)(如為0,則接受者為所有人);MessageID:站內(nèi)信編號(hào);Statue:站內(nèi)信的查看狀態(tài);
表名:MessageText
ID:編號(hào);Message:站內(nèi)信的內(nèi)容;PDate:站內(nèi)信發(fā)送時(shí)間;
管理員發(fā)站內(nèi)信的時(shí)候,只在MessageText插入站內(nèi)信的主體內(nèi)容。Message里不插入記錄。
那么,用戶在登錄以后,首先查詢MessageText中的那些沒有在Message中有記錄的記錄,表示是未讀的站內(nèi)信。在查閱站內(nèi)信的內(nèi)容時(shí),再將相關(guān)的記錄插入到Message中。
這個(gè)方法和第二種的比較起來。如果,活躍用戶是100%。兩者效率是一樣的。而活躍用戶的比例越低,越能體現(xiàn)第三種的優(yōu)越來。只插入有效的記錄,那些不活躍的,就不再占用空間了。
以上,是我對(duì)群發(fā)“站內(nèi)信”的實(shí)現(xiàn)的想法。
作者:萬倉一黍出處:http://grenet.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
相關(guān)文章
SQLServer 2000 數(shù)據(jù)庫同步詳細(xì)步驟[兩臺(tái)服務(wù)器]
成功實(shí)現(xiàn)SQL Server 2000 數(shù)據(jù)庫同步[一臺(tái)服務(wù)器,一臺(tái)動(dòng)態(tài)IP的備份機(jī)],詳細(xì)步驟說明。2010-07-07sqlserver中查找所有包含了某個(gè)文本的存儲(chǔ)過程
我想查找所有使用了sp_a 的存儲(chǔ)過程。右擊sp_a->view dependencies-> 選擇 view objects that depend on [sp_a] 你會(huì)發(fā)現(xiàn),有時(shí)候結(jié)果不能夠全部列出來,不能夠找到所有使用了sp_a的其他存儲(chǔ)過程。2010-05-05SqlServer數(shù)據(jù)庫中文亂碼問題解決方法
SQL版的亂碼問題還是出現(xiàn)在SQL SERVER的安裝設(shè)置上。默認(rèn)安裝時(shí)系統(tǒng)默認(rèn)的排序規(guī)則是拉丁文的排序規(guī)則,但一般人在安裝時(shí)沒有考慮到這一點(diǎn),安裝時(shí)只是點(diǎn)取下一步,安裝完成后,造成了SQL版在使用過程中出現(xiàn)亂碼2020-03-03sql server 自定義分割月功能詳解及實(shí)現(xiàn)代碼
這篇文章主要介紹了sql server 自定義分割月功能詳解及實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10c#連接數(shù)據(jù)庫及sql2005遠(yuǎn)程連接的方法
這篇文章主要介紹了c#連接sql數(shù)據(jù)庫及sql2005遠(yuǎn)程連接的方法,大家參考使用吧2014-01-01