gpt4 book ai didi

c# - CRUD场景的NoSql更新机制

转载 作者:行者123 更新时间:2023-11-30 18:40:41 27 4
gpt4 key购买 nike

我有 Orm 框架的经验,我开始了解 NoSql 数据库解决方案的结构。我将继续使用一些基于对象模型的示例。

我有以下文档模型,我想考虑一些场景处理。

  1. 保存带有几个标签的帖子
  2. 显示带有帖子数的标签列表
  3. 更新标签

public class Post
{
public string Title { get; set; }
public List<Tag> Tags { get; set; }
}

public class Tag
{
public string Name { get; set; }
}

关于我的场景,我的脑海中几乎没有出现问题。

Post 类是一个文档,将用标签保存。在 RDBMS 中,Tag 和 Post 具有多对多关系,但我知道它在 NoSql 中没有任何关系,因此 post 对象与整个成员一起保存。因此显示带有 post 计数场景的标签列表将导致整个 post 项目中的大量查询在每个查询中都付出一些努力,所以在这种情况下我不会失去 NoSql 功能的所有好处吗?

更新一个标签名会不会引起一些复杂的工作?我必须查询整个帖子项目并发现它具有该标签名称并更新它。顺便说一下,它需要多文档事务和漫长的过程,所以失败会导致我的数据库不一致,因为 NoSql 不支持多文档事务,所以我该如何处理?

我并不是要针对 RDBMS(Sql) 系统展示 NoSql 的缺点。我只是想了解我对这种情况的想法是否正确,可能有一些我错过的东西,或者看起来很糟糕的事情并不像我想的那样糟糕。我需要可扩展性,因此我对 NoSql 解决方案感兴趣。

最佳答案

起初,NoSQL 只是一个流行语,它涵盖了许多不同的数据库类型,例如键值存储、文档存储、图形数据库……参见 http://nosql-database.org/有关不同类型和实现的列表。其中一些系统还具有交易保证,例如对于您的情况,帖子已完全写入数据库。

我现在将关注键值存储,因为它们似乎是一个非常突出的 NoSQL 实例。

关于您的第一个问题:您是对的,人们不会在 RDBMS 中使用像外键这样的严格关系,但您只会保留与帖子实例关联的标签列表:

| pid | title | tags
| 1 | foo | sql, rdbms
| 2 | bar | sql, acid
...

为了按标签查询,您有一个所谓的倒排索引 ( http://en.wikipedia.org/wiki/Inverted_index ),它为您提供一个标签的所有文档 ID:

| tag   | pids
| sql | 1, 2
| rdbms | 1
| acid | 2

这使得进行帖子计数变得非常容易。

更新标签名称实际上并没有那么复杂,如果你有一个基于 map-reduce 的数据访问,那么你可以,例如使用简单的作业(伪代码)将标签“Sql”更新为“SQL”:

map:    IF post.tag contains('Sql') THEN emit(post)

reduce: in post.tag: replace('Sql' by 'SQL')
write(post)

但我不认为重命名标签是一件很常见的事情。 Brewer 在 CAP 定理 (http://en.wikipedia.org/wiki/CAP_theorem) 中陈述了处理时间长和不一致的问题,它基本上说你不能同时拥有一致性、可用性和分区容忍度,你必须至少交换一个对于另外两个。在你的情况下:如果你想对标签进行一致的更新(这样就不能读取两个文档,其中一个有标签“Sql”而另一个已经有“SQL”),你必须为其他人锁定表读者,因此您将没有空位。

最后的想法:如果你想构建一个高可用性、良好的扩展平台,你不想以关系的方式考虑太多。

关于c# - CRUD场景的NoSql更新机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7842092/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com