10

我在市场上工作,想知道处理网站设置(如标题、url、如果是 https、联系电子邮件、版本等)的最佳方式是什么。

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

我开发了2个结构,要么保持在一行,列名作为设置名,行列值作为设置值。并且只是用 mysql_fetch_assoc 回显第一行值列名。 在此处输入图像描述

我还在考虑为每个设置设置一个新的自动增量行。并将其转换为从数据库中获取的数组,以便为​​获取设置名称的列分配列名。 在此处输入图像描述

你有什么方法可以有效地处理这个问题。谢谢你。

4

5 回答 5

4

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

WordPress wp_options 表就是这样工作的。看这里。 http://codex.wordpress.org/Options_API

如果您有“复合”选项,则可以序列化一个 php 数组以将其存储在表的单行中。

于 2014-12-06T01:07:35.000 回答
3

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

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

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

与配置文件相比,数据库选项的最大优势是可扩展性,如果您有许多应用程序/站点需要这些配置,那么请使用数据库,因为它可以避免您复制多次相同的配置文件,并解决版本控制和修改的所有问题所有这些不同“站点”上的文件

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

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

最后一个参数是安全性......一个好的做法是将软件中的“数据库用户”设置为没有数据库结构修改权限的用户,只有访问/修改删除记录的权限;)

于 2014-12-06T01:41:15.803 回答
2

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

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

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

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

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
于 2014-12-06T01:10:41.730 回答
2

这两种方式都可以正常工作。我想说,如果您想在管理面板中管理这些设置,按列设置一个更好,因为您可以通过INSERT管理员的简单查询即时添加新设置。哪个比ALTER TABLE查询更好(更安全)。

于 2014-12-06T01:07:25.997 回答
1

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

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'
);

在此处输入图像描述

例子

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"

这是最好的方法,因为您永远不知道何时引入新密钥。这name将是key并且value将是value

值列data type应为TEXT以进行详细描述。

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

于 2020-07-19T04:19:50.240 回答