人们首选的方法是将应用程序配置数据存储在数据库中。从我自己过去做过这个,我已经用了两种方法。
使用了两者之后,我的首选项就是第一个选项,因为它可以更快地进行设置,但是它的风险更高,并且在查找数据时可以(略微)降低性能。有没有人有任何替代方法?
更新
有必要将信息存储在数据库中,因为如下所述,可能有多个程序实例需要以相同的方式配置,以及可能使用相同值的存储过程。
答案 0 :(得分:21)
您可以展开选项1以获得第3列,从而提供数据类型。您的应用程序可以使用此数据类型列来转换值。
但是,如果配置文件不是一个选项,我会选择选项1。选项1的另一个优点是您可以将其读入Dictionary对象(或等效对象),以便在您的应用程序中轻松使用。
答案 1 :(得分:9)
由于配置通常可以存储在文本文件中,因此字符串数据类型应足以存储配置值。如果您使用的是托管语言,则代码应该知道数据类型应该是什么,而不是数据库。
更重要的是,请考虑以下配置:
就个人而言,我喜欢处理配置的倒置方式,其中配置属性被注入到不知道值来自哪里的模块中。这样,配置管理系统可能非常复杂或非常简单,具体取决于您(当前)的需求。
答案 2 :(得分:4)
将DB用于配置数据似乎有些过分。
编辑(抱歉评论框太长): 当然,对于如何实现程序的任何部分没有严格的规定。为了争论,开槽螺丝刀可以在一些飞利浦螺丝上工作!我想在得知你的情景之前我判断得太早了。
关系数据库在海量数据存储方面表现优异,可以快速存储,更新和检索,因此如果您的配置数据不断更新和读取,那么一定要使用db。
db可能有意义的另一种情况是,当您有一个服务器场,您希望数据库存储您的中央配置时,但是您可以使用指向xml配置文件的共享网络驱动器执行相同操作。
当您的配置采用分层结构时,XML文件会更好。您可以轻松地组织,定位和更新您需要的内容,为了获得额外的好处,您可以通过版本控制配置文件以及源代码!
总而言之,这完全取决于配置数据的使用方式。
我对您的申请知之甚少,以此结论。我相信你能做出正确的决定。
答案 3 :(得分:4)
我使用选项1。
答案 4 :(得分:3)
我想这更像是一次民意调查,所以我会说列方法(选项2)。但是,这取决于您的配置更改频率,动态程度以及数据量等等。
我当然会将这种方法用于用户配置/偏好等。
答案 5 :(得分:3)
我的项目使用包含四列的数据库表:
具有“应用程序”范围的设置是全局设置,例如最大并发用户数。
每个模块都有自己的范围;所以我们的ResultsLoader和UserLoader有不同的范围,但两者都有一个名为'inputPath'的设置。
默认值在源代码中提供或通过我们的IoC容器注入。如果未在数据库中注入或提供任何值,则使用代码中的缺省值(如果存在)。因此,默认值永远不会存储在数据库中。
这对我们来说非常好。每次我们备份数据库时,我们都会得到一份配置的副本,非常方便。两者总是同步。
答案 6 :(得分:2)
选择选项2。 选项1实际上是一种在数据库之上实现数据库的方法,这是一个众所周知的反模式,从长远来看,这只会给你带来麻烦。
答案 7 :(得分:2)
我至少可以想到两种方式:
(a)使用key,string-value,date-value,int-value,real-value columns创建一个表。将未使用的类型保留为NULL。
(b)使用XML,YAML或JSON等序列化格式,并将其全部存储在blob中。
答案 8 :(得分:0)
除非您有充分的理由,否则不要将配置数据存储在数据库中。如果你有充分的理由,并且绝对肯定你会这样做,你应该将它存储为数据序列化格式,如JSON或YAML(不是XML,除非你真的需要一种标记语言来配置你的应用程序 - - 相信我,你不要)作为一个字符串。然后你就可以读取字符串,并使用你工作的任何语言的工具来阅读和修改它。使用时间戳存储字符串,并且您有一个简单的版本控制方案,能够在非常简单的系统中存储分层数据。即使您不需要分层配置数据,至少现在如果您将来需要它,您也不必更改配置界面来获取它。当然,你失去了对配置数据进行关系查询的能力,但是如果你存储那个多的配置数据,那么你可能无论如何都做错了。
公司倾向于在数据库中存储他们系统的大量配置数据,我不知道为什么,我认为这些决定并没有多想。在OSS世界中,我没有经常看到这种事情。即使是需要大量配置(如Apache)的大型OSS程序也不需要连接到包含apache_config表的数据库。在应用程序中处理大量配置是一个糟糕的代码气味,将数据存储在数据库中只会导致更多问题(如此线程所示)。
答案 9 :(得分:0)
在关系数据库中存储层次结构和文档是疯狂的。首先,您要么必须粉碎它们,只是在稍后阶段重新组合它们。或者在BLOB内部,甚至更愚蠢。
不要将关系数据库用于非关系数据,该工具不适用。考虑像MongoDB或CouchDB这样的东西。无架构的无关系数据存储。如果它以任何方式连接到客户端,则将其存储为JSON,将XML用于服务器端。
CouchDB为您提供开箱即用的版本。
答案 10 :(得分:0)
对于与任何db表无关的设置,如果需要db来处理值,我可能会选择EAV方法。否则序列化字段值是好的,如果它实际上只是应用程序代码的商店。
但是,单个字段的格式如何存储数据库使用的多个配置设置?
类似于每个用户一个字段,其中包含与其留言板视图相关的所有设置(如默认排序顺序,被阻止的主题等),也可能是另一个具有所有主题设置的字段(如文本颜色,bg颜色等) 。)
答案 11 :(得分:0)
我在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')
)
答案 12 :(得分:0)
选项1适用于易于扩展的中央存储位置。除了RB,Hugo和elliott等人提出的一些重要建议之外,您还可以考虑:
包含带有用户字段的全局/用户设置标志,甚至包括用户/机器字段(用于特定于机器的UI类型设置)。
当然,这些可以存储在本地文件中,但是由于您无论如何都在使用数据库,因此在调试时这些可用于别用用户 - 如果错误设置相关,这可能很重要。它还允许管理员在必要时管理setings。
答案 13 :(得分:0)
我投票选项2.易于理解和维护。
答案 14 :(得分:0)
我过去曾经使用过1和2,我认为它们都是糟糕的解决方案。我认为选项2更好,因为它允许输入,但它比选项1更难看。我遇到的最大问题是对配置文件进行版本控制。您可以使用标准版本控制系统合理地对SQL进行版本化,但合并更改通常会产生问题。如果有机会这样做“正确”,我可能会创建一堆表,每种类型的配置参数一个(不一定是每个参数本身),从而获得键入的好处和键/值的好处适当的范例。您也可以通过这种方式实现更高级的结构,例如列表和层次结构,然后由应用程序直接查询,而不必加载配置,然后以某种方式在内存中进行转换。
答案 15 :(得分:0)
在我的公司,我们正在努力使用选项一(简单的字典表)。我们允许使用包含要替换的config变量名称的标记进行字符串替换。
例如,表可能包含行('数据库连接字符串','jdbc://%host%...')和('host','foobar')。使用简单服务或存储过程层封装它可以实现极其简单但灵活的递归配置。它支持我们需要多个独立环境(dev,test,prod等)。
答案 16 :(得分:0)
我会选择选项1,除非配置选项的数量非常小(七个或更少)
答案 17 :(得分:0)
您在哪里存储应用程序连接数据库所需的配置设置?
为什么不在那里存储其他配置信息?