对于资金充裕的人来说,这个问题根本就不是问题,因为直接买就完事了。但是对于资金紧张的人来说,比如刚毕业的大学生、比如现在的我(虽然我现在还有两台服务器没到期,但是到期之后我应该不会续费了),在没有服务器的情况下拥有云数据库服务,可以为自己带来很多便利。
我的解决方案是使用免费的云存储平台,并且在程序中使用本地文件存储方案来代替云数据库,比如 Sqlite。
云存储平台
我自己用的云存储平台是坚果云,主要是因为这个平台用得比较多,而且在现在的公司网络里可以直接访问坚果云。
首先创建一个专门用于存储数据的目录,我自己创建的目录名叫 v.assistant.data,我给自己写了一个助手类程序,用于做一些事项的记录以及帮我抉择晚餐该吃什么,我把这个程序的数据全部放在了 v.assistant.data 这个目录下。
在此,我建议把创建好的目录同步到系统盘根目录,对于 windows 就是 c:\xxxx,对于其他类 unix 系统则是 /xxxx,因为这样在程序中就可以直接通过 /xxxx 来访问该目录,而不用根据不同平台、不同电脑来改变路径了。
本地文件存储方案
说到这个,大家第一时间想到的肯定是 Sqlite,这是一个通用的解决方案,因为几乎所有语言都支持 Sqlite,并且也会有比较好的配套类库,比如基于 Sqlite 的 ORM 框架 。
或者基于本地文件的嵌入式 NoSQL 类库 作为本地文件存储方案。
但是我自己所使用的是自己开发的一个类库 V.Talog.Mapper ,该类库主要是基于之前开发的标签化日志类库,由于突然想要试试看能不能加上 ORM 支持,将这个类库作为数据库使用,所以就尝试写了 V.Talog.Mapper 这个类库。结果令我自己还挺满意的,主要是因为我所设想的内容都能较好地实现出来,虽然这个类库看起来不像其他主流的 ORM 类库,性能大概率也不怎么样,但是对我来说刚好合适,而且顺手,因为这个类库的每一行代码都是我自己写的,我很清楚所有的运行逻辑。
V.Talog.Mapper
首先创建一个实体类
[Index(Name = "record")] public class Record { public string Id{get;set;} [Tag(Name = "type")] public int Type{get;set;} [Tag(Name = "tag")] public string Tag{get;set;} public string Title{get;set;} public string Remark{get;set;} public DateTime CreateTime{get;set;} public DateTime UpdateTime{get;set;} public DateTime Deadline{get;set;} public bool Done{get;set;} public bool IsValid{get;set;} public long DataVersion{get;set;} }
Index 特性用于标识 Record 类的数据将会被存储于 record 数据目录下
Tag 特性用于标识哪些字段是作为数据标签的,标签在 V.Talog 中可以理解为是传统数据库中的索引,当然这其中肯定是完全不一样的,但是这么解释比较容易理解。
接着需要在程序启动时,对 V.Talog 进行一定的初始化操作。
using var talogger = new Talogger(); talogger.Config.DataPath = "/v.assistant.data"; TaloggerExtension.SetIndexMapping(new TypeMapper());
第一行初始化了 Talogger 对象,对于程序来说,只需要创建一个 Talogger 对象即可。
第二行配置了一下数据存储路径,正如前面所说,对我这个程序来说数据路径就是
/v.assistant.data
,如果未指定数据路径,默认为./data
。第三行是用于告知 V.Talog index 下每个字段的数据类型,在 V.Talog.Mapper 中,只需要创建 TypeMapper 的实例就行,TypeMapper 会扫描程序中所有带有 [Index] 特性的类,并解析、保存下这些类每一个字段的数据类型。
完成以上三步即完成了程序的初始化,可以开始使用 V.Talog 进行存储、读取数据了。
存储数据则较为简单,只需要创建实体类实例,然后调用 Talogger 的 Save 方法即可。
var record = new Record(); talogger.Save(record);
查询数据其实也比较方便,只是需要知道如何写出规范(对于 V.Talog 来说)的查询语句,这部分在 V.Talog 项目文档中有提到,感兴趣可以了解一下。
var records = talogger.Query<Record>("type == 1", "Id == 'xxxxxx'");
最后,看一下目前我的程序存储到坚果云中的数据
以及程序的数据展示