在数据库中存储用户首选项的正确方法是什么?

时间:2015-01-21 15:17:17

标签: php mysql sql database storage

我有一个MySQL数据库,用于存储我的服务提供的用户电子邮件和新闻文章。我希望用户能够保存/收藏他们想要稍后阅读的文章。

我实现这一目标的计划是在表格中列出一个列,用于存储用户'电子邮件,包含逗号描述的唯一ID字符串,其中唯一ID是在将每篇文章添加到数据库时分配给它们的值。这些文章存储在单独的表格中,我使用UUID_SHORT()生成BIGINT类型的唯一ID。

例如,让我们在我存储文章的表格中说,我有

ArticleID             OtherColumn
4419350002044764160   other stuff
4419351050184556544   other stuff

在我存储用户数据的表格中,我会

UserEmail             ArticlesSaved                                   OtherColumn
examlple1@email.com   4419350002044764160,4419351050184556544,...     other stuff
examlple2@email.com   4419350002044764160,4419351050184556544,...     other stuff

表示前两位用户已保存包含ID 44193500020447641604419351050184556544的文章。

这是在数据库中存储这样的东西的正确方法吗?如果有更好的方法,有人可以解释一下吗?

我想到的另一个选项是为每个用户创建一个单独的表,我可以将他们保存的文章的ID存储到列中,尽管这篇文章的答案不是很有效:{{3} }

3 个答案:

答案 0 :(得分:4)

我会为用户建议一个表,为他/她的书签文章建议一个表。

用户

id - int autoincrement
user_email - varchar50

偏好

id int autoincrement
article_index (datatype that you find accurate according to your  structure)
id_user (integer)

这样,用户可以轻松地为文章添加书签和取消标记。使用用户中的id和首选项中的id_user连接两个表。确保首选项/书签中的每一行都是一篇文章(不要以逗号分隔任何内容)。这样做可以节省你很多时间/并发症 - 我保证!

获取用户书签页面的典型查询看起来像这样。

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.

答案 1 :(得分:2)

"适当"这是一个简单的词,但你建议的方法是相当有缺陷的。由此产生的数据库不再满足第一范式,即使您没有立即看到它们,也可以预测实际问题。您可能遇到的一些问题是

  • 每个用户可以"保存"将受ArticlesSaved列数据类型的限制;
  • 你会遇到重复的问题"已保存"文章ID;和
  • 关于哪些文章被保存的查询将更难以制定,并且可能会运行得更慢;部分是因为
  • 您无法对ArticlesSaved列进行有意义的索引。

模拟多对多关系(例如用户和文章之间)的常用方法是通过单独的表格。在这种情况下,这样的表对于每个(用户,保存的文章)对都有一行。

答案 2 :(得分:1)

在数据库字段中以CSV格式保存数据(几乎)绝不是一个好主意。你应该有3个表:

  • 1表描述用户直接与用户有关的所有内容
  • 1个描述包含相关数据的文章的表
  • 1个包含2列的表" userid"和" articleid"连接两者。如果用户为10篇文章添加了书签,则该表将包含10条记录,每次都有不同的aticleid。