“系统数据”应该在数据库中吗?
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_name
和 is_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()
函数是一种对布尔值进行操作的不正当方式,但它足够简单。
【讨论】:
以上是关于“系统数据”应该在数据库中吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该动态重新创建 PDF,而不是将其存储在数据库或文件系统中吗?
如果我正在创建一个在线商店并(第一次)使用 stripe api,我应该将信用卡信息保存在我的数据库中吗?