在数组中存储静态数据,还是在数据库中存储?

10

在我们的基于Web的项目中,通常会有一些静态数据,可以将其存储为数组或存储在数据库表中。那么哪种方式应该被优先考虑呢?

我认为数组具有一些优势:

  1. 更加灵活(可以是任何结构,包括非常复杂的关系)
  2. 性能更好(它将被加载到内存中,与数据库的I/O操作相比,具有更好的读/写性能)

但是我的同事认为他更喜欢使用数据库方法,因为它可以保持统一的数据持久化接口,并且更加灵活。

那么哪种方法应该被优先考虑呢?或者我们如何进行选择?或者我们应该在某些情况下优先选择一种方法,在其他情况下选择另一种方法?这些情况是什么?

编辑:

让我澄清一些内容。正如Benjamin对标题进行的更改一样,我们想要存储在数组(文件)中的数据不会那么频繁地发生更改,这意味着代码不会在运行时更改数组的值。如果数据变化非常频繁,我肯定会使用数据库。这就是我发布这篇文章的原因。

有时候存储一些非常复杂的关系是比较困难的,例如:

Task = {
  "1" : {
    "name" : "xx",
    "requirement" : {
          "level" : 5,
          "money" : 100,
     }
   ...
 }

就像上面的代码示例(一个Python字典,或者你可以认为它是一个数组),需求字段很难存储在数据库中(直接将类似pickle对象的结构存储到数据库中?我认为这样不太好)。因此,在这种情况下,我更喜欢使用数组。

那么你的想法是什么?在这种情况下,我们应该选择数组而不是数据库,对吗?

谢谢。

6个回答

7

让我们实际一些:

  • 你是否在运行时写入数据?是:数据库,否:文件
  • 你是否每周更新数据超过一次?是:数据库,否:文件
  • 更新数据文件很麻烦吗?是:数据库,否:文件
  • 你经常读取这些数据吗?是:文件/缓存,否:数据库
  • 更新数据文件很麻烦并且需要额外的工具吗?是:数据库,否:文件

当然,我可能忘记了其他要点,但我想基础知识都在这里。


4
在文件中使用“灵活”数组已经存在着无数问题,这些问题可以通过使用数据库来解决。除非你能证明使用数据库会比其他方法慢得多,否则请使用数据库。继续前进并开始解决业务问题。
编辑
OP的评论询问使用文件的问题可能是什么,以下是其中一些问题(深呼吸):
并发性:您必须管理多个请求尝试写回文件的情况。这不太难,但它成为瓶颈。
性能:是的,在内存中修改数组更快,但如何确定需要将多少以及何时将数组持久化到文件中。请注意,使用数据库并不排除使用适当的内存缓存。每次进行小修改时都将文件写回不会表现得很好。
可扩展性:实际上是前两个功能。为了实现任何可扩展目标,您需要能够快速修改持久化数据的小部分。如果不使用数据库,则最终会编写一个。如果您发现需要多个Web服务器来支持不断增长的需求,那么您将在哪里存储文件?现在,您已经在网络上进行文件I / O(虽然可能是非常快的)。
结构:如果使用数组,则您的代码将负责管理数据的结构、查询等。您如何以比使用数据库更具有“灵活性”的方式做到这一点?需要各种选择和复杂性。
可靠性:您需要确保持久化数据的完整性。在某些故障的情况下,您的数组/文件代码需要确保数据至少不会那么损坏,以至于应用程序无法继续运行。

谢谢。那么文件的问题是什么?你能举个例子吗? - Zhu Tao
如果这些值是常量,那么它们的重要性就非常大。如果你谈论的是那些不经常变化的状态(比如康涅狄格州、纽约州等),内存解决方案可能更好。这真的取决于具体情况和你将如何使用它。 - Benjamin Oakes
嗨,安东尼。对于帖子中的混淆表示抱歉。我进行了一些澄清,所以在澄清后的情况下不会出现一些问题。还是非常感谢。 - Zhu Tao
问题要求“静态数据”,而你谈论的是更新数据。你的回答似乎回答了一般性的文件与数据库的问题,但问题是关于数组中的“静态数据”,而不是常规数据... - benjisail
@benjisail:的确,我的回复对评论的补充是比较笼统的,并非全部都是直接与数据缓慢移动有关的问题(虽然应该承认这些数据会发生变化,因此并非真正的“静态”)。但是,我仍然坚持我的最初的回答:除非有某些已经证实的理由不使用数据库,否则就使用它。 - AnthonyWJones

2

你的同事是正确的,但这时候你需要抛开计算机科学教科书,变得实用。你的应用程序会有多频繁地访问这些数据?如果非常频繁,那么不要承担访问开销的成本。你可以不从一个平面文件中读取,而仍然获得数据库的优势,在应用程序中使用缓存策略。根据你的开发语言,你可以考虑使用像memcache或jtreecache这样的东西。


谢谢。我们正在使用Python/Django。数据在服务器启动后将是静态的(这意味着我们可以手动更改数组,但不会经常发生)。因此,可能会出现另一个问题,即我是否可以缓存数组,这是我提出的新问题。http://stackoverflow.com/questions/1680349/do-we-need-cache-for-an-array - Zhu Tao

0

这取决于您要查看的数据类型以及是否需要定期更新。

我倾向于将大多数东西(非配置数据)保存在数据库中,即使数据不会重复(例如成千上万行)。如果系统开始快速增长,数据库比平面文件更容易扩展,否则您的平面文件可能会成为系统的负担。


0
如果数据不经常更改,而且你在使用Java编程,为什么不使用Spring来保存这些值呢?
它们可以被注入到你的bean中,并且很容易地进行更改。
但这只适用于你正在使用Java进行开发。

抱歉,我们不使用Java。我们使用Python代替。 - Zhu Tao

0

是的,我同意你暗示的评估,即数据库被过度使用,基本的平面文件可能适用于多种情况。如果您的应用程序是只读的(并且在应用程序重新启动时由管理员进行写入),我肯定会选择文件。即使应用程序以附加模式(而不是随机插入/更新)在一个线程中写入文件,我也会使用文件。其他任何情况——需要真正的数据库进行随机更新、查询、并发控制等。


有关更喜欢文件还是数据库的任何争论?因为我不是很清楚。 - Zhu Tao

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