如何使用NoSQL进行数据建模

时间:2012-10-02 15:02:15

标签: asp.net-mvc mongodb database nosql

我和我的团队都是NoSQL的初学者,他们仍然在项目中使用SQL Server 2008的实体框架,但随着时间的推移,项目变得越来越大,而且比EF不能为我们解决更多问题,我们决定采用MongoDB,但由于模式的转变,我们仍有很多疑问,我会在这里发帖看看你们的想法和意见。

我有实体“人Fisica”,“患者”和“专业”,患者和专业人员都是人,但是片刻之后患者和专业人员将是同一个人(一个专业的健康单位,也是有耐心的)在SQL Server中,我们有一个患者提到了物理人,而专业人员也提到了人,当患者和专业人员是同一个人时,两个人都提到同一个人,现在在mongo出现了怀疑,这里的一些团队成员想要做同样的事情,患者和专业组织都有人的身份。现在我想让患者和专业人士拥有完整的对象人物,但是哦,这将如何完整?因为从技术上来说,患者的物理人员与专业人员不同......这个和其他问题在这里打破了我们的头脑,在共享的几个实体中不知道我们是否将实体放在具有它的对象中或者对象仅采用实体的Id,与关系DB中的方式相同。另一个例子:健康单位和UnidadeDeSaude的类型,一种健康单位有几个健康单位,健康单位有一个类型,正确的方法是将单位类型对象放在健康单位或只是通过标识引用它?

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

1 个答案:

答案 0 :(得分:1)

如果没有能够准确地看到你拥有的内容,那么一般来说,在MongoDB中,你不会像使用RDBMS一样加入表。通常,如果您有Person实体,则将整个Person存储为Person。这是一个很好的代码类映射。

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

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

除此之外,如果您使用索引查找实体,人员,患者或专业人员,请阅读整个实体,并将其包含在没有JOIN的情况下完成请求所需的所有内容。因此,无论您是请求患者还是人(均指同一个人),您都可以获得相同的人员数据,无论您阅读哪个对象。

简而言之,您将在Mongo中复制数据,几乎就是您在使用SQL中的任何地方。

您是否能够绘制类层次结构的样子?