我正在阅读关于NoSQL的事情。我知道它不是基于关系,但我无法弄清楚如何做一些基本的事情。 (我没有找到关于它的真实示例代码)。
我想存储用户,帖子和评论。
SQL版本:
user's table: user_id, username
posts's table: post_id, user_id, content
comments's table: comment_id, content
好的,简单。
在NoSQL中,我选择的是(100%功能,我现在不使用像MongoDB等任何技术):
users:
{
id: XX,
username: "John"
},
{
id: OO,
username: "Mike"
}
posts:
{
id: YY,
content: "How are you all ?",
user: {
id: OO,
username: "Mike"
},
comments: {
id: ZZ,
content: "Fine",
user: {
id: XX,
username: "John"
}
}
}
我本可以在帖子和评论中存储用户的id来代替整个用户,但我使用的是NoSQL,而不是SQL,所以我没有这样做。
首先?这种数据模型对NoSQL来说是否合适?
其次,如果上一个问题是,如果用户XX(John)更改其“Tony”用户名怎么办?我可能需要更新他的所有帖子,每个评论都一样吗?!让我们想象一下,在用户的生命中发布了10 000多条评论,wtf。所以我猜我做错了。
你能否澄清我的误解?
答案 0 :(得分:0)
问题的问题在于它假设所有NoSQL数据库都以相同的方式工作,基于问题看起来您的问题可能与如何存储"文档" (JSON)在数据库中以稍后可以检索内容的方式,我将从Document Stores的角度回答这个问题:
正如您已经发现NoSQL不提供关系,因此您需要手动处理此问题。在NoSQL World中,去规范化通常是确保您可以在较少往返数据库中检索文档的第一步,因此您将这些用户名添加到帖子中的方法是典型方法。
您所说的问题完全有效,如果用户名更改会发生什么?它有效但不太真实,博客中的用户名通常是所有内容的关键,所以改变它是一种很大的改变,而且通常不允许。
要执行关系,您可以稍后检索带有id的文档,并在需要时存储ID,这样您就可以像在SQL世界中那样规范化数据库,在这种情况下,您可能需要使用索引来确保如果id是用户而不是文档内部id,则使用用户名作为文档本身的id,这是一个很好的性能。在djondb将是这样的:
{
"_id": "myuser",
"name": "Cross"
}
,博客将有
{
"userid": "myuser",
"content": "Hello world"
}
现在,如果您需要更新多个文档怎么办?在这种情况下,您需要djondb,一个支持多个文档交易的文档数据库,以保持数据库的一致性
有关数据建模的更多信息:http://djondb.com/nosql-masterdetail-sample/
有关djondb中交易的更多信息:http://djondb.com/section/transactions/
免责声明:我与djondb合作,所以我总是有偏见!
希望这有帮助,