【发布时间】:2018-03-16 22:00:05
【问题描述】:
我有一个一直使用 C#、Entity Framework 和 SQL Server 的活动项目。然而,随着 NoSQL 替代方案的可行性日益增加,我正在研究将项目切换到使用 MongoDB 的所有影响。
很明显,主要的过渡障碍是由于“无模式”。 MongoDB 官方文档中的 here 很好地总结了 C# 等语言的含义。以下是最有用的相关段落(加粗):
仅仅因为 MongoDB 是无模式的并不意味着您的代码可以 处理无模式文档。最有可能的是,如果您使用的是 像 C# 或 VB.NET 这样的静态类型语言,那么您的代码不是 灵活,需要映射到已知架构。
架构可以通过多种不同方式更改 您的应用程序的版本到下一个。
如何处理这些取决于您。有两种不同的策略: 编写升级脚本。逐步更新您的文档,因为它们 被使用。 最简单的策略是编写升级脚本。有 关系数据库之间的这种方法实际上没有区别 (SQL Server、Oracle)和 MongoDB。 确定需要 更改并更新它们。
或者,大多数关系数据库不支持,是 增量升级。这个想法是您的文档得到更新 因为它们被使用。从未使用过的文档永远不会更新。 正因为如此,你需要一些明确的陷阱 知道。
首先,查询一半文档是版本 1 的架构 一半的文档是版本 2 可能会出错。例如,如果 你重命名一个元素,那么你的查询将需要测试旧的 元素名称和新元素名称来获取所有结果。
其次,任何增量升级代码都必须保留在代码库中,直到 所有文件都已升级。例如,如果有 一个文档的 3 个版本,[1, 2, 3] 我们删除了升级代码 从版本 1 到版本 2,任何仍作为版本存在的文档 1 个不可升级。
SQL 生态系统中用于管理/创建此类初始化或升级脚本的工具非常成熟(例如Entity Framework Migrations)
虽然在 NoSQL 世界 (though some believe there should not be) 中有可用于此类升级的 similar tools 和 homemade scripts,但似乎对于“何时”和“如何”运行这些升级脚本的共识较少。 Some 部署后建议。不幸的是,这种方法(当不与增量更新结合使用时)在尝试读取 C# 模型已更改的现有数据时会使应用程序处于不可用状态。
如果
对于像 C# 这样的静态 .NET 语言来说确实是最简单/推荐的方法,在 NoSql 数据库中是否有针对这些语言的代码优先模式迁移的现有工具?还是 NoSql 生态系统还没有成熟?
如果您不同意 MongoDB 的建议,什么是更好的实现,您能否提供一些参考/示例,说明我在哪里可以看到该实现的使用?
【问题讨论】:
-
NoSQL 数据库有很多种类型,你不能说成熟度和工具。 db-engines.com/en/ranking
-
成熟度的重要来源可能是 SQL 之类的标准,但在 NoSQL 中几乎没有标准。即使存在像 SPARQL 这样的图形数据库,它也不会被一些流行的实现所尊重。恕我直言,对于行业和一些认为提供专有解决方案是好的而实际上并非如此的强大品牌来说,这是一种耻辱。
-
即使脚本迁移的方法是最简单的方法,它也像是试图在 NoSQL 中模仿 SQL DB。更好的方法是接受 NoSQL 有很大的活力,它也应该影响编码风格和模式
-
@AndrzejMartyna 你能否给我一个更好的参考,说明如何处理这种 NoSQL “动态”应该影响 C# 中的编码风格和模式,而不是 I referenced from mongoDb's website?工具和文档的存在似乎比仅仅[您所指的 db-engines.com 网站中的“参考”方法](db-engines.com/en/ranking_definition.
-
对这个问题缺乏兴趣,再加上网络上缺乏关于这个主题的信息,这让我相信没有可用的解决方案来让这些技术在我们的生产环境中运行,而无需大量投资滚动我们自己的解决方案来管理我们的 C# 模型更改时的架构更改。
标签: c# .net mongodb azure-cosmosdb entity-framework-migrations