如何存储配置?

use*_*103 5 php sql configuration

我正在创建一个模块化系统,每个模块都与其他模块分开.我想将模块配置数据存储在数据库中,但我不知道最佳结构.

我有一些变种:

第一名:

key_____|______value (primary key is `key`)
option1 | 1
option2 | abcd
option3 | bla-bla-bla
Run Code Online (Sandbox Code Playgroud)

我可以轻松获取设置,但如果我想更新一些设置,我需要使用CASE构建硬(?)SQL查询:

UPDATE settings SET value = CASE
WHEN key = option1 THEN 1;
WHEN key = option2 THEN abcd;
…
END
WHERE key IN (option1, option2, …)
Run Code Online (Sandbox Code Playgroud)

如果有一个更好的变体来更新一个查询中的许多行(我将仅使用MySQLi和InnoDB),这将是很好的.

第二:

module_____|_____settings
news       | a:3:{s:7:"option1";i:1;s:7:"option2";s:4:"abcd";s:7:"option3";s:11:"bla-bla-bla";}
Run Code Online (Sandbox Code Playgroud)

这样,我将使用设置序列化数组并将其放入数据库中.我想在.php文件中缓存未序列化的数据.但是,如果我有大型设置数组,我的序列化字符串将非常大.

第三:

option1 | option2 | option3
   1    |   abcd  |bla-bla-bla
Run Code Online (Sandbox Code Playgroud)

我将为一个选项键提供一列,但我认为创建一个表来存储一行是不必要的.


哪种变体最好?你能建议自己的方法存储配置吗?谢谢!

Jus*_*ner 2

如果您决定将配置数据存储在数据库中,我总是会选择第一个选项。

它允许您轻松添加和更新配置值,而不会影响系统的太多其他部分。您只是稍微过度考虑了更新值的复杂性。不要尝试将所有内容包含在单个更新中,而是为每个键编写单独的更新:

update settings set value = 1 where key = option1;
update settings set value = 'abcd' where key = option2;
Run Code Online (Sandbox Code Playgroud)

选项二可能是紧随其后的第二个,但我真的很讨厌在数据库中存储一大串序列化数据。如果您打算这样做,请考虑将其存储在配置文件中。

我参与过的项目也使用了第三个选项,但它是迄今为止我最不喜欢的。每当添加/删除配置值时都必须添加/删除列是一件非常痛苦的事情。