我有一个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 4419350002044764160
和4419351050184556544
的文章。
这是在数据库中存储这样的东西的正确方法吗?如果有更好的方法,有人可以解释一下吗?
我想到的另一个选项是为每个用户创建一个单独的表,我可以将他们保存的文章的ID存储到列中,尽管这篇文章的答案不是很有效:{{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
列数据类型的限制; ArticlesSaved
列进行有意义的索引。模拟多对多关系(例如用户和文章之间)的常用方法是通过单独的表格。在这种情况下,这样的表对于每个(用户,保存的文章)对都有一行。
答案 2 :(得分:1)
在数据库字段中以CSV格式保存数据(几乎)绝不是一个好主意。你应该有3个表: