在我的应用程序中,我需要捕获名为“Thing”的特定实体的设置值。每个设置都有一个默认值,但如果需要,用户可以覆盖这些值。我有以下表格来捕获信息:
Things table
ID | Name
-----------
1 | Thing1
2 | Thing2
ThingSettingsDescriptions Table
ID | SettingDescription | Default
---------------------------------------
1 | Colour | Blue
2 | Size | Medium
3 | Temperature | Hot
ThingSettingsValues Table
ID | ThingID | ThingSettingsID | Value
---------------------------------------------
1 | 1 | 1 | Blue
2 | 1 | 2 | Medium
3 | 1 | 3 | Hot
4 | 2 | 1 | Blue
5 | 2 | 2 | Medium
6 | 2 | 3 | Hot
在上面的示例数据中,Thing1和Thing2具有默认设置 - 因此ThingSettingsValues中的条目会针对每个事物重复。这对我来说似乎有点低效。
有没有办法避免为每件事重复这些默认值?
我发现最接近我的问题是this,但这并不是我想要的。
我想到的另一个选项是仅在ThingSettingsValues表中存储非默认值。这意味着在需要设置事物的应用程序中,我们检查ThingSettingsValues表,如果它不包含该事物的条目,则从ThingSettingsDescriptions表中读取默认值,然后使用这些默认设置值。 这可以工作,但意味着如果ThingSettingsValues表中没有条目,数据库不会明确捕获获取设置值的位置。
由于
答案 0 :(得分:1)
首先,它看起来像冗余(数据重复),因为ThingSettingsDescriptions表和ThingSettingsValues表具有为默认条目重复的值。
但是,如果仔细观察,那么不是冗余。原因是ThingSettingsValues(Values)表中的看似重复的值与ThingSettingsDescriptions(Descriptions)表中的目的完全不同。对于Descriptions表中的每个setting-id,都会分配一个默认值。即如果“值”表中的某些内容没有此设置的值,则返回值。
另一方面,Values表包含这些设置的所有可能选项,其中一个恰好是默认设置。如果某些“事物”不在“值”表中有任何设置条目,则默认值是应用程序所属的回退值。因此,两个表中值的目的是不同的,IMO当前的数据库设计是好的,因为没有冗余。