Xml或Sqlite,何时删除数据库的Xml?

我真的很喜欢保存数据的Xml,但是什么时候sqlite /数据库成为更好的select? 例如,当xml有多于x个项目或大于y MB?

我正在编码一个rss阅读器,我相信我在使用XML的sqlite数据库来存储所有的饲料项目caching的错误select。 有一些饲料在一个月后有一个〜1mb的xml文件,另一个有700多个项目,而大多数只有30个项目,几个月后大小约为50kb。

我目前没有计划实施上限,因为我喜欢能够search所有东西。

所以,我的问题是:

  1. 什么时候sqlite /数据库的开销合理的使用XML?
  2. 是有几个大的XML文件 ,当有很多小的数据库足够的理由,但即使是小的将随着时间的推移增长? (很长一段时间)

更新 (更多信息)

每次在GUI中select一个订阅源时,我都会重新加载该订阅源XML文件中的所有项目。

我还需要修改读取/未读状态,当我循环访问xml中的所有节点以查找该项目,然后将其设置为读取/未读时,这看起来真的很糟糕。

我基本上同意Mitchel ,这可以是高度具体取决于你将要用XML / SQLite做什么。 对于你的情况(caching),在我看来,使用sqlite(或其他embedded式数据库)更有意义。

首先,我并不认为sqlite需要比XML更多的开销。 我的意思是开发时间开销和运行时间开销。 唯一的问题是,你有一个依赖于SQLite库。 但是既然你会需要一些XML库,这没关系(我假设项目是在C / C ++)。

sqlite优于xml的优点:

  • 一切都在一个文件中,
  • 随着caching变大,性能损失低于XML,
  • 您可以将Feed元数据与caching本身(其他表)分开,但可以以相同方式访问,
  • 对于大多数人来说,SQL可能比XPath更容易使用。

sqlite的缺点:

  • 可能会有多个进程访问相同的数据库(可能不是你的情况)的问题,
  • 你至less应该知道基本的SQL。 除非在caching中会有成千上万的项目,否则我不认为你需要优化它,
  • 也许从某种angular度来看,从安全angular度来看可能更危险(SQL注入)。 另一方面,你不是编码的Web应用程序,所以这不应该发生。

其他的东西可能都是相同的。

总结一下,分别回答你的问题:

  1. 你不会知道,除非你testing你的具体应用程序的两个后端。 否则,这只是一个猜测。 这两个caching的基本支持不应该是一个代码问题。 然后基准和比较。

  2. 由于XML文件的组织方式,sqlitesearch应该总是更快(禁止某些不重要的情况,因为它非常快)。 在XML中加速search将需要索引数据库,在你的情况下,这将意味着cachingcaching,不是一个特别好的主意。 但是使用sqlite,你可以将索引作为数据库的一部分。

我有这方面的经验。 我在一个项目中工作,我们最初使用XML存储所有数据,然后转移到sqlite。 每种技术都有很多优点和缺点,但是性能导致了转换。 这是我们观察到的。

对于小型数据库(几兆或更小),XML要快得多,而且更容易处理。 我们的数据自然是以树的forms存在的,这使得XML更具吸引力,而XPATH允许我们在一条简单的线上进行许多查询,而不必走一条血统树。

我们在Win32环境下编程,并使用标准的Microsoft DOM库。 我们将所有的数据加载到内存中,将其parsing为一棵dom树并在内存中进行search,添加,修改。 我们会定期保存数据,并且需要旋转副本以防机器在写入过程中崩溃。

我们还需要用C ++树形图手工build立一些“索引”。 当然这对于sql来说是微不足道的。

请注意,文件系统上的数据大小比“内存”dom树小2-4倍。

当数据达到10M-100M时,我们开始出现真正的问题。 有趣的是,在所有数据大小下,XML处理要比sqlite快得多(因为它在内存中,而不是在硬盘上)! 问题实际上是双重的 – 首先,加载时间真的开始变长。 我们需要等待一分钟左右,才能将数据存入内存中,并且制作地图。 当然,一旦加载程序是非常快的。 第二个问题是,所有这些记忆都被捆绑在一起。 只有几百兆的系统在其他应用程序中将无反应,即使我们跑得非常快。

我们实际上正在研究使用基于文件系统的xml数据库。 有几个开源版本的XML数据库,我们尝试了它们。 我从来没有试过使用商业XML数据库,所以我不能评论他们。 不幸的是,我们永远无法获得XML数据库的工作。 即使数百兆的XML填充数据库的行为花了几个小时….也许我们正在使用它不正确。 另一个问题是这些数据库相当重量级。 他们需要Java并拥有完整的客户端服务器架构。 我们放弃了这个想法。

然后我们find了sqlite。 它解决了我们的问题,但在一个价格。 当我们最初插入sqlite时,内存和加载时间的问题都没有了。 不幸的是,由于现在所有的处理都是在硬盘上完成的,所以后台处理的负担就变得很大了。 虽然之前我们甚至从来没有注意到CPU负载,现在处理器的使用情况是如此之快。 我们需要优化代码,仍然需要将一些数据保存在内存中。 我们还需要将许多简单的XPATH查询重写为复杂的多查询algorithm。

所以这里是我们学到的东西的总结。

  1. 对于树数据,使用XPATH查询和修改XML更容易。

  2. 对于小数据集(小于10M),XML在性能上吹走了sqlite。

  3. 对于大型数据集(大于10M-100M),XML加载时间和内存使用率成为一个大问题,导致一些计算机无法使用。

  4. 我们无法得到任何开源的XML数据库来解决与大型数据集相关的问题。

  5. SQLITE没有XML DOM的内存问题,但是在处理数据方面一般比较慢(在硬盘上,而不是在内存中)。 (注意,sqlite表可以存储在内存中,也许这会使其速度更快……我们没有尝试这个,因为我们想从内存中获取数据。)

  6. 在表中存储和查询树数据并不令人愉快。 但是,pipe理交易和索引部分弥补了这一点。

不要忘记,你有一个伟大的数据库在你的指尖:文件系统!

很多程序员忘记了一个体面的目录文件结构是:

  1. 这真快
  2. 它是便携式的
  3. 它有一个微小的运行时间足迹

人们正在讨论将XML文件拆分成多个XML文件…我会考虑将您的XML分成多个目录和多个纯文本文件。

搏一搏。 它令人耳目一新。

我不会使用XML来存储RSS项目。 Feed阅读器在接收数据时不断更新。

使用XML,您需要首先从文件加载数据,parsing数据,然后将其存储起来以便于search/检索/更新。 听起来像一个数据库…

另外,如果你的应用程序崩溃会发生什么? 如果使用XML,则XML文件中的数据与内存中的数据处于什么状态。 至less在SQLite中你得到了primefaces性,所以你可以确信你的应用程序将以最后一次数据库写入时的状态开始。

当您需要将数据从您的应用程序移动到其他位置或在应用程序之间共享信息时,XML最适合用作交换格式。 数据库应该是几乎任何规模的应用程序的首选存储方法。

  1. 将XML用于应用程序应该知道的数据 – configuration,日志logging以及不需要的数据。
  2. 使用数据库(oracle,SQL服务器等)来处理用户直接或间接与真实数据交互的数据
  3. 如果用户数据更像是一个序列化的集合,比如大量的文件及其内容或者电子邮件的集合等,那么使用SQLite。SQLite擅长这一点。

取决于数据的种类和大小。

XML何时应该用于数据持久性而不是数据库? 几乎从不。 XML是一种数据传输语言。 查询速度慢,parsing速度慢。 parsingXML(不要撕碎它!)并将结果数据转换为域对象。 然后坚持域对象。 数据库持久化的一个主要优点是SQL,它意味着非结构化查询和对常用工具和优化技术的访问。

对我来说真的取决于你在做什么,有多less用户/进程需要同时访问它们等等。

我一直使用大型的XML文件,但他们是单一进程,导入样式项目,多用户或性能不是真的需要。

这真的是一个平衡。

如果任何时候你需要扩展,使用数据库。

XML适用于存储不完全结构化的数据,您通常希望与其他应用程序交换数据。 我更喜欢使用SQL数据库来处理数据。 XML容易出错,因为您可能会因数据本身中的拼写错误或遗漏而导致细微的错误。 一些开源应用程序框架使用太多的xml文件来进行configuration,数据等。我更喜欢在SQL中使用它。

既然你问了一个经验法则,我会说,如果你要设置一次,而不是访问/search很多,使用基于XML的应用程序数据,configuration等。 对于主动search和更新,最好使用SQL。

例如,Web服务器将应用程序数据存储在XML文件中,而您并不需要执行复杂的search,更新文件。 Web服务器启动,读取XML文件和多数民众赞成在。 所以XML在这里是完美的。 假设你使用像Struts这样的框架。 一旦开发和部署应用程序,就需要使用XML和动作configuration。 所以再次,XML文件是一个好方法。 现在,如果你的Struts开发的应用程序允许广泛的search和更新,删除,那么SQL是最佳的方式。

在OffCourse中,您肯定会遇到一个或两个组织中的开发人员,他们只会吟诵XML或SQL,并宣称XML或SQL是唯一的出路。 注意这样的人,做你的应用程序的“感觉”是正确的。 不要只是遵循“技术宗教”。

想想你需要多久更新一次数据,多久你需要search数据。 然后你将得到你的答案 – XML或SQL。

我已经切换到SQLite,我感觉好多了,知道它在数据库中。

还有很多其他的好处:

  • 添加新项目非常简单
  • 按多列sorting
  • 使用唯一索引删除重复项

我已经创build了2个视图,一个用于未读项目,一个用于所有项目,不确定这是否是视图的最佳使用,但我真的想尝试使用它们。

我也使用StopWatch类对xml和sqlite进行了基准testing,并且sqlite速度更快, 不过这可能只是我parsingxml文件的方法不是最快的方法

  1. 小#项目和大小(25项,30kb)
    • 〜1.5毫秒的sqlite
    • 〜8.0毫秒xml
  2. 大件物品(700件,350kb)
    • 〜20毫秒的sqlite
    • 〜25毫秒xml
  3. 大文件大小(850项,1024kb)
    • 〜45毫秒的sqlite
    • 〜60毫秒xml

我同意@Bradley。

XML非常慢,作为存储格式不是特别有用。 何必? 你会使用文本编辑器手动编辑数据吗? 如果是这样的话,与YAML相比,XML 仍然不是一个非常方便的格式。 像SQlite这样的东西,查询更容易编写,而且有一个定义好的API来获取数据。

如果你需要在程序之间发送数据,XML是很好的。 但是出于效率的考虑,您应该在发送的时候生成XML,并在接收时将其parsing为“真实数据”。

所有这些意味着你的问题是“何时数据库的开销是合理的”是没有意义的。 与SQlite相比,XML总是有更高的开销。 (像MSSQL这样的全function数据库比较重,特别是在pipe理开销方面,但这是一个完全不同的问题。)

XML可以以文本和二进制文件格式存储。

如果您的主要目标是让计算机有效地读取/写入文件格式,则应使用二进制文件格式。

数据库是一种易于使用的存储和维护数据的方式。 它们不是存储二进制文件格式数据的最快方法。

内存数据库/数据库types可以加快速度。 Sqlite有这个选项。

这听起来像是为你做的最好的方法。

我的意见是,你应该使用SQLite(或其他适当的embedded式数据库),只要你不需要纯文本文件格式。 请注意,这是一个很大的例外。 有许多场景需要纯文本文件格式,或者受益于纯文本文件格式。

就开销而言,SQLite编译为像普通标志一样的250 k。 许多XMLparsing库比SQLite大。 使用XML您不会获得并发性收益。 SQLite的二进制文件格式将支持更有效的写入(主要是因为你不能附加到格式良好的XML文件的末尾)。 即使读取数据,其中大部分我假设是相当随机的访问,将会更快使用SQLite。

而最重要的是,您可以获得像事务和索引这样的SQL的好处。

编辑:忘记提及。 SQLite的一个好处(与许多数据库相反)是它允许任何列中的任何行中的任何types。 基本上,对于SQLite,就数据types而言,您可以获得与XML相同的自由。 这也意味着您不必担心对文本列进行限制。

您应该注意到,许多大型关系数据库(Oracle和SQLServer)具有XML数据types来将数据存储在数据库中,并在SQL语句中使用XPath来访问该数据。

另外,还有一些本地XML数据库,它们的工作方式与SQLite非常相似,它们是一个包含文档集合的二进制文件(大致可以是表格),那么您可以在单个文档或整个集合上使用XPath / XQuery。 因此,对于XML数据库,您可以执行如下操作:将date数据作为单独的XML文档存储在集合中…因此,当您处理今天的数据时,您只需要使用该文档。 但是写一个XQuery来找出那个人的文档集合的历史数据。 油滑。

我已经使用了Berkeley XMLDB(现在由Oracle支持)。 还有其他的,如果你search谷歌的“原生XML数据库”。 我没有看到用这种方式存储/检索数据的性能问题。

XQuery是一个不同的野兽(但是值得学习),但是你可能只需要稍微修改就可以使用你当前使用的XPath。

数据库是你程序的一部分。 如果查询数据是您业务逻辑的一部分。 XML是最好的文件格式,特别是如果你的数据格式是:

1,Hierarchal
2,可能以未猜测的方式改变未来
3,数据寿命比程序长

我说这不是数据大小的问题,而是数据types的问题。 如果您的数据是结构化的 ,请使用关系数据库。 如果您的数据是半结构化的 ,那么使用XML或 – 如果数据量真的变得太大,则使用XML数据库。

如果你的search去分贝。 你可以将xml文件分割成多个目录,以方便查找,但是pipe理开销很容易变得很重。 你还可以获得更多的不仅仅是性能与SQL DB …