在数据库中存储用户首选项的正确方法是什么?
What is the proper way to store user preferences in a database?
我有一个 MySQL 数据库,用于存储我的服务提供的用户电子邮件和新闻文章。我希望用户能够 save/bookmark 以后想阅读的文章。
我的计划是在我存储用户电子邮件的 table 中有一列,其中包含以逗号分隔的唯一 ID 字符串,其中唯一 ID 是分配给每个用户的值文章,因为它们被添加到数据库中。这些文章存储在单独的 table 中,我使用 UUID_SHORT()
生成类型为 BIGINT
的唯一 ID。
例如,假设在我存储文章的 table 中,我有
ArticleID OtherColumn
4419350002044764160 other stuff
4419351050184556544 other stuff
在我存储用户数据的table中,我会
UserEmail ArticlesSaved OtherColumn
examlple1@email.com 4419350002044764160,4419351050184556544,... other stuff
examlple2@email.com 4419350002044764160,4419351050184556544,... other stuff
表示前两位用户保存了ID为4419350002044764160
和4419351050184556544
的文章。
这是将类似内容存储在数据库中的正确方法吗?如果有更好的方法,谁能解释一下?
我考虑的另一个选择是为每个用户设置一个单独的 table,我可以将他们保存的文章的 ID 存储到一个列中,尽管这个 post 的答案是这不是很有效:Database efficiency - table per user vs. table of users
我会为用户推荐一篇 table 篇和一篇 table his/her 篇已添加书签的文章。
USER
id - int autoincrement
user_email - varchar50
首选项
id int autoincrement
article_index (datatype that you find accurate according to your structure)
id_user (integer)
这样用户可以很容易地为文章添加书签和取消书签。连接两个 table 是通过用户中的 id 和首选项中的 id_user 完成的。确保 preferences/bookmarks 中的每一行都是一篇文章(不要做任何逗号分隔的事情)。这样做会为您节省很多 time/complications - 我保证!
获取用户的书签页面的典型查询如下所示。
SELECT u.id,p.article_index,p.id_user FROM users u
LEFT JOIN preferences ON u.id=p.id_user
WHERE u.id='1' //user id goes here, make sure it's an int.. apply appropriate security to your queries.
在数据库字段中以 CSV 格式保存数据(几乎)从来都不是一个好主意。你应该有 3 tables :
- 1 table 用与用户直接相关的一切来描述用户
- 1 table 描述带有相关数据的文章
- 1 table 有 2 列 "userid" 和 "articleid" 链接两者。如果一个用户收藏了 10 篇文章,这个 table 将有 10 条记录,每次都有不同的 aticleid。
"Proper" 是一个松散的词,但您建议的方法存在很大缺陷。生成的数据库甚至不再满足第一范式,即使您没有立即看到它们,它也可以预测实际问题。您可能会遇到的一些问题是
- 每个用户可以 "save" 的文章数量将受到
ArticlesSaved
列数据类型的限制;
- 您将遇到重复 "saved" 文章 ID 的问题;和
- 关于哪些文章被保存的查询将更难制定并且可能 运行 更慢;部分原因是
- 您无法对
ArticlesSaved
列进行有意义的索引。
对多对多关系(例如用户和文章之间)建模的常用方法是通过单独的 table。在这种情况下,这样的 table 每个(用户,保存的文章)对都有一行。
我有一个 MySQL 数据库,用于存储我的服务提供的用户电子邮件和新闻文章。我希望用户能够 save/bookmark 以后想阅读的文章。
我的计划是在我存储用户电子邮件的 table 中有一列,其中包含以逗号分隔的唯一 ID 字符串,其中唯一 ID 是分配给每个用户的值文章,因为它们被添加到数据库中。这些文章存储在单独的 table 中,我使用 UUID_SHORT()
生成类型为 BIGINT
的唯一 ID。
例如,假设在我存储文章的 table 中,我有
ArticleID OtherColumn
4419350002044764160 other stuff
4419351050184556544 other stuff
在我存储用户数据的table中,我会
UserEmail ArticlesSaved OtherColumn
examlple1@email.com 4419350002044764160,4419351050184556544,... other stuff
examlple2@email.com 4419350002044764160,4419351050184556544,... other stuff
表示前两位用户保存了ID为4419350002044764160
和4419351050184556544
的文章。
这是将类似内容存储在数据库中的正确方法吗?如果有更好的方法,谁能解释一下?
我考虑的另一个选择是为每个用户设置一个单独的 table,我可以将他们保存的文章的 ID 存储到一个列中,尽管这个 post 的答案是这不是很有效:Database efficiency - table per user vs. table of users
我会为用户推荐一篇 table 篇和一篇 table his/her 篇已添加书签的文章。
USER
id - int autoincrement
user_email - varchar50
首选项
id int autoincrement
article_index (datatype that you find accurate according to your structure)
id_user (integer)
这样用户可以很容易地为文章添加书签和取消书签。连接两个 table 是通过用户中的 id 和首选项中的 id_user 完成的。确保 preferences/bookmarks 中的每一行都是一篇文章(不要做任何逗号分隔的事情)。这样做会为您节省很多 time/complications - 我保证!
获取用户的书签页面的典型查询如下所示。
SELECT u.id,p.article_index,p.id_user FROM users u
LEFT JOIN preferences ON u.id=p.id_user
WHERE u.id='1' //user id goes here, make sure it's an int.. apply appropriate security to your queries.
在数据库字段中以 CSV 格式保存数据(几乎)从来都不是一个好主意。你应该有 3 tables :
- 1 table 用与用户直接相关的一切来描述用户
- 1 table 描述带有相关数据的文章
- 1 table 有 2 列 "userid" 和 "articleid" 链接两者。如果一个用户收藏了 10 篇文章,这个 table 将有 10 条记录,每次都有不同的 aticleid。
"Proper" 是一个松散的词,但您建议的方法存在很大缺陷。生成的数据库甚至不再满足第一范式,即使您没有立即看到它们,它也可以预测实际问题。您可能会遇到的一些问题是
- 每个用户可以 "save" 的文章数量将受到
ArticlesSaved
列数据类型的限制; - 您将遇到重复 "saved" 文章 ID 的问题;和
- 关于哪些文章被保存的查询将更难制定并且可能 运行 更慢;部分原因是
- 您无法对
ArticlesSaved
列进行有意义的索引。
对多对多关系(例如用户和文章之间)建模的常用方法是通过单独的 table。在这种情况下,这样的 table 每个(用户,保存的文章)对都有一行。