书店






4.61/5 (23投票s)
一个用于使用 db4o 管理用户数字图书(HTML、DOCX、ODF、PDF、EPUB、TXT 等)的项目
截图 1
截图 2
截图 3
引言
BookStore 是一个数字图书管理系统,用 C# 编写,针对 Windows 操作系统上的 .NET Framework 2.0。它使用 db4o 全面面向对象的数据库管理系统来存储和查询图书。
该应用程序允许用户将所有数字图书(CHM、HTML、DOCX、PDF、EPUB、ODF、RTF、TXT 等)存储在一个中央的单一文件数据库存储库中,而无需将图书作为单个文件和文件夹保留在磁盘上,从而减少磁盘碎片,并易于内容聚合和移植(例如,通过将图书数据库复制到 U 盘)。
要导入的图书可以是基于文件的图书(如单个 PDF 文档)或基于文件夹的图书(如网站离线副本)。图书可以一次加载一个,也可以一次加载多个(批量加载)。导入后,可以显示或删除每本图书。
系统中存储的每本图书都有 5 个属性
- 标题
- 作者集
- 标签集
- 出版社
- 出版年份
然后,用户可以根据上述属性的组合查询特定图书集。查询系统包含两个层
- 跨类别层 - 相应的查询类型是
AND
查询(查询结果必须满足每个选定的类别)和OR
查询(查询结果至少满足指定的类别之一)
- 类别内层 - 相关的查询类型是
AND
查询(仅在有多个选择可用时,即作者集和标签集)和OR
查询。这些查询类型的语义与跨类别查询类似。
该应用程序支持同一台 PC 上的多用户访问,因为每个用户都可以拥有自己的数据库,而不会干扰其他用户的数据。此外,由于用户可以选择应用程序的工作文件夹,因此任何用户都可以运行该解决方案,而不管其在系统上的权限如何。
底层 DBMS
在应用程序开发初期,我研究了可用的占用空间小、可编程的开源数据库管理系统。我发现了两个潜在的候选者:SQLite 和 db4o。由于出于研究目的对尝试 OODBMS 感兴趣,我选择了 db4o。
面向对象的数据库因其有望完全消除面向对象数据模型与实体-关系模型之间的差异(称为“阻抗不匹配”)而引起了相当大的兴趣。
这些数据库提供了通过与应用程序的编程语言相同模型进行查询和存储对象的方法。换句话说,OODBMS 通过透明持久化数据、并发控制、数据恢复、关联查询和其他功能来扩展编程语言。面向对象的数据库与大多数现代编程语言和平台兼容,包括 C++、Java、.NET、Perl、Python、Objective-C 和 Visual Basic.
阻抗不匹配
阻抗不匹配是当关系型(SQL)数据库管理系统在面向对象的应用程序中使用时,经常遇到的技术和概念方面的困难集合。
它涉及到信息隐藏、继承和多态、语法和语义以及安全功能等方面。
下图揭示了组合设计模式的用法。一个 Book
包含一个 IDiscEntry
,它可以是 File
或 Folder
。一个 Folder
可以包含多个 IDiscEntry
,这些当然是文件或文件夹。一个 File
包含一个或多个 Buffer
,用于通过连续内存块读/写磁盘数据。如果一个文件很小,它可能只需要一个 Buffer
对象,但如果它的尺寸很大,它可能会使用多个此类对象。
由于关系型数据库世界与面向对象世界的继承关系没有近似的对应关系,因此将此概念建模到 SQL 兼容的数据库中将是一项痛苦且充满妥协的体验,如下所示。
db4o 解决方案
db4o 提供了一个简单统一的接口来存储新对象和更新现有对象:objectContainer.Store(myObject)
。对象是全新存储的,或者在对象图中根据特定定义的更新深度进行更新。
db4o 中有三种查询对象的方法。其中两种使用声明式语法,第三种基于导航式语义。下表揭示了 db4o 中的查询选项。
事务支持不是一种依赖于 DBMS 类型的功能。db4o 使客户端程序员能够获得事务支持,如后续示例所示。
Address address = new Address("Teodor Mihali St.", "Cluj-Napoca", "Romania");
Person person = new Person("Mihnea Radulescu", address);
try
{
// Opens the database file and creates a new instance of the
// IObjectContainer interface.
IObjectContainer db = Db4oFactory.OpenFile("Persons.yap");
// Stores the new person.
db.Store(person);
// Commits the transaction.
db.Commit();
}
catch (Exception)
{
// Rolls the transaction back, in case of failures.
db.Rollback();
}
finally
{
// Closes the database.
db.Close();
}
应用程序详情
该应用程序包含约 55 个类型(主要是类),组织在 5 个命名空间中
DataAccess
- 与 db4o 数据库管理系统交互相关的类型DiscAccess
- 用于从磁盘读取图书文件内容、将其持久化到数据库以及将图书文件写入磁盘以供显示的类RegistryAccess
- 用于存储每个用户数据库位置和临时文件夹路径的单个类BookEntities
- 应用程序业务逻辑类,提供图书数据和元数据以及图书查询引擎BookStoreGUI
- Windows Forms GUI 功能类型(Form
、UserControl
和TabPage
类)
已开发的应用程序是使用 OODBMS 优势解决现实世界场景的一个精心挑选的例子。它通过允许查看已存储图书的内容、删除现有图书、根据一个或多个条件搜索图书以及将新图书添加到应用程序数据库中,来管理用户数字图书的存储、可视化和基于标签的查询。它受益于面向对象持久化功能的自然和直接开发以及性能机会。
此外,作为实现应用程序所需功能的附带的 db4o 相关好处,我
- 创建了一个统一的、完全事务性的 db4o 更新和查询包装器(
DataAccess
命名空间) - 添加了通过重复访问数据库控制的、按缓冲区大小分段的文件来存储和检索任何大小的外部文件(BLOB)的机制(
DiscAccess
命名空间)
源代码和应用程序下载
您可以通过此处访问 BookStore
应用程序(一个 Google Code 项目)的完整源代码。如果您只对二进制文件感兴趣,可以从此链接下载。
我非常欢迎对此 BookStore.NET 开源 (GPL v3) 项目的贡献和反馈,特别是对该项目的 Mono 移植感兴趣。
参考文献
- [1] Microsoft Developer Network (MSDN) 页面
历史
- 版本 0.1 - 首次提交 - 2010 年 3 月 9 日
- 版本 0.2 - 更新了内容、源代码和二进制文件 - 2011 年 9 月 21 日
- 版本 0.3 - 重新设计代码,进行了重要的错误修复 - 2012 年 4 月 24 日