如何避免使用实体的默认条目填充数据库表?

时间:2016-01-12 14:52:46

标签: design-patterns database-design relational-database

在我的应用程序中,我需要捕获名为“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表中没有条目,数据库不会明确捕获获取设置值的位置。

由于

1 个答案:

答案 0 :(得分:1)

首先,它看起来像冗余(数据重复),因为ThingSettingsDescriptions表和ThingSettingsValues表具有为默认条目重复的值。

但是,如果仔细观察,那么不是冗余。原因是ThingSettingsValues(Values)表中的看似重复的值与ThingSettingsDescriptions(Descriptions)表中的目的完全不同。对于Descriptions表中的每个setting-id,都会分配一个默认值。即如果“值”表中的某些内容没有此设置的值,则返回值。

另一方面,Values表包含这些设置的所有可能选项,其中一个恰好是默认设置。如果某些“事物”在“值”表中有任何设置条目,则默认值是应用程序所属的回退值。因此,两个表中值的目的是不同的,IMO当前的数据库设计是好的,因为没有冗余。