人们在数据库中存储应用程序配置数据的首选方法是什么?从我自己过去做过的事情来看,我使用了两种方法来做到这一点。

  1. 您可以创建一个表来存储键/值对,其中键是配置选项的名称,值是其值。优点是添加新值很容易,您可以使用相同的例程来设置/获取数据。缺点是您有非类型化数据作为值。
  2. 或者,您可以对配置表进行硬编码,其中每一列都是值的名称及其数据类型。这样做的缺点是设置新值需要更多的维护,但它允许您输入数据。

使用过这两种方法后,我更喜欢第一个选项,因为它的设置速度更快,但它的风险也更大,并且在查找数据时会(略微)降低性能。有人有任何替代方法吗?

更新

有必要将信息存储在数据库中,因为如下所述,可能存在需要以相同方式配置的程序的多个实例,以及可能使用相同值的存储过程。

有帮助吗?

解决方案

您可以展开选项1以获得第3列,从而提供数据类型。您的应用程序可以使用此数据类型列来转换值。

但是,如果配置文件不是一个选项,我会选择选项1。选项1的另一个优点是您可以将其读入Dictionary对象(或等效对象),以便在您的应用程序中轻松使用。

其他提示

由于配置通常可以存储在文本文件中,因此字符串数据类型应该足以存储配置值。如果您使用托管语言,则代码知道数据类型应该是什么,而不是数据库。

更重要的是,在配置时考虑以下事项:

  • 等级制度: :显然,配置将从层次结构中受益
  • 版本控制: :考虑能够回滚到在特定日期生效的配置的好处。
  • 分配: :有时,能够对应用程序进行集群可能会很好。某些属性可能应该是集群中每个节点的本地属性。
  • 文档: :根据您是否有 Web 工具或其他工具,最好将有关属性的文档存储在靠近使用该属性的代码的位置。(代码注释对此非常有用。)
  • 通知: :代码如何知道配置存储库中的某处已进行更改?

就我个人而言,我喜欢一种相反的处理配置的方式,其中配置属性被注入到不知道值来自哪里的模块中。这样,配置管理系统可以非常复杂或非常简单,具体取决于您(当前)的需求。

我使用选项1。

将DB用于配置数据似乎有些过分。

编辑(抱歉评论框太长): 当然,对于如何实现程序的任何部分没有严格的规定。为了争论,开槽螺丝刀可以在一些飞利浦螺丝上工作!我想在得知你的情景之前我判断得太早了。

关系数据库在海量数据存储方面表现优异,可以快速存储,更新和检索,因此如果您的配置数据不断更新和读取,那么一定要使用db。

db可能有意义的另一种情况是,当您有一个服务器场,您希望数据库存储您的中央配置时,但是您可以使用指向xml配置文件的共享网络驱动器执行相同操作。

当您的配置采用分层结构时,XML文件会更好。您可以轻松地组织,定位和更新您需要的内容,为了获得额外的好处,您可以通过版本控制配置文件以及源代码!

总而言之,这完全取决于配置数据的使用方式。

我对您的申请知之甚少,以此结论。我相信你能做出正确的决定。

我想这更像是一次民意调查,所以我会说列方法(选项2)。但是,这取决于您的配置更改频率,动态程度以及数据量等等。

我当然会将这种方法用于用户配置/偏好等。

我的项目使用包含四列的数据库表:

  1. ID [PK]
  2. 范围(默认“应用程序”)
  3. 环境
  4. 价值

范围为“应用程序”的设置是全局设置,例如最大同时用户数。

每个模块都有自己的范围;因此我们的 ResultsLoader 和 UserLoader 具有不同的范围,但都有一个名为“inputPath”的设置。

默认值要么在源代码中提供,要么通过我们的 IoC 容器注入。如果数据库中没有注入或提供值,则使用代码中的默认值(如果存在)。因此,默认值永远不会存储在数据库中。

这对我们来说效果很好。每次备份数据库时,我们都会获得一份配置副本,这非常方便。两者始终保持同步。

选择选项2。 选项1实际上是一种在数据库之上实现数据库的方法,这是一个众所周知的反模式,从长远来看,这只会给你带来麻烦。

我至少可以想到两种方式:

(a)使用key,string-value,date-value,int-value,real-value columns创建一个表。将未使用的类型保留为NULL。

(b)使用XML,YAML或JSON等序列化格式,并将其全部存储在blob中。

您在哪里存储应用程序连接数据库所需的配置设置?

为什么不在那里存储其他配置信息?

我会选择选项1,除非配置选项的数量非常小(七个或更少)

在我的公司,我们正在努力使用选项一(简单的字典表)。我们允许使用包含要替换的config变量名称的标记进行字符串替换。

例如,表可能包含行('数据库连接字符串','jdbc://%host%...')和('host','foobar')。使用简单服务或存储过程层封装它可以实现极其简单但灵活的递归配置。它支持我们需要多个独立环境(dev,test,prod等)。

我过去曾经使用过1和2,我认为它们都是糟糕的解决方案。我认为选项2更好,因为它允许输入,但它比选项1更难看。我遇到的最大问题是对配置文件进行版本控制。您可以使用标准版本控制系统合理地对SQL进行版本化,但合并更改通常会产生问题。如果有机会这样做“正确”,我可能会创建一堆表,每个类型的配置参数一个(不一定是每个参数本身),从而获得键入的好处和键的好处/适当的价值范式。您也可以通过这种方式实现更高级的结构,例如列表和层次结构,然后由应用程序直接查询,而不必加载配置,然后以某种方式在内存中进行转换。

我投票选项2.易于理解和维护。

选项1适用于易于扩展的中央存储位置。除了RB,Hugo和elliott等人提出的一些重要建议之外,您还可以考虑:

包含带有用户字段的全局/用户设置标志,甚至包括用户/机器字段(用于特定于机器的UI类型设置)。

当然,这些可以存储在本地文件中,但是由于您无论如何都在使用数据库,这使得这些可用于在调试时对用户进行别名 - 如果错误设置相关,这可能很重要。它还允许管理员在必要时管理setings。

我在SQL Server中使用了选项2和XML列的混合。 您可能还想添加一个检查约束来将表保持在一行。

CREATE TABLE [dbo].[MyOption] (
  [GUID] uniqueidentifier CONSTRAINT [dfMyOptions_GUID] DEFAULT newsequentialid()  ROWGUIDCOL NOT NULL,
  [Logo] varbinary(max) NULL,
  [X] char(1)  CONSTRAINT [dfMyOptions_X] DEFAULT 'X' NOT NULL,
  CONSTRAINT [MyOptions_pk] PRIMARY KEY CLUSTERED ([GUID]),
  CONSTRAINT [MyOptions_ck] CHECK ([X]='X')
)

对于与任何db表无关的设置,如果需要db来处理值,我可能会选择EAV方法。否则序列化字段值是好的,如果它实际上只是应用程序代码的商店。

但是,单个字段的格式如何存储数据库使用的多个配置设置?

类似于每个用户一个字段,其中包含与其留言板视图相关的所有设置(如默认排序顺序,被阻止的主题等),也可能是另一个具有所有主题设置的字段(如文本颜色,bg颜色等) 。)

在关系数据库中存储层次结构和文档是疯狂的。首先,您要么必须粉碎它们,只是在稍后阶段重新组合它们。或者在BLOB内部,甚至更愚蠢。

不要将关系数据库用于非关系数据,该工具不适用。考虑像MongoDB或CouchDB这样的东西。无架构的无关系数据存储。如果它以任何方式连接到客户端,则将其存储为JSON,将XML用于服务器端。

CouchDB为您提供开箱即用的版本。

除非您有充分的理由,否则不要将配置数据存储在数据库中。如果你有充分的理由,并且绝对肯定你会这样做,你应该将它存储为数据序列化格式,如JSON或YAML(不是XML,除非你真的需要一种标记语言来配置你的应用程序 - - 相信我,你不要)作为一个字符串。然后你就可以读取字符串,并使用你工作的任何语言的工具来阅读和修改它。使用时间戳存储字符串,并且您有一个简单的版本控制方案,能够在非常简单的系统中存储分层数据。即使您不需要分层配置数据,至少现在如果您将来需要它,您也不必更改配置界面来获取它。当然,你失去了对配置数据进行关系查询的能力,但是如果你存储那个多的配置数据,那么你可能无论如何都在做一些非常错误的事情。

公司倾向于在数据库中存储他们系统的大量配置数据,我不知道为什么,我认为这些决定并没有多想。在OSS世界中,我没有经常看到这种事情。即使是需要大量配置(如Apache)的大型OSS程序也不需要连接到包含apache_config表的数据库。在应用程序中处理大量配置是一个糟糕的代码气味,将数据存储在数据库中只会导致更多问题(如此线程所示)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top