随着数据不断增长,数据库中单表无法满足大数据量的存储,所以我们就提出按照自然时间、单站点信息分表来存储大量秒级数据。
例如:大气、水利、交通(GPS)信息监测系统中的实时数据进行存储,一般时按照开始时间、结束时间、单站点、多站点、监测项目等方式进行数据查询、分析、图表。
如 按5分钟单站点的数据12*24(小时)*365(天)*(监测项)10=100W ,也就是一个站点一年数据量 100w条,100站*100W =1亿条这样的数据是无法满足快速查询。
所以我们就按照 ”tb_5M_年_站号“建表名称,tb_时间刻度_年份_站号建表 。 "TB_5M_2016_A0001", "TB_5M_2016_A0002", "TB_5M_2016_A0003",, "TB_5M_2016_A0004"
条张表 存储100W,如存储1分钟的数据单表就 500W条, 如1秒钟数据:60*500W=3亿条数据,这样不行啊,我们要以在分表,分表规则中加一个月份,tb_5M_年_月_站号,这里就不说了。
问题来,我们如何方便快捷编写代码那?,我们还想用ORM(EF)进行数据查询,就拿我们真实项目来说吧。
思路,我们用.NET开发,在数据库建基本表(tb_5m_Base)来实现EF,用 DbContext实现数据访问。
别的不多说了,直接来代码吧,
功能5分钟数据查询,用户指定开始时间、结束时间、单(多)选择站点、单(多)选择监测 项目,进行数据查询功能。
代码发如下:
public class Tb_5m_Base
{
public int ID{ get; set; }
public Datatime Time{ get; set; }
public string Pcodes { get; set; }
public double Values{ get; set; }
}
public partial class EntityFrameworkDataContext : DbContext
{
static EntityFrameworkDataContext()
{
Database.SetInitializer<EntityFrameworkDataContext>(null);
}
public EntityFrameworkDataContext()
: base("Name=EntityFrameworkDataContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new tb_5m_Base());
}
public DbSet< tb_5m_Base> TB_5m_Base{ get; set; }
}
public class BLLDataQuery
{
/// <summary>
/// 获取数据
/// </summary>
/// <param name="startTime">开始日期</param>
/// <param name="endTime">结果日期</param>
/// <param name="stationids">站点ID :1,2,3</param>
/// <param name="pcodus">监测项 :EC,PC,MC</param>
/// <returns></returns>
public static List<tb_5m_Base> GetMinuteData( DateTime startTime, DateTime endTime,string stationids, string pcodus)
{
List<tb_5m_Base> list = new List<tb_5m_Base>();
string[] strArray = stationids.Split(new char[] { ',' });
int year = startTime.Year;
int num = endTime.Year;
string str = string.Empty;
string commandText = string.Empty;
pcodus=pcodus;
while (year <= num) //年份跨年也没问题
{
foreach (string strstationid in strArray) //站点
{
tbname= string.Format("tb_5m_{0}_{1}_Src", year, strstationid );
commandText = string.Format("Select * from {0} where TIME between '{1}' and '{2}' and pcodes in ({3}) ", new object[] { tbname, startTime, endTime, pcodus});
try
{
using (EntityFrameworkDataContext _dbcontext = EntityFrameworkDataContext.CreateDbContext)
{
list.AddRange(_dbcontext.Database.SqlQuery<tb_5m_Base>(sql,new paramentList[0]).ToList<tb_5m_Base>());
}
}
catch (Exception exception)
{
}
}
year++;
}
return list;
}