【问题标题】:Best way of storing 'website settings' data in a database table?在数据库表中存储“网站设置”数据的最佳方式?
【发布时间】:2015-02-04 06:50:08
【问题描述】:

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

我正在尝试对表格进行结构化,使其易于更新,并且能够添加越来越多的设置以供获取。

我开发了2个结构,要么保持在一行,以列名作为设置名,以行列值作为设置值。并且只是用 mysql_fetch_assoc 回显第一行值列名。

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

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

【问题讨论】:

    标签: php arrays settings table-structure


    【解决方案1】:

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

    【讨论】:

    • 这正是我要做的,几乎有一个页面,我可以在其中编辑所有设置,而不是手动进入数据库或将其硬编码在我的某个地方的 config.php 文件中服务器。当我更新设置行值时,我是否还必须使用 ALTER QUERY COMMAND ?
    • 不,您必须执行UPDATE 查询。例如UPDATE settings_table_name SET setting_value = 'new title' WHERE setting_name = 'title'
    • 谢谢你:),完全明白了。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我从来没有接触过实现数组,感谢您向我展示了 ollie!我将使用单独的行结构。再次感谢您的链接。
    【解决方案3】:

    这取决于您使用的技术。例如在 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
    

    【讨论】:

    • 设置表与用户表完全分离。但我没有使用任何技术。它最初是硬编码的,想把它变成一个灵活的可编辑结构。
    • 如果我加密它,当我需要发送包含 cron 作业的电子邮件时,我将如何提取密码?
    • 您必须处理键/值表。它会比通过设置创建列更好。例如,如果您想添加一个新设置,您只需要执行一个插入语句。在另一个结构中,您必须创建一个更改列。
    • 您永远不应该解码/解密密码;密码应始终存储为哈希(如果有的话)。如果授权的人/应用程序可以解密密码,那么未经授权的人也可能会这样做。不要恢复密码;重置它们。
    • 非常有趣的设计。我以前从未遇到过这样的事情。谢谢 K4timini。
    【解决方案4】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      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 将是keyvalue 将是value

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 2018-03-16
        • 2014-07-28
        • 2011-03-05
        • 1970-01-01
        相关资源
        最近更新 更多