mysql - 在 MySQL 中保存用户首选项的最有效方法是什么?

标签 mysql database database-design structure

我想知道为网站保存大量用户偏好的最佳策略是什么。主要是默认值,如默认时区、默认文本大小等。为每个设置创建一个单独的列听起来不切实际。目前我能想到的唯一方法是在users 表中添加一个单列作为首选项,并将所有设置放在那里。

例如,我可以只在一列中使用这样的格式:timezone:GMT;text_size:12;default_value1:something;default_value2:FALSE。然后在 PHP 中抓取它时,我会为登录用户选择此列并对结果进行分解,设置 $_SESSION['settings']['setting_key'] = "setting_value"。

有没有更聪明的方法来做到这一点,或者我已经在正确的方向上了?当然,唯一的缺点是无法搜索每个特定设置,因为所有内容都集中在一起。

最佳答案

恕我直言,这就是serialize非常适合。

如果您希望它可搜索,您可能希望最终将它们分开。 另一方面,您可能想采用完全不同的方法,而不是存储在按列设置的大表中,您可以创建一种表:

CREATE TABLE settings (user_id INT, setting VARCHAR, value VARCHAR)

并像这样存储设置。这样您就不会受到添加/删除列的限制。

另一种方法(进一步加快可能的设置查找)是创建多个表:

CREATE TABLE settings (id INT, setting VARCHAR)
CREATE TABLE settings_values (user_id INT, setting_id INT, value VARCHAR)

考虑到 setting_idsettings.id 的外键,并假设您有一些 users 表,其中的用户 ID 位于 user_id 是两个示例中的外键。

关于mysql - 在 MySQL 中保存用户首选项的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13058545/

相关文章:

php - 从多个表中获取对象的最佳方法是什么?

database - 在数据库列中存储分隔列表真的那么糟糕吗?

php - Mysql查询日期格式、phpmailer

Mysql Select with select result in another table

mysql - 多按钮表单不会将数据映射回文本框.net core 1.1

java - 网络服务 : error in code or connection

mysql - 我应该在大型 EAV 表中使用时间戳还是单独的时间列?

sql-server - 数据库设计帮助——分层数据

mysql - 如何创建仅在表中显示日期部分的时间戳

Mysql表: Insert a column with ascending numbers (1 to [total number of rows]) in the order of the datetime column