目前我们正在开发一个应用程序,其中我们使用数据库表来存储平台设置,例如最大文件大小,最大用户数,支持电子邮件等。
这意味着每次添加平台设置时,我们都必须在此表中添加一列。
在我之前的项目中,我习惯将这些信息存储在文件中。
什么是更好/更快的方法?
ps,我几乎肯定有人已经有这样的问题,但我似乎无法找到它答案 0 :(得分:37)
我们将配置设置存储在键/值类型表中,例如:
CREATE TABLE Configuration.GlobalSettings
(
SectionName VARCHAR(50),
SettingName VARCHAR(50),
SettingValue VARCHAR(1000),
SettingType TINYINT
);
SectionName
& SettingName
是主键,我们只需将它们拆分,以便更容易查询节中的内容,并允许将各个节加载到处理程序中,而不是一次加载整个批次。 SettingValue
是一个字符串,然后SettingType
是一个鉴别器,它告诉我们应该如何解释设置值(例如1 = string,2 = bool,3 = decimal等)。< / p>
这意味着您不必更改新设置的表结构,只需在部署脚本中添加新结构,或者在您设置这些内容的任何位置。
我们发现配置比文件更好,因为这意味着您可以在需要时通过管理界面轻松地以编程方式更改配置值,这可以强制执行每个设置的逻辑。你不能用文件这么容易地做到这一点(当然,这是可能的)。
答案 1 :(得分:13)
我可以告诉你,因为我在许多站点管理一个特别大的应用程序,因此保持本地文件的配置是一件非常痛苦的事。通常情况下,配置被读取和缓存,并且在运行期间无法更改配置,其他配置有横向扩展系统,其中配置需要反复更改和退回。
如果设计人员只是在数据库中保留系统属性,那么在系统架构实现过程中我的生活将会轻松10%。
答案 2 :(得分:10)
这实际上取决于你的申请。
将设置存储在数据库中有几个优点:
缺点:
存储文件优势:
缺点:
这意味着每次添加平台设置时,我们都必须在此表中添加一列 - 取决于您使用的数据库,但您可以在表中将整个设置存储为XML(SQL服务器允许这样),因此您无需在每次添加设置时更改表模式;您需要做的就是修改XML,向其添加元素或从中删除。
但最后,你必须自己决定, 每个人都没有更好或更糟。
答案 3 :(得分:9)
为什么每次都有新栏目?为什么不只有2列:NAME和VALUE。
我们所做的是在文件中设置默认值,然后在需要时根据部署覆盖数据库中的默认值。
此外,就速度而言,我们缓存配置(能够触发重新加载)。每次需要属性时重新读取配置是没有意义的。所以在速度方面,它并不重要。你做了一次。
答案 4 :(得分: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
├─ ...
由于这些原因,我当然更喜欢文件中的配置。
我的2美分。
答案 5 :(得分:1)
我想每个人都说,取决于您的应用环境和要求。但如果我必须选择一般规则,我会说两个人。 首先,创建一个数据库表来存储所有配置。这有两个原因: 1)版本控制 - 允许您轻松跟踪以前的配置。 2)管理 - 您可以创建用户可以访问的界面来更改设置。
其次,您创建了一个文件,在您将网站保存并发布到生产后,它还会将所有这些设置保存到一个易于访问的文件中。事实上,如果您使用PHP编写Web,那么该文件应该是一个包含数组数据(键值对)的php文件,无需进一步操作。我的意思是,如果这是您需要的最终输出,则无需将您的yaml或json转换为数组。