为什么要使用数据库而不是仅将数据保存到磁盘?


193

我没有将数据库序列化为JSON,而是在必要时将其保存并加载到磁盘上。所有数据管理都是在程序本身上进行的,比使用SQL查询更快,更容易。因此,我从不了解为什么根本需要数据库。

为什么要使用数据库而不是仅将数据保存到磁盘?


61
如果在应用程序中管理数据的关系实际上比在数据库中进行数据管理(我很难相信)要快,那么您需要阅读SQL和数据库规范化。您所经历的很可能是设计糟糕的数据库的副作用。
扬尼斯

68
在您描述的场景中,您不需要数据库,因为您的数据集很小。数据库用于更复杂的数据集,如果您所做的全部工作都已阅读并显示列表,则您的方法有效。
扬尼斯

16
您会遇到什么比赛条件,您准备好了吗?您想扩展到单个Web服务器吗?如果服务器出现故障,您的备份计划是什么?如果您拥有数据库,那么您对所有这些问题的答案可能会更好。另外,如果您曾经不了解如何使用数据库,我的猜测是您会发现“比使用SQL查询更容易”应该修改为“如果不了解SQL,则比使用SQL查询更容易”。
btilly

37
数据库仍然将数据存储到磁盘。这仅仅是将结构化数据存储到文件的系统的自然发展的最终结果。如果您打算使用文件来存储结构化数据,则可能会发现自己正在重新发明数据库中已经开发的功能。那么,为什么不从一开始就使用数据库呢?
本尼迪克特

13
根据项目的发展方式,您可能会发现自己必须处理并发访问和回滚之类的事情。他们听起来微不足道,但事实并非如此。当您完成解决它们的时间时,您会发现您基本上已经编写了一个数据库。您是否真的想从事数据库业务或其他业务?
jwernerny

Answers:


280
  1. 您可以查询数据库中的数据(询问问题)。
  2. 您可以相对快速地从数据库中查找数据。
  3. 您可以使用JOIN将两个不同表中的数据关联在一起。
  4. 您可以从数据库中的数据创建有意义的报告。
  5. 您的数据具有内置结构。
  6. 给定类型的信息始终仅存储一次。
  7. 数据库是ACID
  8. 数据库是容错的。
  9. 数据库可以处理非常大的数据集。
  10. 数据库是并发的;多个用户可以同时使用它们而不会破坏数据。
  11. 数据库扩展性很好。

简而言之,您将受益于各种各样的非常聪明的人多年来开发的各种知名的,经过验证的技术。

如果您担心数据库过大,请查看SQLite。


21
6.归一化,7.请参见链接,8.读懂容错。哦,在您沉迷于NoSQL热潮之前,请了解SQL数据库。以自己的方式了解他们。你会明白的。如果您只是在谈论简单的配置数据,那么可能就需要JSON。但是除了程序设置外,还有许多其他类型的数据。
罗伯特·哈维

25
至于让两个程序同时编辑数据并不安全,那就是为什么存在数据库的部分原因。如果您有此需求(以及我提到的其他一些或全部需求),您将很高兴不必重新发明所有这些。
罗伯特·哈维

23
@Dokkat没必要,什么都没有。如果您的方法适合您,则一定要这样做。但是我应该提到,大多数半个体面的rdbms支持基于内存的存储,您可以在应用唤醒时将所需的所有内容加载到内存中(就像您已经做的那样),并像典型数据库一样查询它们(保留所有罗伯特提到的好处) )。
扬尼斯,2013年

28
换句话说,有时您需要一个帐篷,但有时您需要一所房子,而盖房子与投球帐篷完全不同。
罗伯特·哈维

49
@Dokkat当人们指的是崩溃时,它们的意思是……在编写“数据库”文件的过程中,CPU炸毁了一半。现在会发生什么?您的文件很可能已损坏/无法读取(至少,它可能不再符合您自己的格式),并且您需要从备份中恢复(而大多数“真实”数据库只会丢失最后一个事务)。当然,您可以编写代码来使其处理。然后,您可以为所有其他内容编写代码。然后您意识到您已经花了6个月的时间来编写DB,而您一开始就可以使用它,而付出的努力很少。
Daniel B

200

尽管我同意罗伯特所说的一切,但他没有告诉您何时应该使用数据库,而不是仅仅将数据保存到磁盘。

因此,除了Robert关于可伸缩性,可靠性,容错性等方面所说的以外,还请考虑其他内容。

对于何时使用RDBMS,需要考虑以下几点:

  • 您具有关系数据,即您有一个购买产品的客户,而这些产品有一个供应商和制造商
  • 您拥有大量数据,并且需要能够快速找到相关信息
  • 您需要开始担心先前发现的问题:可伸缩性,可靠性,ACID合规性
  • 您需要使用报告或情报工具来解决业务问题

至于何时使用NoSQL

  • 您有许多需要存储的非结构化数据
  • 可扩展性和速度需求
  • 通常,您不需要预先定义架构,因此,如果您有变更的要求,这可能是个好主意。

最后,什么时候使用文件

  • 您拥有文件系统可以处理的合理数量的非结构化数据
  • 你不在乎结构,关系
  • 您无需担心可伸缩性或可靠性(尽管可以完成这些操作,具体取决于文件系统)
  • 您不希望或无法处理数据库将增加的开销
  • 您正在处理文件系统中的结构化二进制数据,例如:图像,PDF,文档等。

14
+1,我认为重要的是您指出了有时文件实际上适合存储。
GrandmasterB

15
您可以在第三个列表中添加另一个示例:当数据实际上文件时,例如,上传的图像,pdf文档等。看起来似乎很明显,但是我确实看到无缘无故将图像存储在数据库Blob中的情况。
Goran Jovic

5
嗯,从来没有明确提及它是一个Web应用程序,但是我确实是从JSON注释中推断出来的。但是,有时只有少数人会使用某些东西,因此您可以证明应用程序的范围是合理的,不必担心可伸缩性和可靠性。我的意思是,不必担心群集和冗余之类的事情。
2013年

8
@GoranJovic有时很有意义。在目录中存储10,000多个图像,某些文件系统将停止运行-DB可能比手动子目录分区方案更容易。
马丁·贝克特

2
@MartinBeckett:过去十年中哪个文件系统?
Eamon Nerbonne

55

似乎没有人提到的一件事是记录索引。目前您的方法还不错,我认为您的数据集非常小,访问它的人很少。

随着变得越来越复杂,您实际上正在创建一个数据库。无论您要调用它什么,数据库只是存储在磁盘上的一组记录。无论您是要创建文件还是MySQLSQLite或正在创建文件的文件,它们都是数据库。

您所缺少的是数据库系统中内置的复杂功能,这些功能使它们更易于使用。

我想到的主要内容是索引。好的,因此您可以在序列化数组或JSON字符串中存储10或20甚至100或1000条记录,并将其从文件中拉出并相对快速地进行迭代。

现在,假设您有10,000、100,000,甚至1,000,000条记录。当有人尝试登录时,您将不得不打开一个现在大小为数百兆字节的文件,将其加载到程序的内存中,取出大小相似的信息数组,然后迭代数十万条记录,以便找到您要访问的一条记录。

适当的数据库将使您能够在记录中的某些字段上建立索引,从而即使具有巨大的数据集,也可以查询数据库并非常快速地收到响应。将其与Memcached之类的东西,甚至是自制缓存系统相结合(例如,将搜索结果存储在单独的表中10分钟,并加载这些结果,以防其他人不久之后搜索相同的东西),以及您将获得快速的查询,而当您手动读取/写入文件时,使用如此大的数据集将无法获得这些查询。

与索引松散相关的另一件事是信息传递。如上所述,当您拥有数百或数千兆的文件时,必须将所有这些信息加载到内存中,然后手动对其进行迭代(可能在同一线程上),然后处理您的数据。

对于数据库系统,它将在自己的线程上运行,甚至在自己的服务器上运行。在程序和数据库服务器之间传输的所有内容都是一个SQL查询,而向后传输的所有内容都是您要访问的数据。您没有将整个数据集加载到内存中-发送和接收的所有内容仅占总数据集的一小部分。


1
1.请不要将所有用户信息加载到客户端代码中!(我敢肯定这只是一个例子)2.首先从100兆MB的大文件加载文件需要一段时间。3.您的例子是正确的,但是它假设您只会按用户名进行搜索。如果要存储有关用户的更多数据会怎样?例如年龄。现在,您要搜索20至30岁之间的所有用户。甚至更简单,当您的json如下时,按地址查找用户:{login:{pass:pass,add1:“ 123 sasd”,city:“ Wherever”}}。
Thomas Clayson

2
您的最后一点可能是正确的,但是我可能会使用旧数据-特别是,如果我打开程序,加载当前数据库,然后5分钟后其他人登录并编辑内容,那么我的数据库现在是更高版本,直到我退出程序,然后重新启动。如果然后编辑数据库并再次保存,我将覆盖其他用户所做的任何更改。当您拥有用户的数据库时,这可能只是更改密码而已。如果两个用户在其他会话期间更改了密码,则一个用户的更改将被撤消。
Thomas Clayson

4
在搜索了一些有关索引的内容之后,我学到了很多东西。确实很启发。现在,数据库变得更有意义了。还有一些我不理解的事情,但这是一个很大的进步。感谢您的回答!
MaiaVictor

4
关于索引,不,数据库不会自动为所有索引。只有很少的东西会自动建立索引,而其余的则需要明确的“请创建索引”。索引将搜索减少到对数时间O(log(n)),这比常数稍慢。
Orionii皇帝

1
担心基于散列的实现与基于b树的实现之间的区别是过早的优化。如果数据在索引中,它仍然比从磁盘读取数据快十几倍。
SilverbackNet

14

当您拥有简单的数据(例如,在问题的注释中描述的事物列表)时,SQL数据库不会给您太多帮助。许多人仍在使用它们,因为他们知道随着时间的推移数据会变得更加复杂,并且有许多库使处理数据库变得不容易。

但是,即使您加载了一个简单的列表,将其保存在内存中,然后在需要时写入,仍然会遇到许多问题:

异常终止程序可能会丢失数据,或者在将数据写入磁盘时出了点问题,最终您可能会杀死整个文件。您可以滚动自己的机制来处理此问题,但是数据库会使用久经考验的技术为您处理此问题。

如果您的数据开始变得太大而又更新太频繁,则序列化所有数据并保存将是一项巨大的资源消耗,并使所有操作变慢。您必须开始研究如何对事物进行分区,因此它不会那么昂贵。数据库经过优化,可以以容错的方式仅将更改的内容保存到磁盘。它们也是经过设计的,因此您可以在任何给定时间快速加载所需的少量数据。

另外,您不必使用SQL数据库。您可以使用NoSQL的 “数据库”,很多都可以使用,只是使用JSON来存储数据。但这是通过容错方式完成的,并且可以在多台计算机之间智能地拆分,查询和智能拆分数据。

另外,有些人把事情混在一起。他们可能使用像Redis这样的NoSQL数据存储来存储登录信息。然后使用关系数据库在需要执行更多有趣查询的地方存储更复杂的数据。


12

我看到许多答案都集中在并发性和可靠性问题上。数据库除了并发性,可靠性和性能外,还提供其他好处。它们允许不理会如何在内存中表示字节和字符。换句话说,数据库允许程序员专注于“什么”而不是“如何”。

答案之一提到查询。“询问SQL数据库问题”随着问题的复杂性很好地扩展。随着代码在开发过程中的发展,诸如“获取全部”之类的简单查询可以轻松扩展为“在property1等于该值的情况下获取所有内容,然后按property2进行排序”,而不必担心程序员会为这种查询优化数据结构。通过为特定属性建立索引,可以提高大多数查询的性能。

其他好处是关系。使用查询,可以更交叉地交叉引用来自不同数据集的数据,然后再进行嵌套循环。例如,在一个系统中,用户和帖子是不同的数据集(或数据库表或JSON对象)的系统中,从少于3个帖子的用户中搜索所有论坛帖子,可以在不牺牲可读性的情况下进行一次查询。

总而言之,如果数据量很大(假设有1000个以上的对象),SQL数据库比普通数组更好,那么数据访问就非常简单,并且不同部分的代码可以访问不同的数据子集。


对于您可以忽略事物的表示方式的想法,我有点怀疑。虽然您可以忽略这一点,但是如果这样做,尤其是。如果您确实编写了稍微复杂的查询,则您的应用程序极有可能无法扩展。“添加索引”并不总是可能的-您需要对写的内容进行抗衡,而对于复杂性跨越多个表的查询,它根本无济于事。当需要索引,这意味着您已经失去了交互式查询的优势,因为只有特定结构的查询才能在合理的时间内响应。
Eamon Nerbonne

12

TLDR

听起来您已经为应用程序做出了本质上有效的短期数据存储技术决策-您选择编写自定义数据存储管理工具。

您坐在一个连续体上,可以选择向任一方向移动。

从长远来看,您很可能(几乎可以肯定,但不是100%)会遇到麻烦,并且最好改用现有的数据存储解决方案。您将不得不处理一些特定的,非常常见的,可预测的性能问题,并且最好使用现有工具,而不要自己动手使用。


听起来您已经编写了(小型)自定义数据库,该数据库已内置到应用程序中并直接由应用程序使用。我假设您依靠操作系统和文件系统来管理实际的磁盘写入和读取,并将该组合视为数据存储。

什么时候做什么

您正坐在最佳位置进行数据存储。操作系统和文件系统数据存储极为方便,可访问且可跨平台移植。这种组合已经存在了很长时间,您肯定可以在几乎所有标准部署配置上获得支持并运行您的应用程序。

这也是编写代码的简单组合-该API非常简单明了且基本,并且只需花费很少的代码即可使其正常工作。

通常,理想的情况是在以下情况下完成自己的工作:

  • 制作新想法的原型
  • 在性能上构建不太可能需要扩展的应用程序
  • 受异常情况(例如缺乏用于安装数据库的资源)的约束

备择方案

您处于一个连续的选项中,您可以从此处获得两个“方向”,我认为是“向下”和“向上”:

这是最不可能应用的选项,但出于完整性考虑,在此处提供此选项:

如果需要,您可以关闭,也就是说,完全绕开OS和文件系统,并直接从磁盘真正读写。此选择通常仅在需要极高效率的情况下才有意义-例如,考虑最小/最小的MP3播放器设备,没有足够的RAM来运行完整的OS,或者诸如Wayback Machine之类的设备,它们需要非常高效的质量数据写入操作(大多数数据存储在较慢的写入与较快的读取之间进行权衡,因为这是几乎所有应用程序的绝大多数用法)。

这里有几个子类别-但是,它们并不是完全排他的。有些工具可以同时使用这两种工具,每种工具都提供某些功能,有些工具可以完全从一种模式转换为另一种模式,有些可以彼此叠加,从而为应用程序的不同部分提供不同的功能。

功能更强大的数据存储

您可能会发现自己需要存储越来越多的数据,同时仍然依靠自己的应用程序来管理数据操作的复杂性。您可以使用各种键值存储,并在不同程度上支持相关功能。NoSQL工具以及其他工具都属于此类别。

当以下内容描述您的应用程序时,这是扩大规模的明显途径:

  • 读取内容异常繁重
  • 您可以以较低的(短期)一致性保证权衡较高的性能(许多提供“最终一致性”)。
  • 是“直接”管理大多数数据操作和缺乏一致性(实际上,起初您可能最终会使用第三方工具,尽管最终您会将其引入应用程序或自定义的书面中间层中) 。
  • 您希望通过“相对简单”的数据操作需求来大规模扩展存储的数据量和/或搜索数据的能力。

这里有一些摆动的空间-您可以强制提高读取一致性,以降低读取速度。各种工具和选项提供数据操作api,索引和其他选项,它们或多或少适合于轻松编写您的特定应用程序。因此,如果以上几点几乎完全描述了您的应用程序,则您可能“足够接近”以使用功能更强大的数据存储解决方案。

著名示例:CouchDBMongoDBRedis,云存储解决方案(如Microsoft的Azure,Google App Data Store和Amazon的ECE)。

更复杂的数据处理引擎

与纯存储引擎相比,“ SQL”数据存储应用程序家族以及其他一系列应用程序被更好地描述为数据处理工具。它们提供了广泛的附加功能,不仅是数据存储,而且通常还超出了键值存储方面的可用功能。在以下情况下,您将采用此路径:

  • 您绝对必须具有读取一致性,即使这意味着您会受到性能上的打击。
  • 您正在寻找有效执行高度复杂的数据操作的方法-考虑非常复杂的JOIN和UPDATE操作,数据多维数据集和切片等...
  • 您可以权衡以牺牲性能为代价(考虑强制性的,固定的数据存储格式,例如表格,这些表格不能轻易和/或有效地更改),您可以。
  • 您有足够的资源来处理通常更复杂的工具和界面集。

这是数据库或数据存储的一种更“传统”的思维方式,并且已经存在了很长的时间-因此,这里有很多可用的方法,并且通常要处理很多复杂性。尽管这需要一些专业知识和知识,并且有可能构建简单的解决方案/避免很多复杂性,但您仍然有可能最终会使用第三方工具和库来为您管理其中的大部分内容。

众所周知的示例是MySQLSQL Server,Oracle的数据库和DB2

外包工作

有几种现代的第三方工具和库,它们相互之间插入数据存储工具和应用程序之间,以帮助您管理复杂性。

他们试图一开始拿走管理或操作数据存储的大部分或全部工作,并且理想情况下,仅当需要时,您才能顺利地过渡到复杂性。这是企业家精神和研究的活跃领域,最近的一些成果可立即获得和使用。

MVC工具(DjangoYii),Ruby on RailsDatomic是著名的示例。这里很难做到公平,因为实际上有数十种工具和库充当各种数据存储区API的包装器。


PS:如果您喜欢视频而不是文本,则可能要观看Rich Hickey的一些数据库相关视频;他很好地阐明了选择,设计和使用数据存储的大部分想法。


11

文件系统符合NoSQL数据库的描述,因此我想说,在决定如何存储数据时,您绝对应该考虑使用该文件系统,而不仅仅是为了RDBMS而随意使用它,就像这里给出的一些答案一样。

文件系统(通常是NoSQL)的一个问题是处理数据之间的关系。如果这不是这里的主要阻碍因素,那么我想暂时跳过RDBMS。还请记住使用文件系统作为存储的积极方面:

  • 零管理
  • 低复杂度,易于设置
  • 适用于任何操作系统,语言,平台,库等
  • 目录只有配置设置
  • 微不足道的测试
  • 使用现有工具进行检查,备份,修改等都很简单
  • 良好的性能特征,并通过操作系统进行了很好的调整
  • 易于任何开发人员理解
  • 没有依赖关系,没有额外的驱动程序
  • 安全模型很容易理解,并且是操作系统的基础部分
  • 数据无法从外部访问

来源


10

文件系统是一种数据库。也许不是像其他所有人都在谈论的RDBMS,但是从最严格的意义上讲,肯定是DB。您将提供用于查找数据(文件内容)的键(文件名),该文件具有抽象的存储空间和用于程序通信的API。

因此,您正在使用数据库。其他帖子可以争论不同类型的数据库的优点...


1
数据库和存储不能真正互换使用。数据库是一种存储,但是文件系统当然不是数据库的类型
Gaz_Edge 2013年

3
“存储”是保存位和字节的位置。数据库不一定使用文件系统上的文件。从严格意义上讲,文件系统绝对是数据库的一种。
克里斯S

6
对于那些主张在数据库中无用的人来说,就是使用数据库。是。向他们解释他们的论点是基于错误的先入为主的观念似乎很有帮助。一旦他们对初始状况有了更好的了解,我们就可以帮助他们在对现有技术有更全面的了解的情况下前进。文件系统是分层数据库,有充分的理由说明关系和对象数据库系统已取代它们,因为它们具有更快,更好的组织性和更有效的数据存储/检索功能。
克里斯S

2
@Gaz_Edge数据已存储在一堆文件中,这些文件的结构和内容均由OP的应用程序管理,因此该数据已经处于效率低下的“数据库”中。试图让OP理解并接受是使他们了解“真实”数据库系统用例的有用的第一步;一旦他们了解到某种形式的“数据库”正在发生,就比谈论让应用程序自行完成工作更容易开始讨论结构合理和托管的服务在哪里更有效。我建议这个答案确实有帮助。
罗伯·摩尔

8

如果您有多个进程(用户/服务器)修改数据,则需要一个数据库。然后,数据库用于防止它们覆盖彼此的更改。

当您的数据大于内存时,您还需要一个数据库。如今,有了可用的内存,确实的确使得许多应用程序中的数据库使用已过时。

您的方法肯定比废话“内存数据库”更好。实质上,这是您的方法,但是增加了很多开销。


老实说,我喜欢这个答案,并且希望这个答案是正确的,但是我不确定情况是否如此。例如,某些用户(和您)对内存提出了担忧。当然,如果要存储GB的数据,则无法将其全部保留在内存中。但是如果我确定数据永远不会那么大怎么办,我应该只使用内存吗?好吧,还有其他事情。例如,我了解了CouchDB的增量视图。与索引不同,这肯定是不容易实现自己的事情,并且在使用视图模型时肯定可以大大提高速度,
MaiaVictor 2013年

我想我是。例如,当我将数据从“玩家列表”转换为“排名”时,这只是地图归约操作。在创建游戏或交互式站点时,您呈现的几乎所有内容都是来自核心数据的mapReduce操作!因此,进行这种优化是非常可取的。好吧,我不知道我在说什么,但是那是有道理的。今天学到很多东西,我真的很喜欢NoSQL概念。感谢您的回答(:
MaiaVictor 2013年

7

您应该经常问自己一个特定的应用程序是否需要RDBMS。在设计过程中构建了太多应用程序,这些过程在开始时会自动采用所有必需的工具和框架。关系数据库是如此普遍,许多开发人员像以前一样处理类似的应用程序,因此在项目开始之前会自动将它们包括在内。许多项目可以解决这个问题,所以不要过于苛刻。

您没有任何项目就开始了项目,并且它可以正常工作。您无需等待SQL就可以轻松启动并运行它。没有什么不妥。

随着该项目的扩展和要求变得越来越复杂,某些事情将变得难以构建。在研究和测试替代方法之前,您如何知道哪个更好?您可以问程序员,并在火焰中除草,“这取决于”来回答这个问题。学习后,您可以考虑愿意用几种语言编写的几行代码来处理数据库的某些好处。在某个时候,您正在重新发明轮子。

容易往往是相对的。有些框架可以构建网页并将表单连接到数据库表,而无需用户编写任何代码。我想如果您用鼠标挣扎,这可能是一个问题。谁都知道,这不是可伸缩的,也不是灵活的,因为上帝禁止您将所有内容紧密地耦合到GUI。非程序员只是构建了原型;在这里可以找到很多YAGNI

如果您想学习由您选择的语言操纵的ORM而不是学习SQL,请继续学习,但是尝试安装,创建表并使用SQL将数据从流行的数据库中拉出(选择*从;不是令人着迷的东西)。这很容易做到。这就是为什么有人首先创建它们的原因。为了做出明智的决定,这似乎不是一笔巨大的投资。您可能也可以进行性能测试。


请注意,当我托管“ otserv”时,我实际上已经使用mysql多年了。你猜怎么了?它带来的只是问题。人们可以在注销时意识到自己的角色已保存,但在服务器崩溃时不能保存角色,因此可以使用肮脏的技巧“克隆”项目。对于otserv,这是一个严重的问题。otserv社区非常庞大。如果他们只是将数据存储在内存中并定期对其进行序列化,那将不会发生。因此,我自己修改了源代码,即那些长的C ++文件,并开始定期保存到mysql,而不是在字符注销时保存。你猜怎么了?太慢了!
MaiaVictor

Mysql根本无法每2分钟左右处理完全保存状态。很清楚何时进行保存-整个服务器“滞后”了一秒钟。现在,如果在此发布信息的人对此有一个答案,我将不胜感激!
MaiaVictor

1
不要用一个编码可能很差的应用程序来判断RDBMS。特别是在没有数据库经验的人进行支持数据库的修改时。
alroc 2013年

1
@Dokkat,我希望在将资金存入您的银行帐户与“定期”将帐户余额写入磁盘之间,不会有人拖拉电源线。您已经描述了保证数据丢失的体系结构。这对于某些应用程序来说很好,但是大多数数据库应用程序都使用户可以选择。您可以运行具有备份的单个数据库节点,并冒一些数据丢失的风险,如果单个节点发生故障,则可以使用复制来消除数据丢失。
mikerobi

@Dokkat,因此您不要使用MySql或任何其他功能齐全的“服务器”样式数据库。您使用Sqlite(或类似版本),它将每次都持久存储在磁盘上,同时为您提供嵌入应用程序中的数据库(因此无需单独安装),并且仍为您提供sql访问权限,事务完整性和磁盘持久性。
gbjbaanb

6

将数据保存到磁盘就是将其写入数据库,特别是如果您将每个对象放在其自己的文件中,并且文件名是记录的关键。为了最大程度地减少用于读取文件的查找时间,请根据密钥的前几个字符创建子目录。

例如key = ghostwriter将进入g / ho / stwriter.json或g / h / o / stwriter.json或g / ho / ghostwriter.json或g / h / o / ghostwriter.json。根据密钥的分配选择命名方案。如果它们是序列号,则5/4/3 / 12345.json优于其他方法。

那是一个数据库,如果它可以满足您的所有需求,那么就可以这样做。如今,它被称为NoSQL数据库,例如GDBM或Berkeley db。这么多的选择。首先弄清楚您需要什么,然后构建一个接口库来处理细节,也许是诸如get / set接口(如memcached或CRUD接口),然后,如果您需要更改数据库格式,则可以交换库。具有不同的特征。

请注意,某些SQL数据库(例如PostgreSQL和Apache Derby DB)将允许您在许多NoSQL格式(包括自己的本地数据库)上进行SQL查询。不确定MyBatis,但可能类似。

避免NoSQL炒作。阅读有关功能的信息,测试性能和功能,然后根据其与应用程序需求的匹配程度进行选择。

http://www.hdfgroup.org/HDF5/是人们并不经常考虑的另一种有趣且广泛使用的数据存储格式。


4

并发更新数据后,使用数据库的方法(很可能是内存数据库)可能会更正确,性能更高,同时代码也很容易,因为您根本没有担心并发更新,事务,缓存,异步I / O等。


使用进程内锁,而不是对获取一堆锁的数据库守护程序进行IPC,在进程内进行并发修改会更有效。但是您大概是在谈论修改数据的多个过程。
dhasenan

@dhasenan-这是好的数据库系统的另一个优点。您获得了并发性,并且它在所有情况下均适用:多线程,多进程,不同服务器上的多个客户端,或其任意组合。尽管在某些情况下,运行良好的多线程程序可能会“更高效”,但根本无法扩展。
Ingo 2013年

-5

您需要一个数据库来存储/检索QA,就像我们在此处发布的那样!一个简单的文件无法组织与不同主题相关的数据。


3
不,“主题”可以是文件夹,站点上的“帖子”可以是文件。绝对有可能在文件系统上运行这样的站点。它是有效的:缓慢而复杂的开发,运行查询,插入新的数据,等等
克里斯小号

慢+复杂=无法?
2013年

缓慢而复杂的构建!=缓慢而复杂的功能
joe 2013年

1
@joe,不能使用文件(也许不是“简单”文件,但这是什么意思?)来组织与不同主题相关的数据,这并不是真的。正如Dokkat建议的那样,您可以使用JSON,也可以使用XML,也可以使用混合记录的文件(如我们在XML以前的时代曾经使用过的文件),或者可以使用的任何文件格式。在大多数情况下,我都不会推荐任何一种方法,但这并不意味着它们无法完成。
John M Gant 2013年

@John M Gant:完全同意您的观点,数据库不能替换单个文件(因为您不喜欢简单的文件),反之亦然,因为汽车不能替换自行车。我说3种“人类”语言,而我选择的单词和词汇是我被误解的原因...我猜
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.