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

Posted

技术标签:

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

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

我想出的解决方案:

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

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

【问题讨论】:

什么是“系统用户设置”?您是指默认用户设置吗? 我正在写游戏合集。这些游戏将附带每个游戏的几个默认系统设置。用户将能够进行自己的设置并改为使用这些设置。 【参考方案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() 函数是一种对布尔值进行操作的不正当方式,但它足够简单。

【讨论】:

以上是关于“系统数据”应该在数据库中吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将 HTML 表单存储在数据库中吗

我应该动态重新创建 PDF,而不是将其存储在数据库或文件系统中吗?

我应该尝试将 asp 控制事件放入 BLL 中吗?

如果我正在创建一个在线商店并(第一次)使用 stripe api,我应该将信用卡信息保存在我的数据库中吗?

我应该选择 Hiberlite 将 SQLite 集成到我的 Win/iOS 应用程序中吗?

可以将演示数据存储在数据库中吗?