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

为什么人们应该使用数据库而不是仅将数据保存到磁盘?

评论

如果在应用程序中管理数据的关系实际上比在数据库中管理数据的关系(我很难相信)要快,那么您需要阅读SQL和数据库规范化。您正在经历的最有可能是可怕设计的数据库的副作用。

在您描述的场景中,您不需要数据库,因为您的数据集很小。数据库是为更复杂的数据集而设计的,如果您所要做的只是阅读并显示列表,则您的方法有效。

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

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

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

#1 楼


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

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

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

评论


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

–罗伯特·哈维(Robert Harvey)
13年3月14日在3:04



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

–罗伯特·哈维(Robert Harvey)
13年3月14日在3:07

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

– yannis
13年3月14日在3:13



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

–罗伯特·哈维(Robert Harvey)
13年3月14日在3:13



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

–丹尼尔B
13年3月14日在6:44

#2 楼

尽管我同意罗伯特所说的一切,但他并没有告诉您何时应该使用数据库,而不仅仅是将数据保存到磁盘上。
因此,除了罗伯特所说的有关可伸缩性,可靠性和容错性的内容外,还请注意这一点。等。
关于何时使用RDBMS,需要考虑以下几点:

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

关于何时使用NoSQL的问题

您需要存储很多非结构化的数据
可伸缩性和速度需求
您通常不需要预先定义架构,因此,如果您有变化的需求,则可能会最好是

最后,什么时候使用文件

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


评论


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

–GrandmasterB
2013年3月14日4:13在

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

– Goran Jovic
13年3月14日在9:46

好的答案,但是Web应用程序何时至少不需要至少考虑可伸缩性呢?为何真正的应用程序都不需要考虑可靠性?

– John M Gant
13年3月14日在11:15

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

–山姆
13年3月14日在11:16

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

–马丁·贝克特(Martin Beckett)
13年3月14日在19:48

#3 楼

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

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

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

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

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

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

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

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

评论


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

–托马斯·克莱森(Thomas Clayson)
13年3月14日在9:33



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

–托马斯·克莱森(Thomas Clayson)
13年3月14日在9:37

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

–MaiaVictor
13年3月14日在10:06

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

– Orionii皇帝
13年3月14日在12:46

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

– SilverbackNet
13年5月18日在19:16



#4 楼

TLDR
听起来您已经为应用程序做出了本质上有效的短期数据存储技术决策-您选择编写一个自定义数据存储管理工具。
您正处于一个连续的过程中,具有多种选择
从长远来看,您很可能(几乎,但不一定100%)会遇到麻烦,最好改用现有的数据存储解决方案。您将不得不处理一些特定的,非常常见的,可预测的性能问题,并且最好使用现有工具,而不要自己动手使用。

听起来您已经写了一个(小型)自定义数据库,已内置到应用程序中并由应用程序直接使用。我假设您依靠操作系统和文件系统来管理实际的磁盘写入和读取,并将该组合视为数据存储。
何时做您做的事情
您坐在数据存储的最佳选择。操作系统和文件系统数据存储极为方便,可访问且可跨平台移植。这种组合已经存在了很长时间,您肯定可以在几乎所有标准部署配置上获得支持并运行您的应用程序。
这也是编写代码的简单组合-API非常简单-forward和basic,并且只需花费很少的代码即可使其起作用。
通常,在以下情况下,您最好做自己做的事:

制作新想法的原型
构建性能极不可能需要扩展的应用程序
受异常情况的约束,例如缺乏安装数据库的资源
替代方案
您处于连续状态选项,这里有两个“方向”,我认为是“下”和“上”:

这是最不可能应用的选项,但是它在这里为了完整起见:
您可以根据需要关闭系统,即完全绕开OS和文件系统,然后直接从磁盘真正读写。此选择通常仅在需要极高效率的情况下才有意义-例如,考虑最小/微小的MP3播放器设备,而没有足够的RAM来运行完整功能的OS,或诸如Wayback Machine之类的设备,它们需要非常高效的质量数据写入操作(大多数数据存储在较慢的写入与较快的读取之间进行权衡,因为这几乎是所有应用程序中绝大多数的常见用例)。
上层
这里有几个子类别-这些不是完全是独家的。有些工具可以同时使用这两种工具,每种工具都提供某些功能,有些工具可以完全从一种模式转换为另一种模式,有些可以彼此叠加,为应用程序的不同部分提供不同的功能。 >功能更强大的数据存储
您可能会发现自己需要存储越来越多的数据,同时仍要依靠自己的应用程序来管理数据操作的复杂性。您可以使用各种键值存储,并在不同程度上支持相关功能。 NoSQL工具以及其他工具都属于此类别。
当以下内容描述您的应用程序时,这是显而易见的扩展途径:

读取reliant异常繁琐
您可以权衡以更高的性能换取较低的(短期)一致性保证(许多提供“最终一致性”)。
可以“直接”管理大多数数据操作和缺乏一致性(实际上,您可以最初可能会最终使用第三方工具,尽管最终您会将其带入您的应用程序或自定义的书面中间层中。)
您正在寻求大规模扩展要存储的数据量和/或您具有“相对简单”的数据操作要求的搜索能力。

这里有一些摆动的空间-您可以强制提高读取一致性,以降低读取速度。各种工具和选项提供数据操作api,索引和其他选项,它们或多或少适合于轻松编写您的特定应用程序。因此,如果以上几点几乎完全描述了您的应用程序,那么您可能“足够接近”以使用功能更强大的数据存储解决方案。
著名的示例:CouchDB,MongoDB,Redis,云存储解决方案(例如Microsoft的Azure, Google App Data Store和Amazon的ECE。
更复杂的数据处理引擎
“ SQL”系列数据存储应用程序以及其他一系列应用程序比纯存储更好地描述为数据处理工具。引擎。它们提供了广泛的附加功能,除了数据存储之外,通常还超出了键值存储方面的可用功能。在以下情况下,您将采用这种方式:

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

这是更“传统”的思维方式数据库或数据存储的概念,并且已经存在了很长的时间-因此这里有很多可用的方法,并且通常要处理很多复杂性。尽管有可能需要一些专业知识和知识,并且可以构建简单的解决方案/避免了很多复杂性,但是您很有可能最终将使用第三方工具和库来为您管理大部分此类工具。
已知的示例是MySQL,SQL Server,Oracle的数据库和DB2。
外包工作
有几种现代的第三方工具和库,它们相互之间插在数据存储工具和应用程序之间,以帮助您管理复杂性。
他们试图一开始就拿走大部分或用于管理和操作数据存储的所有工作,并且理想情况下,仅当需要时,才允许您平稳地过渡到复杂性。这是一个活跃的企业家精神和研究领域,最近的一些成果可立即获得和使用。
著名的例子是MVC工具(Django,Yii),Ruby on Rails和Datomic。这里很难做到公平,因为实际上有数十种工具和库充当各种数据存储区API的包装器。

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

#5 楼

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

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

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

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

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

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

#6 楼

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

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


零管理
低复杂度,易于设置
与任何操作系统,语言,平台,库等
仅配置设置为目录
要测试的临时对象
要使用现有工具进行检查,备份,修改等的临时成员
良好的性能特征并由操作系统进行了很好的调整
任何开发人员都易于理解
没有依赖关系,没有额外的驱动程序
安全模型很容易理解,并且是操作系统的基本组成部分
数据不可从外部访问
>

#7 楼

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

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

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

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

评论


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

–Eamon Nerbonne
13年5月19日在7:42



@EamonNerbonne也许用RDBMS更好地表述,直到实际显示为现实问题之前,您都可以忽略东西的表示方式。只有当出现问题时,您才可以分析问题,并且在大多数情况下,解决方案将以仅添加一些放置良好的索引的形式进行,RDBMS的查询计划程序将在所有情况下利用该索引其他可能从中受益的操作,并进行更新。 OTOH,如果要使用文件系统编写自己的数据存储,则必须更新应用程序的其余部分。

– Lie Ryan
3月9日23:03

#8 楼

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

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

评论


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

–Gaz_Edge
13年3月15日在15:57

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

–克里斯S
2013年3月15日15:59

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

–克里斯S
2013年3月15日17:10



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

–罗布·莫尔
2013年3月17日10:29



#9 楼

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

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

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

评论


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

–MaiaVictor
13年3月14日在13:37

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

–MaiaVictor
2013年3月14日13:42



#10 楼

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

您在没有一个项目的情况下开始了您的项目,并且它可以正常工作。您无需等待SQL就可以轻松启动并运行它。这没什么不对。

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

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

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

评论


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

–MaiaVictor
13年3月15日在1:18

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

–MaiaVictor
13年3月15日在1:20

不要用可能编码不好的单个应用程序发生的情况来判断RDBMS。特别是在没有数据库经验的人进行支持数据库的修改时。

– alroc
2013年3月15日15:37

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

–mikerobi
13年5月18日在22:45



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

– gbjbaanb
13年5月19日在12:58

#11 楼

将数据保存到磁盘就是将其写入数据库,尤其是如果您将每个对象放在其自己的文件中,并且文件名是记录的键。为了最大程度地减少读取文件的查找时间,请根据密钥的前几个字符创建子目录。例如,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。有很多选择。首先弄清楚您需要什么,然后构建一个接口库来处理细节,也许是诸如memcached之类的get / set接口或CRUD接口,然后如果您需要更改一个库的格式,便可以交换库了。具有不同的特征。

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

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

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

#12 楼

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

评论


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

–dhasenan
13年3月15日在16:18

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

– Ingo
13年3月15日在21:16

#13 楼

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

评论


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

–克里斯S
13年3月15日在17:12

慢+复杂=无法?

– joe
13年3月15日在17:13

构建缓慢而复杂!=运行缓慢而复杂

– joe
13年3月15日在17:22

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

– John M Gant
13年3月15日在17:30

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

– joe
13年3月15日在17:38