【问题标题】:Should 'system data' be in a database?“系统数据”应该在数据库中吗?
【发布时间】:2009-03-05 08:57:34
【问题描述】:

我为包含用户设置的应用程序设计了一个数据库。该数据库将预装几个系统用户设置。这些可能会因版本而异。我应该如何处理更新这些设置?

我想出的解决方案:

  1. 将布尔“系统”字段应用于设置表并在数据库版本号更改时替换所有系统设置。 (这在设计这些设置时非常烦人,因为您必须在开发时不断擦除数据库)
  2. 不要将系统设置放入数据库中,并在查询时以某种方式将系统数据与数据库中的数据合并。

目前我正在做第一个,但不知何故,第二个似乎更合适。在使用 Microsoft Entity Framework 时,我应该怎么做以及如何将外部数据与数据库中的数据无缝结合?

【问题讨论】:

  • 什么是“系统用户设置”?您是指默认用户设置吗?
  • 我正在写游戏合集。这些游戏将附带每个游戏的几个默认系统设置。用户将能够进行自己的设置并改为使用这些设置。

标签: database entity-framework orm


【解决方案1】:

由于存在大量操作,您最终可能希望对数据执行超出简单联合的操作(内部和外部联接以查看谁与系统设置匹配或不想起谁)我建议将系统数据与用户数据结构相同。

这还允许在用户没有特定值时从系统数据中填充默认值等行为。

如果您有时间阅读相当长的内容,this blog post 中有一些关于管理设置和覆盖的有趣点。

【讨论】:

    【解决方案2】:

    我会先为用户加载默认值,然后在顶部加载用户自定义值。这样您仍然可以更改默认设置,但如果用户更改了特定设置,他们不会丢失它。

    【讨论】:

      【解决方案3】:

      我不确定你想用 1) 实现什么,但我可以回答 2)。

      所有生成的实体类都是部分类,因此您可以使用自己的属性和方法来扩展它们。因此,您可以向从外部源(例如配置文件)获取数据的实体添加额外的属性。

      现在,这可能不是最佳解决方案,因为无法一次获取您需要的所有信息(例如,在检索大量实体时)。

      【讨论】:

        【解决方案4】:

        我不确定这是否真的解决了您的问题,但我认为这是一个有趣的小型数据库练习。假设您有一个名为“设置”的表格,正如您在 #1 中提出的那样:

        +------------+--------------+-----------+---------------+
        | setting_id | setting_name | is_system | setting_value |
        +------------+--------------+-----------+---------------+
        |          3 | foo          |         1 | Blue          |
        |          4 | foo          |         0 | Red           |
        |          5 | bar          |         1 | Green         |
        |          6 | baz          |         1 | Yellow        |
        |          7 | baz          |         0 | Orange        |
        |          8 | quux         |         0 | Purple        |
        +------------+--------------+-----------+---------------+
        

        主键将位于 setting_id 上,唯一约束应用于 setting_nameis_system 列(布尔值)。

        要查找当前处于活动状态的所有设置(假设用户设置覆盖系统设置),以下查询将完成这项工作:

        SELECT  setting_name, setting_value
        FROM    setting s
        WHERE   is_system = (
                        SELECT  MIN(is_system)
                        FROM    setting si
                        WHERE   s.setting_name = si.setting_name
                );
        

        运行查询会产生以下结果:

        +--------------+---------------+
        | setting_name | setting_value |
        +--------------+---------------+
        | foo          | Red           |
        | bar          | Green         |
        | baz          | Orange        |
        | quux         | Purple        |
        +--------------+---------------+
        

        因此,如果存在用户设置,则获取该设置,否则将使用系统默认设置。

        以这种方式使用MIN() 函数是一种对布尔值进行操作的不正当方式,但它足够简单。

        【讨论】:

          猜你喜欢
          • 2010-10-20
          • 2019-09-16
          • 2011-06-12
          • 1970-01-01
          • 2011-03-19
          • 2018-02-02
          • 2011-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多