将平台配置存储在数据库或文件中会更好吗?

Pav*_* K. 25 database configuration file

目前我们正在开发一个应用程序,我们使用数据库表来存储平台设置,如最大文件大小,最大用户数,支持电子邮件等.

这意味着每次我们添加平台设置时,我们都必须在此表中添加一列.

在我之前的项目中,我习惯将这些信息存储在文件中.

什么是更好/更快的方法?

ps,我几乎肯定有人已经有这样的问题,但我似乎无法找到它

Gre*_*ech 38

我们将配置设置存储在键/值类型表中,例如:

CREATE TABLE Configuration.GlobalSettings
(
    SectionName VARCHAR(50),
    SettingName VARCHAR(50),
    SettingValue VARCHAR(1000),
    SettingType TINYINT
);
Run Code Online (Sandbox Code Playgroud)

SectionName&SettingName是主键,我们只是拆起来更容易查询什么是一节,并允许各个部分装载到处理器,而不是一次装载一大堆.这SettingValue是一个字符串,然后SettingType是一个鉴别器,它告诉我们应该如何解释设置值(例如1 = string,2 = bool,3 = decimal等).

这意味着您不必更改新设置的表结构,只需在部署脚本中添加新结构或在您设置这些内容的任何位置.

我们发现配置比文件更好,因为这意味着您可以在需要时通过管理界面轻松地以编程方式更改配置值,这可以强制执行每个设置的逻辑.你不能用文件这么容易地做到这一点(当然,这是可能的).

  • 您好,我知道这是一篇非常旧的帖子,但是为什么在将配置保存到文件中时更改配置值并不容易?通过属性/首选项,实际上很容易做到这一点,还是我错过了一些东西? (2认同)
  • 如果您拥有一台或两台服务器,则属性文件非常有用-在数十台服务器上进行部署时,它的乐趣就更少了…… (2认同)
  • 是的.世界在5年内发生了很大的变化. (2认同)

Jé *_*eue 14

我可以告诉你,当我在许多站点管理一个特别大的应用程序时,保持本地文件的配置是一个彻头彻尾的痛苦.通常情况下,配置被读取和缓存,并且在运行期间无法更改,其他人具有横向扩展系统,其中配置需要反复更改和退回.

如果设计人员只保留数据库中的系统属性,那么在系统环境实现期间,我的生活将会轻松10%.

  • +1并没有大幅夸大这种方法提供的更容易的百分比. (13认同)

z5h*_*z5h 10

为什么每次都有新栏目?为什么不只有2列:NAME和VALUE.

我们所做的是在文件中设置默认值,然后在需要时根据部署覆盖数据库中的默认值.

此外,就速度而言,我们缓存配置(能够触发重新加载).每次需要属性时重新读取配置是没有意义的.所以在速度方面,它并不重要.你做了一次.


K2s*_*2so 10

这真的取决于你的应用程序.

将设置存储在数据库中有几个优点:

  1. 安全性 - 用户可以轻松更改文件中的设置或覆盖内容.
  2. 对于分发 - 可以更新相同的设置并将其加载到网络上的任何计算机上.

缺点:

  1. 依赖于数据库连接
  2. 从数据库读取时的开销

存储文件优势:

  1. 快速,易于阅读和修改.

缺点:

  1. 如上所述的安全问题.
  2. 可能需要对敏感数据进行加密.
  3. 版本控制很困难,因为您必须为不同版本创建单独的文件.

这意味着每次添加平台设置时我们都要在此表中添加一列 - 具体取决于您使用的数据库,但您可以将整个设置存储为XML(SQL服务器允许这样),这样您就可以了每次添加设置时都不需要改变表模式; 您需要做的就是修改XML,向其添加元素或从中删除元素.

但最终,你必须自己决定,每个人都没有更好或更糟.

  • -1.我认为这里的信噪比非常低.许多观点都没有意义.就像"从数据库中读取时的开销".什么开销?几毫秒?阅读配置一次.并"依赖于数据库连接".应用程序的其余部分也是如此.那么你是说在数据库中存储XML"文件"?有什么优势?和文件版本控制.文件版本控制很简单,任何版本控制系统都可以.数据库版本控制是一个更难的问题. (16认同)
  • 不要读一次配置!不允许运行时更改? (5认同)
  • Sry,让我澄清一点:1.应用程序不必依赖任何数据库连接,它只是问题中提到的一个选项.2. XML允许封装层次结构信息,而不仅仅是平键,值对表.3.版本控制 - 我想你是对的,容易的还是困难的,取决于你如何设置它,所以我会同意你.4.开销 - 读一次配置,是的,我想,但你可能也想做更新并重新加载有时更新或获得更新的配置; 就像我说的,这取决于整个架构. (3认同)

ste*_*lin 5

公平地说,答案并非如此简洁明了.

上面的答案似乎没有考虑需要在不同环境中部署的应用程序,即:dev,qa,staging,prod.

他们也没有考虑版本配置的重要性,即知道谁改变了什么,何时何地.

所有现代框架都提供了一种获取特定环境的正确配置的方法,通常是通过环境变量.

每个环境都有自己的配置,请考虑symfony布置其配置文件的方式:

your-project/
?? app/
?  ?? ...
?  ?? config/
?     ?? config.yml
?     ?? config_dev.yml
?     ?? config_prod.yml
?     ?? config_test.yml
?     ?? parameters.yml
?     ?? parameters.yml.dist
?     ?? routing.yml
?     ?? routing_dev.yml
?     ?? security.yml
?? ...
Run Code Online (Sandbox Code Playgroud)

出于这些原因,我当然更喜欢文件中的配置.

我的2美分.

  • @MehdiFracso - 您是正确的,动态配置通常存储在数据库中。即使在这种情况下,也有一种解决方法可以提供更大的灵活性。在我当前维护的 Laravel 应用程序中,默认设置位于 yml 文件中(每个环境都相同),并且可以通过 ui 表单覆盖,其值保存在 DB 中并覆盖默认设置。这允许在配置文件中设置变量,甚至在部署时通过 ENV 变量设置它们(如果需要),并在最终用户需要时通过 UI 覆盖它们。 (2认同)