文本存款和储蓄,那是1个本人原先很少去履行具体行使的领域。

 

为何会谈起文本数据库,从上篇:秋色园QBlog技术原理分析:品质优化篇:读写分离与公事数据库(108) 中,看出是由于使用,故而有几许催人奋进。

 

本来地,从上文中,能够看来:基本依据文本的简练的读写应用,轻轻地严厉地一点地以来和“数据库”不太着边,境界不够。

 

自身想象中“文本数据库”,再怎么总结,也得应该有以下多少个的啊:

 

1:有囤积结构[表结构]

②:有主键ID,不是GUID时,咋也得全部自增ID吧(大伙的利用习惯)。

三:能拉长,修改,删除数据。

4:最佳仍是可以查询,排序,分页,至于分组恐怕供给高了点。

5:再最佳有出现控制。

 

回头再看秋色园 QBlog 当前的采用是:

 

一:文本存款和储蓄的情节少:3个文本存的不是表,基本是一行(偶尔多行)。

二:基于第一点,只可以算得文本的读取应用,和“数据库”还扯不上关系。

 

故从以上近年来的施用来说,完全达不到文本数据库应用的境地。

 

当然,有了依照文本的应用,故而顺理成章的对文件扩张出的“文本数据库”发生了有个别感兴趣与快乐也就很自然了。

 

于是乎,小编上网搜了壹晃“文本数据库”,发现.net界差不多从不它的身影,倒是曾在php界大放过异采,那是怎么呢?

 

那是干吗呢?揣度是为着以下内容:

 

用文件当数据库的中坚优势:

 

一:简单的公文操作速度比数据库快:

非要解释,笔者不得比不上此说:大伙都存的磁盘,直接存肯定比数据库绕了一定的仓库储存结构平整后存的快,当然越以后越复杂,就不佳说了。

2:存取操作简便:

不用吗ADO.NET,间接System.IO.File就足以化解,多方便啊!

 

用文件当数据库的基本劣势:

 

一:数据量不适合大。

二:并发就像是不太好

三:删除与修改糟糕操作

4:要变身成“文本数据库”有许多要事要拍卖:

a:那自增添ID咋出来呀?

b:那要询问咋整啊?

c:那要排序咋整啊?

 

用文件数据库的着力适用的使用场景:

 

一:小型应用,以文件为主数据库:

单个(表)文本数据量相当小:100000条数据以下,10M分寸以下(1遍性加载到内存中操作,就成了内部存款和储蓄器数据库了,速度哗啦啦)。

二:大型应用,以文件为辅数据库:

透过将1些数据库分散到零星的公文中,下降主数据库的下压力。

叁:中型应用,以文件为主数据库:

以此不佳说,说不佳,不说好,必要有一定强力的技艺队五援救。 

 

 

为了更加好的公布“文本数据库”的能动性,本身花了些时日对其进展了略微钻探及思想,下边和大伙分享一下经历:

 

一:存款和储蓄结构

 

本条自家从秋色园 QBlog 的文本应用中赢得升迁,存成json,挺好的呦,那不json都盛行的么,直接读取传到前端,爱干啥干啥!

因此那里的技术点是:怎么着输出json和读取json解析。

这里:CYQ.Data V叁.0 框架开源版本(下载)里有二个JsonHelper,能把多少生成Json,也能把json字符串解析成KeyValue键值对应,感兴趣的可去研商。

于是,基本读与取就消除了。

 

二:数据插入

 

利用:System.IO.File.AppendAllText就足以轻松把一行的json加到文本的最终中。

 

3:更新、删除

 

那八个操作大致是差不离,个人想到的二种方法:

方式一:简单型 [以此实际上挺好,因而从文本数据库的选取场景上看,基本要求并不是太高]

将壹切表的重新出口json,再重写1次文本就足以了。

方式二:复杂型[其一是性质思索的多一些,对于文本数据库追求的过些过了好几,因为只要太复杂,何不找别的数据库,用文件不就图个差不离么]

这些比较难受,那里也提交一点私房的思路想法:

壹:定表结构时,必须定好各类字段的尺寸,那样就定出1行总的最大尺寸。

二:写一行数据时,不够总秘书长时,前边补空(好像一般是写入\0)。

三:更新或删除时,依照行的(ID-一)*行程,定位到起头写的位置,然后改写一行即可,要是是去除则当行全写空(\0)。

那里其实正是空中换时间,而且数量删除时,文本大小也没变化,是否有点像access呢?

 

针以上边方式2,这里给出点示例代码:

 

                FileStream fs = File.Open(文件路径);
                fs.Seek(定位要写入的初阶地方, SeekOrigin.Current);
                fs.Write(..写入内容…);
                fs.Close();

 

4:自增ID咋出来

 

充实ID还是比较简单,读取文本最后一行的首字段的值+壹就出来了,当然仅符合于数字型的了,然后全局缓存,每一回读取++。

 

上边给出3个参照的演示代码:

 

 /// <summary>
        /// 下三个自扩展ID
        /// </summary>
        private int NextID
        {
            get
            {
                lock (lockNextIDobj)
                {
                    if (maxID > 0)
                    {
                        maxID++;
                    }
                    else if (DataType.GetGroupID(Table.Columns[0].SqlType) == 1)//自增ID仅对int有效
                    {
                        if (Table.Rows.Count > 0)
                        {
                            int lastIndex = _Table.Rows.Count – 1;
                            do
                            {
                                if (lastIndex >= 0)
                                {
                                    if (_Table.Rows[lastIndex][0].IsNull)
                                    {
                                        lastIndex–;
                                    }
                                    else
                                    {
                                        maxID = Convert.ToInt32(_Table.Rows[lastIndex][0].Value) + 1;
                                    }
                                }
                                else
                                {
                                    maxID = 1;
                                }
                            }
                            while (maxID == 0);

                        }
                        else
                        {
                            maxID = 1;
                        }
                    }
                    else
                    {
                        throw new Exception(“Increment id only use for int type”);
                    }
                }
                return maxID;
            }
        }

 

5:查询咋做

 

实际那么些很好办,将json解析还原为数组列表之后,数组有个FindAll方法,搜点教程探究一下就足以了,对于数组的查询,园子里依然有不少篇章介绍的。

 

陆:排序怎么办

 

其一也很好办,同样json解析还原为数组列表之后,数组有个Sort方法,同样搜点教程就足以了。

 

七:单进度并发怎么决定

 

那么些其实可以办,加lock锁就行了。

 

8:多进度并发怎么控制

 

在IIS应用程序池回收或启用多少个exe程序时,多进度大概出现同时操作文本数据库的动静,那里本人也探究了漫漫,怎么去控制?

最后作者想出去的章程是:进度在预备更改文本时,读取文本最后修改时间进行比对,进而达到一种相对控制。

 

总结:

 

村办认为消除完下面的难点之后,基本回顾的文本数据库也成型了,当然你也得今后上继承追求。

可是文本数据库,折腾的太复杂也没须求,究竟文本数据库,依旧以简单为主。

一经NoSql会大行其道,何不让文本数据库也在.net界也出出风头,成长成.Net界的一朵奇葩!

 

相关文章

网站地图xml地图