关于站内信的数据库设计,NET中发送电子邮件的

站内信:网址运行人士能够向单个(单发)或八个(群发)客商推送新闻,站内信其实正是向数据库中插入一条条记下。

  明日,发表了博客“群发“站内信”的实现”,得到广大网民呼应,在此表示感激。

  在非常多网址连串(如CMS系统,SNS系统等),皆有“站内信”的功效。

首先、导入命名空间:

数据库设计:

message【站内信发件箱表】{每趟运行职员发送一条站内信(无论是单发或是群发)就可以在发件箱表中加多一条记下}

 图片 1

 表字段:ID、SendID、RecID、MessageID、Statue、DateTime

messagetext【站内信发件内容表】{每一回运转职员发送站内信的剧情就能够保留到站内信发件内容表中}

图片 2

表字段:ID、Title、Message、PData

messageuserinfo【站内信接收箱表】{顾客站内信收件箱}

图片 3

表字段:ID、SendID、RecID、MessageID、Statue、DateTime

 

  看了网民的留言。发掘我们对文中的前三种情况并未什么样纠纷,对第三种方案争论颇多。我在此再把小编的第三种情景详细的阐明一下,和我们沟通。其它,本文的基点主要放在“群发”(也便是点到面),至于“单发”(点到点),不在本文的研商之列。

  “站内信”分裂于电子邮件,电子邮件通过特意的邮件服务器发送、保存。而“站内信”是系统内的新闻,说白了,“站内信”的贯彻,就是通过数据库插入记录来兑现的。

 代码如下 复制代码
using System.Net.Mail;  

专门的学问逻辑:在运维职员发送了一条站内信后,当客商再度登入时就可以刷新历史站内信,而那多少个不活跃的顾客就不会更新站内信。

此情此景:运维职员向有个别(单发)或多少个(群发)客户发送站内信

增添发件内容:向messagetext站内信发件内容表中加多一条内容记录 {这里先增添messagetext站内信发件内容表发生一条记下,前面message站内信发件箱表中才有MessageID能够提到}

增多发件人发件记录:向message站内信发件箱表中增添一条发送记录 {备注:要是是单发RecID则是钦定顾客的UserID,假设是群发RecID则是0。(0意味具有客户)}

顾客登陆时刷新与本身有关的站内信,并将数据增加到messageuserinfo站内信接收箱表

  1. 询问条件:【发件人不是上下一心】并且【收件人是协调可能收件人是全体人】何况【本人收件表中不设有的笔录】

    select m.id from Message as m where (m.recid='所有人' or m.recid='自己的ID') and m.sendid!='自己的ID' and m.MessageID not in (select u.messageid from MessageUserInfo as u  where u.recid='自己的ID')
    

      

  2. 将相关的站内信新闻增添到本人的收件表中,并标志未读。

    1.   将方面【查询条件】中查询出来的id音讯用做查询message站内信发件箱表的条件

      select * from message  where id=上面的m.id
      

        

    2. 将得到到message站内信发件箱表数据拉长到messageuserinfo站内信接收箱表

  3. 询问出自个儿的站内信记录

    select u.ID,u.RecID,m.Title,m.Message,u.Statue,m.PDate from messageuserinfo as u join messagetext as m on u.MessageID = m.ID where u.RecID='自己的ID'
    

      

     

  先看看,第三种情状。站内的客商是大量级的(上百万)。

  “站内信”有三个基本成效。一:点到点的音讯传送。客商给客商发送站内信;管理员给客商发送站内信。二:点到面包车型大巴音讯传送。管理员给客商(内定满意某一规范的客商群)群发消息。点到点的消息传送很轻便完毕,本文不再详述。下边将基于差异的图景,来讲说“站内信”的群发是何等促成的。

概念发送电子邮件的法门[网络海人民广播电视台湾大学例外的,能够对照着看一下,WinForm的也适用]:

  经过思索,表设计校正如下

  第一种境况,站内的客商是为数异常少级其他。(几十到无数)

 代码如下 复制代码
/// <summary>
/// 发送电子邮件
/// </summary>
/// <param name="MessageFrom">发件人邮箱地址</param>
/// <param name="MessageTo">收件人邮箱地址</param>
/// <param name="MessageSubject">邮件宗旨</param>
/// <param name="MessageBody">邮件内容</param>
/// <returns></returns>
public bool Send(MailAddress MessageFrom, string MessageTo, string MessageSubject, string MessageBody)
{
 MailMessage message = new MailMessage();
 message.From = MessageFrom;
 message.To.Add(MessageTo); //收件人邮箱地址能够是两个以落到实处群发
 message.Subject = MessageSubject;
 message.Body = MessageBody;
 message.IsBodyHtml = true; //是否为html格式
 message.Priority = MailPriority.Normal; //发送邮件的优先品级
 SmtpClient sc = new SmtpClient();
 sc.Host = "smtp.qq.com"; //内定发送邮件的服务器地址或IP
 sc.Port = 25; //指定发送邮件端口
 //钦命登入服务器的客户名和密码(发件人的信箱登入密码)
 sc.Credentials = new System.Net.NetworkCredential("【发件箱地址】", "【www.111cn.net发件箱密码】");
 try
 {
  sc.Send(message); //发送邮件
 }
 catch
 {
  return false;
 }
 return true;
}  

 

  这种情况,由于客商的数据比比较少,由此,不须要过多的虚构数据库的优化,采取轻便的报表,对系统的打算也来的简约,早先时期也相比轻松保险,是独立的用空间换时间的做法。

义发送电子邮件的艺术

  表名:Message

  数据库的计划如下:表名:Message

调用定义的法子,实现发送邮件:

  ID:编号;RecID:接受者编号;MessageID:站内信编号;Statue:站内信的查阅景况;

  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为全部人);Message:站内信内容;Statue:站内信的查阅意况;PDate:站内信发送时间;

 代码如下 复制代码
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ForMail(string name, string mail)
{
 try
 {
  //string email = txtemail.Text.Trim();
  MailAddress MessageFrom = new MailAddress("【发件箱地址】"); //发件人邮箱地址
                  string MessageTo = mail; //收件人邮箱地址
  string MessageSubject = bs.HtmlEncode(邮件大旨);
  //邮件内容 (一般是四个网址链接,生成随机数加验证id参数,点击去网址求证。)";
  string MessageBody = "" content1.Value.Trim() "";
  if (Send(MessageFrom, MessageTo, MessageSubject, MessageBody))
  {
   //Response.Write("发送邮件成功");
  }
  else
  {
   //Response.Write("发送邮件战败");
  }
 }
 catch
             {
  //ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>alert('顾客消息删除失利')</script>");
 }
}  

  表名:MessageText 

  如若,某四个大班要给全数人发站内信,则先遍历顾客表,再依照顾客表中的有所客户依次将站内信插入到Message表中。那样,借使有六拾九个客商,则群发一条站内信要实践57个插入操作。这些精晓上比较轻易,相比较亏蚀空间。

调用方法发送邮件  

  ID:编号;SendID:发送者编号;Message:站内信的内容;PDate:站内信发送时间;

  某三个客商登录后,查看站内信的语句则为:

不等邮箱的smtp地址都不雷同、必要比方QQ的是smtp.qq.com、163的是smtp.163.com

 

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

更加多详细内容请查看:

  那样,助理馆员(假设ID=1)给持有的顾客发一封站内信。就在MessageText表中插入一条记下。譬喻:

  第三种状态,站内的用户中量级其他(上千到上万)。

  ID:4;SendID=1;Message=Good;PDate:2010-4-9

  如若照旧按照第一种情况的思路。那发一条站内信的后果基本上正是后台崩溃了。因为,发一条站内信,得重复上千个插入记录,那还不是最重要的,关键是上千以致上万条记下,Message字段的开始和结果是同一的,而Message有雅量的挤占存款和储蓄空间。举个例子说,Message字段有九十六个汉字,占用200个字节,那么5万条,就攻陷200×陆仟0=一千0000个字节=10M。轻易的一份站内信,就占用10M,这还让不令人活了。

 

  由此,将原先的报表拆分为多个表,将Message的主脑位于二个表内,节省空间的占有

  某些客商(假若ID=7),登入系统后,开采在MessageText的表中,有ID=4的记录,何况在Message中并未有RecID=7且MessageID=4的笔录,说明那条记下这一个顾客未有读过,给个提醒新闻给客户,提醒客户看站内信。注意,此时依然未有在Message中插入记录。一旦该客户点击查阅该站内信的时候,在Message中插入一条记下,如:

  数据库的设计如下:

  ID:55;RecID=7;MessageID=4;Statue=已读

  表名:Message

  如若该客商删除这条站内信,则实在是修改上边那条记下:

  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为全体人);MessageID:站内信编号;Statue:站内信的查看情状;

  ID:55;RecID=7;MessageID=4;Statue=删除

  表名:MessageText 

  这样一来,那一个顾客后一次登录的时候,由于Message表中有打点的笔录,也不会唤醒客户看站内信。

  ID:编号;Message:站内信的开始和结果;PDate:站内信发送时间;

 

  在总指挥发一封站内信的时候,推行两步操作。先在MessageText表中,插入站内信的原委。然后在Message表中给具有的顾客插入一条记下,标记有一封站内信。

  有网上朋友思疑,为啥删除的时候,只是标志“删除”,那样,经过了十分长的时间,不是萧条大批量的空中啊?这一个网上朋友说的也可能有道理。可是,我们照旧要分析具体的情事。

  这样的希图,将再也的站内信的本位音讯(站内信的剧情,发送时间)放在三个表内,大批量的节约存款和储蓄空间。可是,在询问的时候,要比第一种意况来的复杂。

  当网址的客户达到百万级的时候,在那之中的“活跃顾客”(参看上文的介绍)大概只占当中的一小部分。

  第三种情状,站内的用户是大批量级的(上百万),而且活跃的客商只占个中的一局地。

  若是,网址客商200万,在那之中活跃客商40万。

  大家都有这么的经历,某日看三个网址相比好,不时心情澎湃,就注册了贰个客商。过了一段时间,由于种种原因,就记不清了挂号时的客商名和密码,也就不再登录了。那么这几个客户就称为不活跃的。从实际上来看,不活跃的客户占着非常的大的百分比。

  一封站内信,在MessageText中有一条记下,40万活蹦乱跳客户都看了站内信(其实,那也相当小或许,有非常多的人是不看站内信的)。在Message中插入了40万条记下。今后,不管是阅读也许是剔除,在Message中保留了那40万条记下。

  大家以登记客户2百万,当中活跃顾客只占在那之中的十分一。

 

  就到底根据第两种的情事,发一封“站内信”,那得实行2百万个插入操作。然则个中的有用操作唯有一成,因为别的的十分七的客商恐怕长久都不会再登录了。

  好,若是不行使这种格局,在群发的时候,往Message中布置200万记下,40万活泼客户都看了信,况且都努力的删除了站内信(那是十分的小也许的),Message中依旧保留了160万条记下。因为,那个不活跃的客商大概永恒都不会登入了。那40万条记下(最坏的状态,因为要是有人不看站内信,就不会生成记录)和160万条记下(最佳的情景,因为不是各种客户都会删除站内信。)比较,那一个尤其节约空间吧?

  在这种意况下,我们还得把思路换换。

 

  数据库的统一准备和第三种境况大同小异:

  站内信的筹划,要基于你的受众群的具体情形而定,假使您的受众群活跃度邻近百分之百,並且每人都很勤快,笔者的设计当然失常。可事实上中那几个美丽状态差不离是不容许出现的。

  表名:Message

  

  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为全部人);MessageID:站内信编号;Statue:站内信的查看情状;

  有网民建议,倘诺站内信的对象不是总体而是一部分吗?抱歉,这几个也不在本文研商之列,你能够对自身的表进行扩大,以高达你的渴求。

  表名:MessageText 

 

  ID:编号;Message:站内信的内容;PDate:站内信发送时间;

  多谢各位网络朋友的交换。笔者在此想说的是,大家布署贰个系统,必得得结合实情,依据实情来制订,比能落得贰个相比优异的气象。

  管理员发站内信的时候,只在MessageText插入站内信的主旨内容。Message里不插入记录。

  那么,顾客在签到未来,首先查询MessageText中的那么些尚未在Message中有记录的笔录,表示是未读的站内信。在查阅站内信的源委时,再将有关的笔录插入到Message中。

  那几个法子和第三种的可比起来。假若,活跃客户是百分之百。两个功能是一模二样的。而活泼顾客的百分比越低,越能反映第二种的优遇来。只插入有效的记录,那多少个不活跃的,就不再占用空间了。

  以上,是自家对群发“站内信”的贯彻的主张。也招待各位提议自个儿的建议,大家互相借鉴,共同升高。

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:关于站内信的数据库设计,NET中发送电子邮件的

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。