“系统数据”应该在数据库中吗?

时间:2009-03-05 08:57:34

标签: database entity-framework orm

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

我提出的解决方案:

  1. 将一个布尔“系统”字段应用于设置表,并在数据库的版本号更改时替换所有系统设置。 (这在设计这些设置时非常烦人,因为你必须在开发时不断擦除数据库)
  2. 不要将系统设置放在数据库中,并在查询时以某种方式将系统数据与数据库中的数据合并。
  3. 目前我正在做第一个,但不知何故第二个似乎更合适。在使用Microsoft Entity Framework时,我该怎么做以及如何将外部数据与数据库中的数据无缝结合?

4 个答案:

答案 0 :(得分:1)

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

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

如果您有足够的时间阅读那么长的内容,那么在this blog post中管理设置和覆盖有一些有趣的观点。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

+------------+--------------+-----------+---------------+
| 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()函数是对布尔值进行操作的一种不正常的方法,但它很简单。