对于数据库,我也是个小白
我先举个我遇到的例子吧
一张考勤结果表,这是结果表tm_dayresult
id(主键) psn_num(人员编号) dutydate(排班日期) starttime(上班时间) endtime(下班时间) 缺勤时间,旷工时间,早退时间,工作时间,,,,,
客户的情况是:(规定工作时间是08:30-17:30)
客户的需求是,假如我今天加班到20:00之后,第二天9:30以后打卡才算迟到
我接手的情况是:没有源代码,不能改源代码(用友标准产品,不允许修改),只能写触发器之类的,程序的逻辑是有另外一张打卡记录表,这是基础数据,由此计算出tm_dayresult(日汇总结果),tm_monthresult(月汇总结果),tm_yearresult(年汇总结果),然后在数据库里插入所有tm_dayresult,再插入所有tm_monthresult,,,,,
于是我要在yearresult上写触发器,得到psn_num,再去查tm_dayresult里所有这个人的记录,游标,如果迟到了,查一下前一天的下班打卡时间,,,,what a fucking day
现在问题来了,学挖掘机技术哪家强?
请忽略上句,如果看到了我也没办法喽
游标打开,这个游标肯定要先select * from tm_dayresult where [email protected]_num
这个时候已经把所有这个人数据查出来了,放在内存里了,我再去查他前一天的记录,再做一次io操作,是不是有点蠢?我可以建一个临时表,把结果存一下,去临时表里查他前一天的数据,这样是在内存里,少一次io操作
自作聪明,,,,,sql有一个机制,每一次查询,这次的结果是在内存里缓存一段时间的,下次查询不用再做io操作,不然跟直接读写文件有什么区别
那我是不是应该直接去查select * from tm_dayresult where [email protected]_num and dutydate=dateadd(d,-1,@dutydate)
这样反而效率更高,因为在这个很短的时间内,这一部分数据已经在内存里了,sql内部的机制是直接取缓存(先不管sql能不能分析出这次查询的结果已经在内存里了)
ef可以生成缓存,我对ef不了解,不知道它是如何实现。我猜,比如用sql时直接使用sql内部的缓存,在此基础上再生成自己的缓存,用oracle时用oracle的缓存,,,感觉这样比较合理。当然,直接读写文件的时候全部是自己生成的缓存(怎么设计??怎么解析??如果是读xml,excel之类还好,这本身就是一种数据库,如果是一个二进制文本,按字节读,那我不知道该如何生成缓存,也许可以记录这是文件的哪里到哪里作为索引,然后对文件内容进行增删的时候,修改索引。但不能记录磁盘位置,一个文件可能乱序存在磁盘上)
关于缓存如何实现先放一下,另一件事,我能不能在查询的时候设置:查询结果要缓存多久。因为我可能打开程序就只用一次,比如系统配置,用友的u8,我在uap里做一张报表,他的格式,内容,,,所有的东西都是存在数据库里。我把软件打开,这些配置我读一次,然后永远都不会用了,所以我能不能 (select * from tablename)with cathetiem=0
然后,我能不能用统一的数据库结构化查询语言去使用不同的关系型数据库,oracle和sql语法基本一致,但不完全一致就意味着,,,浏览器不兼容,怎么办?做两套,,,我希望以后有统一的查询语言和数据库设计器,我设计好了数据库结构,于是就形成了一个描述文件,我用这个描述文件可以生成任意数据库管理软件的数据库,就像浏览器去解析html,然后一个后台程序员不知道我的程序用了什么数据库。作为客户,我可以随时更换数据库软件,甚至支持sql导出至oracle,对于客户来讲,我的数据就是,完全的,纯粹的,“我”的数据
因为以后我们可能更彻底地模块化,我随身带的不是电脑,手机,,,而是一个具备单一功能的个人数据存储中心,轻巧,绝对安全(因为厂家只要关注这一件事,专注带来专业),我回家连上各种设备,当电脑用,在外面连上其他设备当手机用,当摄像机用,因为我的手机希望它轻巧,摄像机需要他够大(像素),专业的设备具备专业的功能,需要什么功能就用什么设备,这需要把数据和功能在硬件上严格分离,因为功能是通用的,数据是个性的,个人的,当然某些设备可能需要根据具体的数据进行可重构,但也仅限于他自己的领域,这是完全可以接受也是必要的,,,那一天,我们整个人类就像一个人一样,每个人就像一个细胞一样,完全的模块化,格式化,,,,于是我预见了那一天太遥远了,,,这等于是完全的共产主义社会