几列中重复数据的关系数据库设计

时间:2016-07-10 20:47:24

标签: mysql database relational-database

这是我正在使用的数据类型: 有电子邮件ID,年龄等用户数据:

还有应用程序特定的设置数据(不透明度,速度,音量等),其中有默认值,但用户可以自由更改默认值并根据需要自定义应用程序。

我希望可以选择更改现有用户的默认值,而无需在用户表中更改每个用户。

采取什么样的好方法?

  1. 我是否应该在一个表中包含所有数据以及包含默认值的配置文件和名为default_settings的标志(是/否)。
  2. Table: USERS
    
    user_data_1|user_data_2| ... |setting_1|setting_2| ... |default_settings
    
    1. 或者我应该将所有用户数据放在一个表中,并将其链接到另一个表上的相应设置数据,第一行设置表包含默认值。没有设置分类。它是默认设置或一组自定义值
    2. Table: USERS
      
      user_data_1|user_data_2| ... |setting_id
      
      Table: SETTINGS
      
      setting_id|setting_1|setting_2| ...
      

      谢谢。

2 个答案:

答案 0 :(得分:1)

你的第一个设计更具关系性。每个设置都属于自己的列,具有适当的列名,数据类型和DEFAULT。在我看来,不需要最后一栏default_settings。每列都有DEFAULT值,或者是非默认值。

但是,该设计的缺点是,只要您需要引入新设置,就需要使用ALTER TABLE添加新列。并且对表中的列数有实际限制。可能存在多值设置,难以在单列中建模。

我经常看到的用户设置是第二个引用第一个表的表。每个用户在第二个表中有许多行,每个设置一行:

Table USERS
user_data_1|user_data_2| ...

Table SETTINGS
user_id|setting_name|setting_value

此设计允许每个用户启用无限数量的新设置,只需插入新行,而无需ALTER TABLE添加新列。

默认值保存在应用程序代码中。也就是说,对于每个设置,如果给定用户的数据库中不存在该应用程序,则应用程序代码将采用合理的默认值。

此设置表基本上是"键值"商店,有不同的问题:

  • 每个设置名称都以冗余方式存储,而不是列标题。设置名称的拼写可能变得不一致,例如"颜色" vs." color"。
  • 您必须为支持任何设置的设置值选择数据类型,因此您将失去对SQL的支持以强制执行数字或日期格式。即一切都变成了一个字符串。
  • 您无法在列定义中存储DEFAULT
  • 您无法使用NOT NULLUNIQUEFOREIGN KEY等SQL约束。

尽管如此,这种模式在这种情况下仍然很受欢迎。

答案 1 :(得分:0)

基于@ BillKarwin的建议。我决定选择选项1。

Table: USERS

user_data_1|user_data_2| ... |setting_1|setting_2| ...  

settings列中的默认值为NULL,表示需要从配置文件中读取这些设置。如果用户自定义设置,则NULL将替换为用户定义的值。这样可以方便地在每个设置的基础上为所有用户在一个位置更改默认值。