LiteDb 评测






4.50/5 (2投票s)
一些LiteDB的使用案例
在数据库方面,我们有很多选择,尽管它们大多数都属于 SQL 或 NoSQL 类别,但我们还可以进一步将其细分为在服务器上运行的数据库和可以嵌入到我们的应用程序中的数据库。
对于开发环境,我发现最佳方法(个人偏好)是使用嵌入式数据库,因为它们提供了许多优势,例如:
- 将数据库保存在源代码管理中,这样在不添加复杂种子逻辑的情况下,可以在单独的分支上轻松进行开发,并且更容易回滚到先前的状态。
- 它可以加载到内存中。这对于自动化测试非常有益,因为我们可以创建真正针对数据库约束进行运行的测试。
- 顺便说一句,我曾多次遇到过测试通过但应用程序在手动测试时行为异常的情况,因为模拟对象和实际的 Entity Framework 上下文行为并不相同。
- 无需特殊设置。
当然,这有一个缺点,那就是您在从一个系统迁移到另一个系统时可能会遇到问题,所以,如果您要在开发环境中使用服务器数据库,您也应该考虑到这一点。这完全取决于项目的性质和项目的发展阶段。
什么是 LiteDb?
LiteDb,正如文档页面所提到的,是一个“用于 .NET 的嵌入式 NoSQL 数据库”。
我们不会详尽地介绍该库的所有功能和文档,因为我个人认为作者已经做得很好地涵盖了它们。但我们将介绍一些我个人遇到的用例,以便您能对它如何以及用于什么有所了解。
为什么选择 LiteDb?
据我所知,没有其他 .NET 的 NoSQL 数据库可以被嵌入,所以当我开始一个应用程序或一个需要将数据以有组织的方式存储在文件或数据库中的 LinqPad 脚本时,我的选择是 SQLite 或 LiteDb,因此选择如下:
更新模式或模型有多容易?
在使用 SQLite 时,尤其是在进行持续开发的项目中,我不可避免地要修改数据库模式。SQLite 对此并不容易,因为它不允许删除或修改列,所以我最终需要采取变通方法和技巧将数据迁移到新模式。
由于 LiteDb 是一个无模式的 NoSQL 数据库,那么我就可以更轻松地修改我的模型,并且由于没有列限制,因此可以更容易地回溯并更新旧模型,而无需重新创建整个集合(类似于 SQL 环境中的表)。
保存文件?
目前,在 SQL(以及隐含的 SQLite)中保存文件的唯一方法是:将文件保存到另一个位置,然后将该文件的路径存储在数据库中,或者将文件保存为字节数组然后进行流式传输,对于小型应用程序来说,这两种方法都比较麻烦。
LiteDb 支持直接将文件保存到数据库中。
对象序列化?
在 SQLite 场景中,我需要检索行,将它们映射到对象(这很容易通过像 Entity Framework 这样的 ORM 来完成),然后以我选择的格式序列化对象,然后传输它。当涉及到嵌套对象时,这会变得有点困难。
由于 LiteDb 基于 BsonDocuments(这是一种二进制 JSON,它还能保留对象元数据,如继承链),因此可以轻松检索整个对象图,并将其序列化为其他内容,如 JSON。
使用流?
虽然我承认我不知道使用 SQLite 和流有多容易,但我知道 LiteDb 提供了使用任何类型流的可能性,这意味着我可以通过网络流从服务器加载数据库,或者将数据库保留在内存中并在需要时将其写出。这对于需要离线工作并定期与服务器同步的客户端-服务器应用程序很有用。如果有人真的想,他们甚至可以实现自己的流类型并使用它,例如加密流。
对象图和外键
虽然我承认 SQLite 在外键和模型/实体之间的关系方面更理想,但 LiteDb 也通过使用引用来支持这一点,这样您就可以在集合之间拥有一个/多个到一对/多关系。另外,如前所述,由于 LiteDb 使用 BsonDocuments,您甚至可能不需要一对一的关系,如果您可以将文档直接嵌入到您的模型中,这将使查找和更新都更高效。
性能?
作者已经发布了 LiteDb 和 SQLite 之间的基准测试。所以从那里可以看出,主要收获是它更快,除了批量插入、索引和数据库的整体文件大小之外。
对第三方应用程序的支持
虽然我鼓励您去阅读实际的文档页面,但这里有一些其他人为 LiteDb 创建的功能,可以让您的生活更轻松:
- GUI 编辑器
- 与任何数据库一样,您需要一个应用程序来在应用程序外部查看数据库的内容。
- Lucene.Net Directory
- 如果您想基于文本索引数据,有一个库支持 Lucene,它也是 ElasticSearch 的骨干。
- LinqPad 支持
- 有一个驱动程序允许您将 LiteDb 数据库添加到 Linqpad 中并开始对其运行查询。
- PowerShell 支持
- 对于那些更习惯 PowerShell 的人来说,还有一个库允许您通过 PowerShell 与数据库进行交互。
如何使用
我最近使用 LiteDb 的项目是一个 LinqPad 脚本,它下载我的电子邮件并将它们存档到该数据库中,既有文本格式,也有完整的原始电子邮件(包括标题等),并且还附加了文件。
结论
虽然这最终取决于个人喜好,但 LiteDb 是我工具箱的一部分,原因如下。在撰写本文时,我还在考虑实现 Lucene 部分,以便更容易通过文本搜索找到特定的电子邮件。
我希望您喜欢这个评测,并希望它能让您考虑将 LiteDb 添加到您自己的工具箱中。