在数据库上存储设置

时间:2013-12-26 02:32:20

标签: java sql database-design language-agnostic

我正在我的程序中编写一个模块,需要配置要运行的设置。我的客户已要求公司范围内的设置为全球。这意味着设置需要一个中心位置(所有设置都是int)。

我们确实有一个存储其他数据的数据库,所以我的第一个想法就是在数据库上创建一个表。但这可能涉及一个严格的1行表,其中包含非常特定的预设列或两列表,每行都是设置标识符。

基本上,根据我目前的方法,表格看起来像这样:

Settings Table
-------------------------------------------------------
| setting_1 (int) | setting_2 (int) | setting_3 (int) |
|-----------------|-----------------|-----------------|
|             440 |              7  |               0 |
-------------------------------------------------------

或者像这样:

Settings Table
------------------------------------------
| setting (varchar) |       value (int)  |
|-------------------|--------------------|
|       'setting_1' |                440 |
|-------------------|--------------------|
|       'setting_2' |                  7 |
|-------------------|--------------------|
|       'setting_3' |                  0 |
------------------------------------------

虽然数据库肯定能够做到这一点,但在我看来,这似乎不属于数据库的目的。我认为可能有更好的解决方案。

那么,您认为这种方法最好吗?或者有更好的选择吗?

我正在使用Java,但我可以预见到与语言无关的解决方案。

2 个答案:

答案 0 :(得分:0)

尽管我一般不喜欢这种方法,但您的第二种方法 - 也称为EVA - 是进行数据库范围设置的方法。

这样,只要有新的值(或属性)添加,就可以使用插入表将行添加到表中。

第一种方法要求每次添加新属性时更改设置表的结构,这不是一个好主意。

EVA方法的缺点是将为所需的每个字段进行数据库访问(除非您希望一次读取所有行),而使用普通表,可以一次访问所有必需字段。这可能是也可能不是问题。

答案 1 :(得分:0)

这里没有单一的事实,所以最好写出一个优点/缺点列表:

选项#1

优点:

  • 很简单;所有设置都可以加载到一行。
  • 它是可扩展的;它支持多种列类型。
  • 支持默认值;未指定时,每列可以有自己的默认值。

缺点:

  • 它(有点)有限;一张桌子只能"只有#34;每行有64K的数据; - )

选项#2

优点:

  • 它可以容纳几乎任意数量的选项,因为表中可以容纳多行。
  • 它不需要ALTER TABLE语句来添加或删除选项;然而,这通常不是一个优势,因为它通常会由管理员执行。

缺点:

  • 需要检查多行并将其构建到数据结构中。
  • 固定值类型;每种值类型都需要一个新表或每个设置多个列。
  • 不支持默认值;您需要单独存储此元信息。

<强>替代

您可以考虑使用配置文件;保持这个文件在多个服务器上保持同步可以使用Puppet,Chef等软件完成。