我为包含用户设置的应用程序设计了一个数据库。此数据库将预装多个系统用户设置。这些可能会因版本而异。我该如何处理更新这些设置?
我提出的解决方案:
目前我正在做第一个,但不知何故第二个似乎更合适。在使用Microsoft Entity Framework时,我该怎么做以及如何将外部数据与数据库中的数据无缝结合?
答案 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_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()
函数是对布尔值进行操作的一种不正常的方法,但它很简单。