现在有个需求,要记录发送短信记录,字段主要有:
ID(自增)、
APPID(对应各应用ID,对应各个应用:报告审批、日程提醒、收款提醒等)、
SenderType(发送类别ID,对应类别:系统发送0、用户发送1)、
ReceiverType(接收类别ID,对应类别:系统用户接收0、用户联系人接收1、客户接收2、其他直接手机号码接收)、
SenderNO(如果是系统用户发送则存储对应用户工号,如果是系统发送则为0)、
SenderMobile(发送手机号码)、
ReceiverNO(如果是用户则为该用户工号,如果是用户个人联系人则为联系人ID,如果是客户则对应客户ID,如果是其他手机号码接收则为0)、
ReceiverMobile(接收手机号码)、
Message(短信内容)、
Datetime(发生时间),
数据库大概是这样设计的,或许不够合理,目的是在查询时:关键字可能性为(短信内容、发送手机号码、发送人姓名、接收手机号码、接收人姓名),如何实现高效查询,这里不能建立试图:SenderNO/ReceiverNO关联因素不确定,那么该怎么通过该值对应的相应的表查询相应的内容?
首先不可能把所有记录对应的关联缓存下来再进行关键字检索,效率绝对低下!
如果数据库设计不合理如何改进能满足需求?
如果把上述字段分拆到几个表如:
短信信息表(ID、Message、Datetime)、
系统发送用户表(ID、UserNO、MsgID[对应短信表])、
用户发送用户表(ID、SenderNO、ReceiverNO、msgID[对应短信表])、
用户发送联系人表(ID、SerderNO、ContactID、MsgID)、
用户发送客户表(ID、SerderNO、CustomerID、MsgID)、
用户发送手机号码表(ID、SerderNO、Mobile、MsgID)、
如果这样数据库的话就相对规范,可是如果进行查询如何一起查询相应的关联表呢?主要涉及到短信数据两会越来越大,一年下来应该达到千万级别,如果分表或者分库设计,MSSQL该如何进行查询?请高手指点思路,最好能提供参考代码或者范例!感谢万分!!!
折了表后也是要关联的。如果觉得内容大,可以把内容分出来试试,短信的内容应也不在吧。
楼主关键字是不同类型的,可以试着分类来处理,比如查询输入的是发送号码的时间,直接条件就是 发送号= 参数;如果是内容查找,可以用另一个专门的查询来处理,不一定要几个都写成一样的。
楼上的组合再包含就是坑,不要这样。
没这么麻烦,短信表,用户表,用户号码表,短信手机号码表(发送号码ID,接受号码ID,短信ID)
查询的时候关联起来就好了,只要不根据内容过滤效率没问题。才千万数据,一台小型机完全无压力。
不要低估数据库的能力。
这里主要麻烦的地方是用户表关联这里,要根据相应类别关联相应的用户信息表,如果只是一个用户表的话那就很简单,直接一个试图sql语句即可。
@云中岳:
在外键关系列上加索引,常用的查询列上加上组合覆盖索引(include)查询应该没什么压力。你这数据关系算的上比较简单的了。