如何使用MongoDB建模数据

3
我们有一个相对较大规模的应用程序,使用关系型数据库(MSSQL)。经过大量阅读后,我决定要考虑使用MongoDB而不是MSSQL,主要原因是性能和规模问题。
我阅读并研究了Mongo,但无法找到以下问题的答案:
1. 我们是否应该这样做?请注意,我们有时间投入,唯一的问题是“对我们有好处吗?” 2. 如何建立我们的数据模型?
我的问题是,在我们的数据库中有很多一对多的关系。在阅读了this great post(以及second part)之后,我意识到一个好的实践是将决策分为3种情况:
1. 一对少数 2. 一对多 3. 一对很多。
在我们的数据库中,大多数情况下我们使用一对多,但问题是大多数情况下它是相同的“一”。 例如,我们有用户和交易表。每个用户都可以执行交易,因此我应该将用户建模如下: { "name": "John", ..., "Transactions" : [ObjectId("..."), ObjectId("..."),...] } 到目前为止还好,问题是我们有更多不仅仅是交易的内容,例如我们可能会有:帖子、请求和许多像交易这样的功能,然后我的用户集合变得非常庞大(超过25个“列”)。而且当我想要检索数据集时,我必须进行几个查询,不像MSSQL,我只使用Join语句。 另一个问题是我将不得不保存大量的额外数据,例如,对于每个交易,我必须保存终端ID,在报告中我将不得不显示终端名称,在这种情况下(据我所知),我有两个选择,一个是进行2个查询,另一个是也保存终端名称。在关系型数据库中,这是一个简单的连接。 因此,也许对于像我们这样的方案,Mongo(或任何其他基于文档的DB)不是最好的选择?
  • 我知道这些是新手问题 :)
  • 我们在服务器端使用c# (ASP.Net Web API)

提前感谢!


“超过25列”不是问题,你可以在用户对象中保留更多。关于连接:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ - malcolm
谢谢@malcolm,我熟悉这个查找方法,但据我所知,这不是使用Mongo而是滥用它,对吧? - Shaul Zuarets
Shaul Zuarets 您的 MS SQL 数据库有多大?我的意思是数据库的大小为多少 MB、GB 或 TB?什么样的数据会让数据库变得很大(文本、blob、索引)?您的读取与写入比例是多少? - Vasyl Zvarydchuk
1个回答

2
您在使用2和3个方法模拟数据时可能会面临一些严重的问题:
对于“一对多”,您可能会面临数据不一致或最终一致性的问题。在这种情况下,您可以将外部文档的索引(引用数组)存储在文档内部。因此,在您的示例中添加新事务需要两个请求:创建一个事务并将其引用添加到用户(更新文档)。MongoDB仅在文档级别具有ACID事务,因此对于您的情况,应用程序出于某种原因可以创建事务但未将其引用添加到用户中。这可能是应用程序故障、网络问题、错误等。当然,您可以使用try/catch块在应用程序中模拟数据库事务,当出现错误时进行数据清理。这会有所帮助,但并不完全,因为应用程序可能会在请求之间崩溃。 因此,如果您的应用程序负载较高,则在一段时间后,您可能会有一些未与任何用户关联的“死”事务。如果您的应用程序仅通过用户查询交易而不是直接查询交易,则在数据库中只会有无用数据。否则,您将面临数据不一致性的问题。 要解决这个问题,您需要创建后台作业来进行适当的清理。因此,在一段时间内,您的数据可能会不一致-最终一致性。对于某些应用程序,这可能是可以接受的,而对于其他应用程序则不是。 在删除交易时,您可能会遇到相同的问题。 我同意,具有25个引用数组(列)的文档看起来并不好。手动处理这样的对象将更加困难(测试、手动数据修复等)。
对于“一对数十亿”,没有这种影响,但您需要索引以有效查询。对于大型共享数据库,性能可能会很差。
总的来说,如果你的应用程序主要使用一个文档(聚合)并且没有太多参考其他文档,并且不需要文档之间的事务,则文档数据库非常好。去规范化也可能是不一致性的源泉。
键值数据非常容易扩展。文档数据库是接近键值数据存储的一步。列式数据库甚至更接近键值,因此可以更好地扩展。
另外,我建议您考虑以下措施来改善SQL Server数据库的性能:
  1. 缓存 - 或许您可以将一些应用程序聚合数据进行缓存,而不是每次都在 SQL 数据库中进行连接。例如,Stack Overflow 使用 SQL Server 数据库和 Redis 进行缓存聚合数据(包括问题、回答、评论等)。

  2. 通过索引、数据库结构、去规范化等方式优化查询性能。

  3. 如果您的数据库托管在本地 SQL Server 中,则可以增加内存、SSD 硬盘、表分区、数据压缩、复制等来提高性能。一般来说,采用这些方法处理大小不超过 1 TB 的数据库可以获得良好的 SQL Server 性能。

  4. CQRS 方法

  5. 考虑将应用程序数据存储在不同的数据库中。每种类型的数据库都有其优点和缺点。文档型数据库适合存储聚合数据,SQL 数据库适合关系型数据等。通常,复杂的应用程序会使用多种数据库类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接