【问题标题】:Database table for global settings全局设置的数据库表
【发布时间】:2015-11-20 23:40:44
【问题描述】:

我正在为 Web 应用程序设计一个数据库,并希望有一个用于可配置全局设置的表。设计此表是否有任何既定的最佳实践?我可以设想两种可能的解决方案,而且我确信肯定还有其他解决方案。

最简单的方法是将键/值对作为字符串存储在其中。这只会占用两列,但不会让我能够为单个项目添加类型约束。

另一种方法是为每个设置添加一列,但整个表格将只有一行,这感觉有点奇怪。

在大多数情况下你们是如何处理的?

【问题讨论】:

  • 您使用的是什么平台?最好使用特定于平台的工具来处理配置。
  • 目前正在使用简单的 php/mysql 设置。
  • 我也没有死心塌地使用数据库。如果有一个很好的非数据库解决方案(看起来有),我非常愿意接受。

标签: database-design


【解决方案1】:

我们在当前项目中使用的是一个名为 SYSPARMS 的系统参数表。这个表主要是一个键/值表。它对键和值都使用 VARCHAR。这允许我们以任何形式指定键以及值(真正转化为操作)。

我喜欢使用数据库,因为我们可以对应用程序进行实时调整。例如,当系统停机进行维护时,我们在其中设置了一个值,因此没有用户可以访问 Web 应用程序。我们可以随时关闭或打开此功能,而无需部署任何应用程序。

【讨论】:

  • 我支持该议案。键和值列可以是字符串。如果您想定义数据类型,您可以按照 Andrew Siemer 的建议进行操作并进一步分解。
【解决方案2】:

设置保存在merb(可能还有rails)中的方式是键/值对,但不是在数据库表中,而是在YAML文件中,它具有人类可读和易于解析。

【讨论】:

    【解决方案3】:

    如果我要在数据库中执行此操作,我喜欢执行此操作的方式是存储属性。一个属性有一个键/值对。但它也有一个属性类型(指向attributeTypes 表),例如日志记录、siteConfig、externalReferences 等等。然后,您还可以在 AttributeType 级别拥有一个表,该表指定要保存在属性表中的数据类型。 DataTypeID 将与 AttributeTypes 一起存储。然后出于查找原因,它指向一个 DataTypes 表。这样您就可以知道您正在处理数字、日期、字符串、xml 等。我发现这提供了最大的灵活性……如果您需要的话。

    【讨论】:

      【解决方案4】:

      在 ASP.Net 中,您可以将全局配置值以名称/值对的形式存储在 Web.Config 文件中。

      【讨论】:

      • 类似于我的回答,但他想要一个“数据库”,而不仅仅是一个配置文件。
      • @djangofan,他确实提到了他想要一个“数据库”,但我们作为负责任的回答者的问题是“你真的需要一个数据库表吗?你能摆脱一个配置文件吗?”
      【解决方案5】:

      Zend 框架使用 config.ini 并有一个很棒的解析器,它可以根据点符号将键拆分和分叉为数组和子数组。 config.ini 可以作为实例加载并存储在注册表中。

      示例:

      db.name '我的名字'

      db.host '我的主机'

      db.user '我的用户'

      db.password '我的密码'

      我现在可以得到这些值,例如:

      $config->db->名称;或完整的数组 $config->db;

      【讨论】:

        【解决方案6】:

        我过去曾使用数据库表来存储应用程序设置,它非常有用。虽然,我同意你的担忧,但感觉应该有更好的方法来做到这一点。但是,我不知道,所以我们开始吧:

        1. 使用行而不是列来添加设置。很容易想到“我永远不需要比这些更多的设置”,但你会的,它会变成一个巨大的、可怕的混乱。我看过了。
        2. 你的列应该是这样的:

          • id - int
          • 名称 - varchar(50)
          • 值 - 文本
          • data_type - varchar(50)
          • 说明 - 文字
        3. id 可以方便地在应用程序循环中显示您的设置,这是一种很好的做法。

        4. 如果可能,将“名称”设为唯一列。

        5. 'text' 数据类型符合您的数据,因此 varchar(50) 无论如何都会为每行预留 50 个字符,文本将根据数据量进行调整。如果您的数据是简单的东西,例如开或关开关,它可以是一个字节,如果它是一个很长的副本,它可以促进这一点,而不会强制较小的数据具有相同的大小。 (我认为这就是它的工作原理,尽管最小大小可能大于一个字节 - 无论哪种方式,适应而不是符合预定义数量的东西绝对是一个加号)。

        6. data_type:这不是必需的,但听起来您想要一种方法来限制可以为每个设置输入的数据类型。这是行范式的缺点之一:数据类型只是一个建议。如果您计划拥有一个管理工具,其中管理员是临时工并且可能输入错误数据,那么您可以使用它来检查建议的值,然后再将其提交到表格并可能使您的应用程序崩溃。当然,如果每个人都可以直接访问该表,这将无济于事,但它也可以作为一个有用的指南。

        7. 描述:这些是 cmets。用它来告诉那些追随你的人你为什么这样做,以及如何避免应用程序崩溃。

        【讨论】:

          【解决方案7】:

          如果表中只有一行,那么为什么要使用数据库?将配置以 XML 格式存储在一个文件中。

          如果还需要使用数据库,则将配置以XML格式存储在数据库的一张表的一行的一列中。

          【讨论】:

          • 你在开玩笑吧?将 XML 插入数据库有什么意义?这将如何使事情变得比键/值表更容易?
          • 您可以使用 ...3 在 XML 中添加某种形式的类型安全性
          • @ChssPly76:注意我建议将其保存在文件中。
          【解决方案8】:

          我喜欢 STAii 提倡的 YAML 方法。

          如果这是一个 .NET 或 Java 应用程序,您还可以考虑使用 XML 并使用序列化来方便地获取用户设置的实例。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多