0

我和我的团队都是 NoSQL 的初学者,还在一个项目中使用带有 SQL Server 2008 的实体框架,但随着时间的推移,项目变得更大更复杂,EF 并没有为我们解决更多问题,我们决定采用MongoDB,但是由于范式转换很大,我们仍然有很多疑问,我将它们发布在这里,看看你们的想法和意见。

我有实体“Person Fisica”、“Patient”和“professional”,并且患者和专业人员都是 Person,但在片刻之后,患者和专业人员将是同一个人前(一个专业的卫生单位,也是病人) 在 SQL Server 中,我们有一个病人,他有一个物理人的引用和一个专业的人,他也有一个人的引用当病人和专业人员是同一个人时,这两个人引用了同一个人,现在在 mongo 出现了疑问,一些这里的团队成员几乎都想做同样的事情,病人和专业组织都有这个人的 ID。现在我想让患者和专业人士拥有完整的对象Person,但是哦,这怎么会完整性呢?因为从技术上讲,患者的自然人与专业人员的自然人不同......这个问题和其他问题在这里让我们头疼,在几个共享的实体中,不知道我们是否将实体放在拥有它的对象中或者对象仅采用实体的 ID,与关系数据库中的方式相同。另一个例子:Health Unit 和 UnidadeDeSaude 的类型,一个类型的 Health Unit 有几个 Health Unit,一个 Health Unit 有一个类型,正确的做法是把 Unit Type 对象放在 Health Unit 中或者只是通过 Id 引用它? 在共享的多个实体中,不知道我们是否将实体放在拥有它的对象中,或者对象仅采用实体的 Id,与关系数据库中的方式相同。另一个例子:Health Unit 和 UnidadeDeSaude 的类型,一个类型的 Health Unit 有几个 Health Unit,一个 Health Unit 有一个类型,正确的做法是把 Unit Type 对象放在 Health Unit 中或者只是通过 Id 引用它? 在共享的多个实体中,不知道我们是否将实体放在拥有它的对象中,或者对象仅采用实体的 Id,与关系数据库中的方式相同。另一个例子:Health Unit 和 UnidadeDeSaude 的类型,一个类型的 Health Unit 有几个 Health Unit,一个 Health Unit 有一个类型,正确的做法是把 Unit Type 对象放在 Health Unit 中或者只是通过 Id 引用它?

谷歌搜索了几篇文章,但在这些情况下我们仍然存在疑问 http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/ http://blog.fiesta.cc/post /11319522700/演练-mongodb-data-modeling

4

1 回答 1

1

由于无法准确查看您拥有的内容,因此一般而言,在 MongoDB 中,您不会像使用 RDBMS 那样加入表。通常,如果您有一个 Person 实体,您会将整个 Person 存储为一个 Person。这是您的代码类的一个很好的映射。

如果您有对其他实体的引用,例如在 Patient 和 Professional 之间共享单个 Person 的位置,您可以使用 RDBMS 中的外键引用来执行此操作。您可以使用 Mongo 执行此操作,但 Mongo 不会为您执行 JOIN。这将由调用者完成。推荐的方法是将 Person 实体的副本放在 Patient 和 Professional 中。这样做的影响意味着,如果您更新 Person 实体,您现在必须在两个地方更新数据,但这并不一定像听起来那么糟糕。更新通常是“快速”的,并且您可以“原子地”更新两者,因此实际上这与更新单个实体之间几乎没有区别,只是您不必执行 JOIN,因此您的读取更简单且通常更快。

获取数据的最强大工具是文档(实体)上的集合(表)索引,以及您可以利用的任何方式将是返回数据的最快方式。因此,与直觉相反,如果您需要更频繁地过滤和处理文档的部分而不是整个文档,则最好将其分解为共享索引键的实体。这意味着将 Person、Patient 和 Professional 存储在同一个集合中并使用两个键。一个键由 Person 和它的派生类(Patient)共享,另一个是选择一个或另一个部分的类型鉴别器。换句话说,使用索引来查找整个实体或整个实体的集合。

除此之外,如果您使用索引来定位实体、Person、Patient 或 Professional,请阅读整个实体并让它包含您在没有 JOIN 的情况下完成请求所需的所有内容。因此,无论您请求 Patient 还是 Person(均指同一 Person),无论您读取哪个对象,您都会获得相同的 Person 数据。

简而言之,您将在 Mongo 中复制数据,几乎可以在您使用 SQL 中的 Join 的任何地方进行。

你能画出你的类层次结构吗?

于 2012-10-02T16:45:51.243 回答