我在想,对于我的Web应用程序,存储特定于用户的设置的最佳方法是什么?只是用户可能有的偏好设置。我考虑了两个选项:
用户表 - 我会为我的用户创建一个表。创建一个名为"preferences"的列,并以键值对的形式存储序列化数据
设置表 - 使用一个名为"settings"的单独表格和一个"user_id"列。以同样的方式保存设置
感谢任何建议。谢谢 :)!
--
编辑:只是要补充一下,如果我没有将数据序列化/ Json或其他类型的数据放入数据中,我必须为每个设置都有一个列。
我在想,对于我的Web应用程序,存储特定于用户的设置的最佳方法是什么?只是用户可能有的偏好设置。我考虑了两个选项:
用户表 - 我会为我的用户创建一个表。创建一个名为"preferences"的列,并以键值对的形式存储序列化数据
设置表 - 使用一个名为"settings"的单独表格和一个"user_id"列。以同样的方式保存设置
感谢任何建议。谢谢 :)!
--
编辑:只是要补充一下,如果我没有将数据序列化/ Json或其他类型的数据放入数据中,我必须为每个设置都有一个列。
对于每个用户始终设置的任何内容,您应该按照通常的规范化方式将其保留在Users
表中。至于可选配置,我倾向于使用以下表结构:
TABLE Users:
id INT AI
name VARCHAR
...
TABLE User_Settings
user_id INT PK,FK
name VARCHAR PK
type BOOL
value_int INT NULL
value_str VARCHAR NULL
< p >其中User_Settings.type
指定应引用整数或字符串字段。例如:
INSERT INTO Users (id, name) VALUES (1, 'Sammitch');
INSERT INTO User_Settings (user_id, name, type, value_int) VALUES (1, 'level', 1, 75);
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'en');
对于INSERT/UPDATE问题:
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
ON DUPLICATE KEY UPDATE value_str='fr';
同时,正如大多数人所说,序列化和存储首选项并不是一个特别好的想法,因为:
在这段时间里,我与人们就最佳存储可选设置以及上述定义的一般表结构进行了一些争论。
虽然该表结构并非完全“不好”,但也不完全“好”。 它试图在不良情况下尽力而为。可选设置的序列化可以工作,只要您能够适应这些设置:
然后,您可以考虑在Users
表中添加一个类似于optional_settings
的字段,其中包含设置的序列化[例如:JSON]形式。 您确实要做出上述权衡,但这是一种更直接的方法,您可以存储更复杂的设置。
此外,如果您使用LOB类型(如TEXT
)来存储数据,则在MySQL中数据不一定会存储在行中。
无论如何,最终取决于您确定您的应用程序的要求和约束,并基于该信息做出最佳选择。
user_id,name
上创建复合主键是最好的选择。 - SammitchINSERT [...] VALUE (1, 'level', 'int', '75');
INSERT [...] VALUE (1, 'singer', 'string', 'freddie');
- Luluuser_id
(1个用户记录,1个设置记录)作为主键,因为这会带来两种解决方案的缺陷。 - Matthew这总是同样的问题:你需要多久更改一次这些数据?在我看来,拥有一个单独的表格始终是一个好的解决方案,因为它分离了应用程序的不同方面。
在我的观点中,拥有一个preferences
列并不是一个好主意,因为每当用户更改其设置时,您都必须序列化所有他的数据以将它们存储在users
表中,无论是只是一个update
还是一个单独的表。如果您真的想将所有内容存储在users
中,您应该将设置分成不同的列。
第二个选项,但是修改为单独存储设置。不要像这种情况一样在字段中存储序列化数据,这是不好的做法。
想象一下:你把它放在那里,并在那里存储用户的国家或者是否注册了你的通讯。后来...你需要知道有多少人来自俄罗斯。你怎么办?一个一个地取出并解码然后增加计数器吗?(还是使用您的第二种方法,只运行一个简单的SELECT COUNT(id)查询?)