磁盘数据库存储,最佳实践
Posted
技术标签:
【中文标题】磁盘数据库存储,最佳实践【英文标题】:On-Disk database storage, best practices 【发布时间】:2011-03-23 14:04:01 【问题描述】:如果您觉得这个问题很常见,我深表歉意,我在这个网站上进行了快速搜索并在谷歌上搜索了几下,但找不到令人满意的答案。
我的问题是这样的;
我现在只做了 3-4 年的软件开发人员。这段时间似乎足以让我自己回答这个问题,但是在我所有的时间里,我从来没有开发过不需要将数据存储主体放在在线数据库中的软件。然而,这一次,我的最新开发只需要将其数据仅存储到磁盘。
实际数据本身是轻量级的。在代码中,主要资产将是一个只有少数基于字符串的属性的类,这些属性必须被持久化。我最初的想法是简单的序列化。在应用程序关闭时,新资产被简单地序列化并作为文件存储在磁盘上。我也可能出于备份目的(或者如果它是序列化类的更好选择),XML 文件将是合适的。
我想不出这两种方法有什么明显的缺点,正是这个事实导致我公开提出这个问题。根据我的经验,解决问题的方法很少没有缺点。
【问题讨论】:
【参考方案1】:序列化(二进制或 XML)适用于少量数据。这种方法的问题是当您获得大量数据(您可能需要查询)时。
如果你在windows平台上需要合适的数据库,你可以使用windows自带的嵌入式数据库引擎-ESENT。它是 Exchange 和RavenDB 的后备存储。
Here 是它的 .NET 包装库。
ManagedEsent 提供对 ESENT 的托管访问,ESENT 是 Windows 原生的嵌入式数据库引擎。 ManagedEsent 使用 Microsoft Windows 中的 esent.dll,因此无需下载和安装额外的非托管二进制文件。
【讨论】:
【参考方案2】:最轻量级的解决方案,当然是使用XML和序列化。这样做的主要优点是它非常简单,只需要很少的代码,并且可以使用文本编辑器轻松编辑。这样做的另一个优点是能够拥有多个文件,并且它们很容易从 PC 传输到 PC。
这是一个不错的tutorial on XML serialization。
但是,如果您的应用程序要大量读取、写入和更改数据,并且只有一个数据源,那么最好使用轻量级数据库。很多人喜欢SQLite,而我个人更喜欢Firebird。
请参阅此question for using SQLite with C# 和see here for information for using Firebird with .net。
【讨论】:
【参考方案3】:另一个嵌入式数据库选项是Sql Server Compact Edition。这个is v4 的最新版本,它似乎比以前的版本有了很大的改进。
它在功能上等同于使用 XML 文件、访问数据库,甚至是普通的旧文本文件,因为您不需要运行 Sql Server 服务或在应用程序运行的机器上安装任何特殊的东西开。
【讨论】:
随着时间的推移:“截至 2013 年 2 月,SQL Server Compact Edition 已被弃用;没有计划新版本或更新,尽管 Microsoft 将继续支持到 2021 年 7 月”。所以很快它将不受支持。【参考方案4】:我一直在一个项目中使用 Sqlite,它工作得很好,也很容易使用,但在使用 Sqlite 时要记住的一件事是它被设计用于单用户环境,所以如果你将其用作网站后端的数据库,例如,您可能会发现它会在最轻微的负载下挣扎..
查看此链接以获取 C# 包装器: http://sqlite.phxsoftware.com/
我还使用 NHibernate 和 NHibernate.Linq 与数据进行交互,您可以在此处获得两者兼容的构建:http://www.dennisdoomen.net/2009/07/nhibernate-210-ga-with-linq-and-fluent.html
NHibernate.Linq 允许您在 Sqlite db 上使用那些漂亮的 Linq 查询语法:
var onePiece = from s in session.Linq() where s.Name == "One Piece" select s;
【讨论】:
以上是关于磁盘数据库存储,最佳实践的主要内容,如果未能解决你的问题,请参考以下文章