配置存储设置 [文件 vs. 数据库]

14

我看到程序员把很多可以放在数组文件中的信息存储到数据库中。他们会使用许多SQL表,而不是数组,我认为这样做更慢。

CitrusDB 在数据库中有一张叫做 "holiday" 的表。该表只包含一个日期列,名为 "holiday_date",用于存储节假日日期。这个想法是让用户向表中添加节假日信息。我所在的工作场所中 Citrus 和我一起工作的程序员们喜欢将所有这些信息都存储在表中,因为这是“标准”的。

除非你允许用户通过用户界面添加假期,否则我不明白为什么会这样。我有一种感觉自己漏掉了什么。


也许你可以将其重新命名为“配置存储设置[文件 vs.数据库]” - Patrick
其他人已经提供了很好的答案。我只想提出这个建议。将您的假期列表存储在数据库中可以更轻松地进行交叉引用。例如,给定一个论坛,生成在假期上发布过帖子的所有用户的列表。如果您的列表在文件中,您需要每次读取文件然后查询数据库。如果这样做1000次、100,000次,文件I/O将成为瓶颈。而SQL连接/查询/子查询/视图/存储过程可以优化以扩展规模。 - Nasir
举个具体的例子,假设你想要国际化。如果你的假期是硬编码到脚本中的,那么现在你就有了一个问题。如果使用数据库,只需添加一个“国家”列并从中选择即可。哦,还有管理这个东西——大多数情况下,应用程序用户!=应用程序管理员!=应用程序开发人员,一旦你的公司超过5个人。此外,新的/弃用的假期(如果你需要跟踪2009年的*这一天是假期,但在2011年的同一天不是假期),或者在一年中的不同日期发生的假期(例如复活节)。 - Piskvor left the building
9个回答

6
有时您希望在产品中设计一些灵活性。如果您的产品在不同的国家发布并有不同的假期,只需调整表格即可使一切正常运作。如果它被硬编码到应用程序中,或更糟糕的是,在应用程序的许多不同位置中进行硬编码,那么您可能会在尝试在新的区域设置中运行应用程序时遭受无尽的痛苦。
通过使用表格,还可以有一种单一的方式来访问此信息,这可能使程序更加一致和易于维护。
有时效率/速度并不是设计的唯一动机。可维护性,灵活性等也是非常重要的因素。

1

我发现将“配置”存储在数据库中,而不是在属性文件或充满数组的文件中,主要优势在于数据库通常是集中存储的,而服务器可能经常分布在数百台甚至数百台服务器的农场中。

在企业环境中,我已经实施了这样的解决方案,能够在单个访问点更改配置的强大功能,知道它将立即传播到所有服务器,而不必担心部署过程,这实际上非常强大,我们已经非常依赖它。


我也相信很多可以部署到共享主机环境的PHP项目在没有.htaccess魔法的情况下存储配置文件会存在安全问题,因此将它们存储在数据库中会更简单。 - Patrick

1
一些节日的实际日期每年都会变化。使用查询或脚本更新节日的灵活性使其放入数据库成为最简单的方法。当国家或地区的节日存储在数据库中时,可以轻松实现每年更新节日的脚本。

0
通常,应用程序数据应存储在某种存储中(而不是平面文件)。 配置/设置可以存储在KVP存储中(例如Redis),然后通过REST API访问它。

0

从理论上讲,数据库的设计和调整旨在提供比从文件读取磁盘更快的数据访问。但实际上,对于小到中型应用程序来说,这种差异微不足道。然而,最佳实践通常是针对较大规模的。通过在您的小型应用程序中实施最佳实践,您可以创建一个能够扩展的应用程序。

还有考虑到项目其他方面的数据可访问性。基于Web的应用程序中的大多数数据在哪里?在数据库中。因此,我们尝试将所有数据保留在数据库中,或者尽可能多地保留。这样,在将来,如果您决定现在需要再次加入假期日期和事件列表(例如),所有数据都在一个地方。这种分割不同层创建了应用程序内的层。当每个层可以专门处理其域内的角色时(数据库处理数据,HTML处理演示文稿等),再次更改或扩展应用程序就更容易了。

最后,在设计应用程序时,必须考虑“被公交车撞到原则”。所以,开发者'A'将假期放在一个PHP文件中。你知道它们在那里,当你处理代码时,它不会创建问题。然后...你被公交车撞了。你不能工作了。开发者'B'来了,现在你的老板想要更改假期日期 - 我们不再放假总统日了。嗯。下一个人完全不知道你的PHP文件,所以他必须挖掘。在这个例子中,听起来有点琐碎,也许有点傻,但是我们总是以可扩展性为设计标准。即使你知道它不会扩展。这些标准使其他开发人员更容易接手你的工作,如果你离开的话。

0
答案涉及许多领域。我曾经编写自己的软件来读写自己的平面文件数据库格式。对于小型系统,字段较少,这可能是值得的。一旦你学会了SQL,即使是最小的事情,你也可能会使用它。
  1. 文件解析很慢。字符串读取器、字符比较、查找字符序列都需要时间。SQL数据库确实有文件,但它们被读取然后缓存,效率更高。

  2. 更新和保存数组需要您读取所有内容,重建所有内容,写入所有内容,保存所有内容,然后关闭文件。

  3. 选项:SQL具有许多内置功能,可以完成许多强大的操作,从排序到仅返回x到y的结果。

  4. 安全性

  5. 同步 - 假设您同时两次访问同一页。PHP将同时从您的平面文件中读取、处理和写入。它们将互相覆盖,导致数据丢失。

SQL提供的功能数量、易于访问、不需要编码的东西以及其他许多因素都有助于解释为什么硬编码数组不如好。


0

答案是这取决于你正在处理什么类型的列表。在这里,您的列表似乎由一组少量固定值组成。

出于许多有效的原因,数据库管理员喜欢针对枚举值创建值表。这有助于数据完整性以及处理 ETL 等方面,这些是您需要它的两个示例。

至少在 Java 中,对于这些短小而固定的列表,我通常使用 Enums。在 PHP 中,您可以使用 看起来是 PHP 中枚举的良好方法

这样做的好处是该值是内存查找,但仍然可以获得 DBA 关心的数据完整性。


0

如果你需要从10个信息中找到单个信息,无论是读取文件还是查询数据库都不会有明显的优势。但是,当你需要从数百或数千个数据中读取单个数据时,从数据库中读取具有明显的优势。与加载某个大小的文件并读取所有内容(需要时间和内存)不同,从数据库查询是快速的,并且返回您查询的确切内容。这类似于将数据写入数据库与文本文件-插入到数据库中仅包括您要添加的内容。而写入文件意味着读取整个内容并将它们全部写回。

如果你知道你正在处理非常少量的值,并且你知道该要求永远不会改变,请将数据放入文件中并读取它们。如果你不确定,不要自己给自己惹麻烦。使用数据库,您可能会未雨绸缪。


0
这是一个很大的问题。简短的答案是,永远不要将“数据”存储在文件中。
首先,您必须处理读/写文件权限问题,这会引入安全风险。
其次,您应该始终计划应用程序的增长。当“假日”数组变得非常大或需要扩展以包括假日类型时,您将希望它在数据库中。
我可以看到其他答案正在涌现,所以就此结束。

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