这是我正在使用的数据类型: 有电子邮件ID,年龄等用户数据:
还有应用程序特定的设置数据(不透明度,速度,音量等),其中有默认值,但用户可以自由更改默认值并根据需要自定义应用程序。
我希望可以选择更改现有用户的默认值,而无需在用户表中更改每个用户。
采取什么样的好方法?
Table: USERS user_data_1|user_data_2| ... |setting_1|setting_2| ... |default_settings
Table: USERS user_data_1|user_data_2| ... |setting_id Table: SETTINGS setting_id|setting_1|setting_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
添加新列。
默认值保存在应用程序代码中。也就是说,对于每个设置,如果给定用户的数据库中不存在该应用程序,则应用程序代码将采用合理的默认值。
此设置表基本上是"键值"商店,有不同的问题:
DEFAULT
。NOT NULL
,UNIQUE
或FOREIGN KEY
等SQL约束。尽管如此,这种模式在这种情况下仍然很受欢迎。
答案 1 :(得分:0)
基于@ BillKarwin的建议。我决定选择选项1。
Table: USERS
user_data_1|user_data_2| ... |setting_1|setting_2| ...
settings列中的默认值为NULL,表示需要从配置文件中读取这些设置。如果用户自定义设置,则NULL将替换为用户定义的值。这样可以方便地在每个设置的基础上为所有用户在一个位置更改默认值。