SQLite与文本文件数据库 - 大小比较?

3

我要将一个文本文件转换成SQLite数据库形式; 我担心以下几点,因为需要付出努力来编写代码:

  • 文本文件和它对应的SQLite数据库文件大小是否相同?
  • SQLite占用的空间是否比文本文件少?
  • 还是文本文件数据库是最小的?

如果您选择使用SQLite,那么可能会对"调整SQLite数据库以获得最佳压缩"这篇文章感兴趣。 - undefined
3个回答

7

"硬件很便宜" - 我强烈建议不要担心大小差异,因为这可能无关紧要,并且选择最符合您其余需求的解决方案。对于简单项目,文本文件可以很好地工作,但数据库具有更多功能,可以帮助您更有效地组织、备份和查询数据。

如果您想更深入地了解两种选项的优缺点,请查看:数据库 vs. 平面文件


是的,谢谢。实际上,我只是为了优化和高效查询需要获取文本文件的数据库版本。 - undefined

5

需要注意以下事项:

(关于此答案的说明:这里的“文件”指的是内部/外部存储,而不是SharedPrefs)

SQL:

  • 数据库有一些额外开销,会占用空间
  • 如果数据库或表损坏,所有数据都将丢失(这对您的应用程序来说有多糟糕取决于情况。失去数千张图片: 很糟糕。失去删除日志: 不是很糟糕)
  • 数据库可以被压缩(请参见 这里
  • 如果出现 ID(或任何用于标识行 X 的方式)的问题,您可以将数据拆分到不同的表中,这意味着一个数据库可以为每个对象拥有多个表,其中对象 X 与对象 Y 存在标识冲突。这基本上意味着您可以将所有内容保存在一个文件中,并仍然避免名称冲突。 (请阅读答案底部的更多信息)

文件:

  • 每个文件都必须定义为自己的单独文件,这会占用空间(文件名)
  • 如果不设置高级读取器来确定不同类型的数据,您无法将所有属性存储在一个文件中。如果不这样做,并且每个属性都有一个文件,则会使用大量空间。
  • 读取数千行可能会很慢,特别是如果您有几个(比如100+)非常大的文件

操作系统为每个文件使用空间,不包括内容。例如文件名称,它占用空间。但要记住的一点是,您可以将应用程序的所有数据保存在单个文件中。如果有两种不同类型的对象可能存在命名冲突的应用程序,则可以创建一个新的数据库。


命名冲突

假设您有两个对象,对象 X 和 Y。

情况1'

对象 X 存储两个变量。文件名分别为(x 和 y 是此例中的坐标):

x.txt
y.txt

但在后续版本中,对象Y带有相同的两个文件。因此,您需要为对象X和Y分配一个ID:

0-x.txt
0-y.txt

每个文件名(包括扩展名)都独占3个字符,总计7个字符。当设置越复杂时,文件名就变得越长。请参见场景2。
但是,在数据库中保存后,您只需要获取ID为0的行并查找列X或Y,无需担心文件名。
此外,如果每个对象都保存了大量文件,则对于加载或保存每个文件的引用将占用大量空间。这会影响您的APK文件,并将其逐渐推向50MB限制(Google Play限制)。
您可以创建通用的方法,但使用SQL也可以在APK文件中节省空间。但与文本文件相比,SQL确实可以在名称方面节省一些空间。
请注意,如果您只保存2-3个文件(仅作为数量),那么名称上的几个字节并不重要。
当您开始保存数百个文件以避免命名冲突时,这就是使用SQL节省空间的时候了。如果表太大,您可以进行压缩。您可以压缩文本文件来节省一些空间,但对于单行文件,可节省的空间有限。 场景2 X和Y对象各有三个子对象。
每个子对象都有3个变量保存到文件系统中。如果只有一个对象有3个子对象,则可以像这样保存它们。
[id][variable name].txt

但是由于有另一个拥有3个相同类型子元素(并保存相同文件)的父级,最后保存的子元素会被保留。前三个将被覆盖。

因此,您必须添加父级ID:

[parent ID][child ID][variable name].txt

请注意,这些示例仅关注少量对象。虽然节省的空间很少,但当您保存数百甚至数千个文件时,才真正开始节省空间。
现在,如果您创建一个表格,可以将主要对象(在此示例中为X和Y)存储在其中。然后,您可以以一种使其可识别对象是父对象还是子对象的方式创建第一个表格,或者您可以创建第二个表格。第二个表格具有两个ID值;一个用于标识父对象,另一个用于标识子对象。因此,如果您想找到对象436的所有子项,只需编写此查询:
SELECT * FROM childrentable WHERE `parent_id`='436'

这将为所有以对象436作为父级的子级提供所有属性。

当返回时,所有信息都存储在游标中。

如果您使用文件执行相同操作,此行(其中Saver是保存和加载文件的类):

Saver.load("0-436-file_name", context);

当然,可以使用for循环来遍历子元素的ID(从头开始的0),但您还必须保存有多少子元素:您无法轻松获取文件,因此必须存储关于对象数量和其子元素的值。
这意味着您需要在更多文件中保存更多的值,以便能够获得您首先保存的文件。而这种方式非常困难。使用数据库可以帮助您不必编写文件来跟踪保存了多少文件,数据库每次查询会返回[x]个结果。所以如果对象436没有子元素,则SQL返回0行。但是在文件中,您必须将0保存为子元素的数量。猜测文件名会导致I/O异常。

1
我希望文本文件更小,因为它没有额外开销:所有数据库提供的功能都需要占用空间。听起来对你来说只有空间是最重要的,并且你期望经常更改文本文件的内容(称其为“文本文件数据库”)。请注意,“文本文件数据库”并不存在。与正确的数据库(如SQLite)相比,读写速度会非常慢。添加不同的记录类型(数据库中的表)将使您的生活更加复杂,我不想尝试在文本文件中维护任何引用链接之类的东西。希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接