什么时候应该比从文本文件解析数据优先使用数据库?


13

我正在制作一个Python程序来测量codereview.SE的增长。我的方法是获取首页上显示的“网站统计信息”,并将其存储在我的硬盘上。我计划每天执行一次。到目前为止,我已经做了足够的工作来获取统计数据并将它们附加到文本文件中。可以在github上查看python脚本。我使用的格式如下

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

我只运行了两次脚本,以获取文件中要使用的格式。最初,这对我来说似乎很好,因为我可以自己存储它,而且格式是相同的,因此很容易解析,但是不确定。似乎在这里使用数据库应该更好,因为那样检索数据应该更容易。请注意,我从未使用过任何数据库,也不了解SQL,MySQL或RDBMS的任何其他变体。

因此,这使我想到了这个问题。什么时候应该首选数据库来存储数据而不是将数据存储在文本文件中?在决定是否需要数据库还是简单的文本文件时,是否可以找到一些指针?

PS:如果可以添加更好的标签,请这样做。我对可以添加的标签有些怀疑。


“在学习如何使用之前,每种工具都是一种责任。”
JeffO

1
数据库可能适合您的项目,也可能不合适。但是,您可能会发现使用更简单的格式会有所帮助。您可能会考虑使用Python的CSV模块标准。拥有CSV可以简化将数据导出到其他程序(例如-导出到电子表格中以便可以对其进行图形处理)的过程。
肖恩·麦克索明

Answers:


14

什么时候应该首选数据库来存储数据而不是将数据存储在文本文件中?

维基百科告诉我们数据库是有组织的数据集合。通过这种方式,您的文本文件一个数据库。它继续说:

通常以支持需要此信息的过程的方式来组织数据以对现实的相关方面进行建模。例如,以一种支持找到空缺酒店的方式对酒店房间的可用性进行建模。

这部分是主观的-它没有具体告诉我们应该如何对数据建模或需要优化哪些操作。文本文件由许多不同的记录组成,每天都有一个记录,因此您正在以与问题相关的方式对现实的一个方面进行建模。

我意识到,当您说“数据库”时,您可能会想到某种关系数据库管理系统,但是将文本文件视为数据库,就会使您的问题从“我何时应使用数据库?“我应该使用哪种数据库?” 从这种角度看待事物可以使答案更容易理解:当拥有的数据库不再满足您的要求时,使用更好的数据库。

如果您的Python脚本和简单的文本文件运行良好,则无需更改。每天只有一项新记录,并且计算机每年都在增长,我怀疑您当前的解决方案可能会长期可行。十年的数据量仅会给您3650条记录,这些记录一旦被解析,则可能需要不到75 KB。

想象一下,您决定将每天问的每个问题,何时问的问题记录在CodeReview上,而不是每天记录一个小记录。此外,您还将收集所有答案和相关的元数据。您可以将所有内容存储在文本文件中,但是平面文件将使您在需要时难以找到信息。数据太多,无法将整个内容读入内存,因此,每当要查找问题或答案时,都必须扫描文件,直到找到所需的内容。当您想查找给定用户提出的所有问题时,您必须浏览整个文件。如果要查找所有带有“错误”作为标记的问题,则必须扫描整个文件。

那太慢了,所以您可能决定通过建立一些索引来告诉您在文件中查找哪里以找到给定记录的方法来加快速度。您可以为问题建立索引,为用户建立索引,为答案建立索引,依此类推。当您想查找问题时,可以搜索(小得多)问题索引,在主数据文件中获取问题的位置,然后快速跳至文件中的正确位置。那将是一个很大的性能改进。确实,这几乎就是数据库管理系统。

因此,在需要时使用DBMS。当您有大量数据时,需要快速访问数据时,也许无法以一开始就完全可以预测的方式使用它。如果您具有彼此连接的不同类型的数据(不同类型的记录),请使用RDBMS,以便可以适当地关联各种记录。


3
“将文本文件视为数据库的想法发生了变化”非常有见地。另外,关于我只有3650个条目的部分很有帮助。它有助于获得对该问题的真实见解。
Aseem Bansal

1
答案被低估了,这是我第二次回到它的答案。
Hashim

6

数据库具有许多优点,但是使访问更容易并不是其中之一。更快,更标准化,可解释为嵌入式命令子语言,更安全,是的-但并不容易。无论您的语言和标准库提供多少语法糖,您都必须首先拥有一个数据库,打开它的连接,并从程序中路由完全不同的数据并返回。只要您的工作没有问题,并且编程的优先级是您的首要任务,就不要仅仅因为您认为这是“良好实践”就切换到数据库。

我认为何时进行转换是遵循历史发展。毕竟,人们在关系型数据库发明之前就将数据存储在文件中很长时间了,实际上,在此之前,人们发明了一大堆劣等的数据库模型(分层数据库,网络数据库...)。他们开始编写数据库,并在很显然这将节省大量的处理工作,提高可靠性(从总体上说从长远来看)时使用它们。只要您不是这种情况,并且您不希望很快就会成为现实,切换将是一项过度的工程。


根据整体设计,是否没有提供更好的凝聚力?例如,在我的情况下,我将存储与每个日期对应的5个值。在当前状态下,数据之间没有任何凝聚力。
Aseem Bansal

您是对的,确保所有记录具有一致的字段和值集是这些优点的另一个。(严格来说,只有关系数据库才能保证这一点。人们在生产中长期使用非关系数据库,并且随着“ NoSQL”运动的发展,他们现在再次受到关注。)
Kilian Foth,

3

当然,这将是一个判断性的决定,但是我要考虑的三个主要标准是:它是否需要符合ACID标准;数据的复杂程度;最后,需要多少内容来读写。只要您每个人只需读写一行,并且您的应用程序是唯一执行读写操作的应用程序,您就可以跳过数据库。一旦开始拥有多个应用程序,无论是读取还是写入,或者您的数据结构变得复杂(特别是如果它在单独的行之间具有关系),那么数据库就开始看起来非常吸引人。


“需要多少东西才能读/写它”-很有帮助。
Aseem Bansal

2

数据库不仅用于存储数据,而且用于处理和查询数据,因此您必须做出有根据的决定:

一个很大的因素是在计算机上安装数据库所带来的收益与其带来的功能

显然,如果您需要查询和操作数据,并且希望快速访问-另外,您可能正在考虑将数据库用于其他功能,那么这可能是个好主意。数据库存储模型允许非常快速地通过键值查找数据,我可以想象解析文件可能很慢(取决于您的操作方式)

如果您想尝试使用SQL及其功能,SQLFiddle.com可以提供几种不同的RDBMS模型,您可以在其中进行探索(运行查询,创建模式等)。


Python具有的内置标准库接口sqlite3。因此,安装数据库不是问题。我的考虑是,如果我继续存储数据,那么除非有某种索引,否则它可能会变慢。我认为数据库可以解决这个问题。我单独下载了sqlite3进行学习,发现使用数据库之前需要了解数据库模型,然后尝试了一下。我可以使用基于Internet的示例来学习sqlite3,但目前在学习数据库模型时遇到问题。然后我想到是否值得为此烦恼?
Aseem Bansal

2

与往常一样,是否使用数据库取决于您需要执行的操作。如果您有大量数据,并且需要对其执行许多不同的查询,则数据库可能会为您提供帮助。

在您的情况下,我会将存储保存在测试文件中,直到性能可以接受为止。通常,读取文本文件(甚至大)不会花费那么长时间。如果您需要更多,可以在以后随时添加数据库。

以我的经验,如果您是数据库的新手,则可以使用如下的沙发状数据库(例如:couchdb:http//couchdb.apache.org/),它更容易使用,它是非SQL语言,您可以直接使用javascript或python等进行查询。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.