将“网站设置”数据存储在数据库表中的最佳方法是什么?

时间:2014-12-06 01:00:55

标签: php arrays settings table-structure

我正在开发市场,并且想知道处理网站设置的最佳方式是什么,例如标题,网址,https,联系电子邮件,版本等。

我正在尝试构建表格,以便更新,并且可以添加越来越多的设置来获取。

我开发了2个结构,要么将它保存在一行中,列名称作为设置名称,行列值作为设置值。并使用mysql_fetch_assoc回显第一行值列名。 enter image description here

我还在考虑为每个设置设置一个新的自动增量行。并将其转换为数组以从数据库中获取,以便为获取设置名称的列分配列名。 enter image description here

您有效处理此问题的方法是什么?谢谢。

5 个答案:

答案 0 :(得分:4)

每个不同选项设置的行,每行使用一个名称/值对,可能是最好的方法。它比许多列更灵活;如果添加选项设置,则无需运行任何类型的ALTER TABLE操作。

WordPress wp_options表以这种方式工作。看这里。 http://codex.wordpress.org/Options_API

如果你有一个“复合”选项,你可以serialize一个php数组将它存储在表的一行中。

答案 1 :(得分:2)

这两种方式都很好。我想说如果你想在管理面板中管理这些设置,那么按列设置的设置会更好,因为您可以通过管理员的简单INSERT查询动态添加新设置。哪个比ALTER TABLE查询更好(更安全)。

答案 2 :(得分:2)

这取决于您使用的技术。例如,在PHP Symfony项目中,设置主要存储在平面文件中(Json,xml ...)。

我为客户开发了许多大型Web应用程序。键/值表通常用于存储简单设置。如果你需要存储多个值,你必须将它们序列化,所以它有点棘手。

请记住加密敏感数据,如密码(Sha256 +盐)。

最好的方法是创建两个表。 用于将设置存储为键/值的表:

CREATE TABLE Settings (
    Id INT NOT NULL PRIMARY KEY,
    Key NOT NULL NVARCHAR,
    Value NULL NVARCHAR
    EnvId INT NOT NULL
);

然后你需要一个环境表。

CREATE TABLE Environment  (
    Id INT NOT NULL PRIMARY KEY,
    Key NOT NULL NVARCHAR,
);

不要忘记外键约束。

此外,您应该在单独的架构中创建这些表。您可以通过过滤访问权限来应用安全策略。

因此,您可以使用许多环境(开发,测试,生产......),只需激活一个环境即可。例如,您可以配置为不在开发环境中发送电子邮件,而是在生产环境中发送它们。

因此,您执行连接以获取指定环境的设置。您可以添加布尔值以在环境之间轻松切换。

如果您使用文件(它不需要数据库连接),您可以获得类似的内容(Json):

Env:
    Dev:
        Email: ~
    Prod: 
        Email: contact@superwebsite.com

答案 3 :(得分:2)

首先,我会考虑另外一件事,一个配置文件...

然后你应该问问自己项目需要什么......

首先,我会考虑配置文件与数据库:

数据库选项相对于配置文件的最大优势是可扩展性,如果您有许多应用程序/站点需要这些配置,那么请转到数据库,因为它可以避免您复制相同配置文件几次的所有问题在所有不同的网站"

上对文件进行版本控制和修改

否则我会坚持配置文件,因为对于应用程序来说访问速度更快,并且在sql server中断的情况下文件可能仍然可用,在这种情况下,某些配置可能仍然是相关的,配置文件也可能包含在你的版本控制软件。出于某些安全原因,假设您的数据库在许多软件中共享......

然后,如果你坚持使用数据库,我会重新命名一行标签一个配置,我认为管理记录比表结构更容易,特别是随着时间的推移和软件的演变。如果其他开发人员加入你的项目你的表结构可能很快变成一团糟:]

最终的arg是安全性...一个好的做法是设置" DB用户"向用户组建软件,该用户不具有DB结构修改权限,只有访问/模糊删除记录的权利;)

答案 4 :(得分:0)

首先,这完全取决于您的业务需求,但是到目前为止,最好的方法是在下面创建一个设置表方案。

CREATE TABLE `settings` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `value` text NOT NULL,
  `type` enum('general','advanced') NOT NULL DEFAULT 'general'
);

enter image description here

示例

site_title = "example"
site_logo = "something.jpg"
site_url = "https://www.example.com"
address =  "#795 Folsom Ave, Suite 600 San Francisco"
email = "something@example.com"
mobile = "9898xxxxxx"

这是最好的方法,因为您永远不知道何时会引入新密钥。 这里的名称将是,值将是

值列data type应该为 TEXT 以进行详细说明。

我又添加了一个名为 type 的列,data typeENUM,用于区分数据。您可以根据业务逻辑自定义类型。