2012-02-03 45 views
2

我一直在进入mongo,但来自RDBMS背景,面临着有关非规范化和一般数据建模的可能显而易见的问题。MongoDB - 非规范化/模型意见

如果我有子文档的阵列的文档类型,每个子文档都具有一个状态代码。

在关系世界我想补充一个外键记录,StatusId,简单。 在mongodb中,您是否会从“状态”中取消规范关键数据片段代码和desc并坚持objectid引用另一个正确的状态集合。我想下一个问题是设计之一,如果状态文档被修改,那么我需要修改非规格化数据?

同一主题的另一个问题是如何将您的模型在一个事务表,说我有事件和人物,事件可能是相当精细,说哪个随着时间的推移可能会导致多条记录考勤表。根据我所看到的,这看起来像是一个适合儿童/子文档的候选人,当然这可以用于速度索引。

因此是可以查询/找到刚才的子阵列或它的一部分?考虑到文档大小的限制为16mb,并且我限制了该人的交易记录?或者,交易记录是否应该是一个单独的收集,并附带一个引用该人的onjid?

感谢任何输入

山姆

回答

3

还是应该交易记录是一个单独的收集与一个onjid引用人?

也许我认为this S/O question可能会帮助你理解为什么。

如果状态文档被修改我会需要修改非规范化的数据?

是的这是在MongoDB中的标准折衷。你会遇到这个问题很多。您可能需要利用队列结构来确保数据在多个集合中保持一致。

因此有可能查询/查找子数组或其中的一部分?

这是一个特定于MongoDB的难题。使用基本的查询语法,您只能处理对象数组的有限支持。新的“Aggregration Framework”在这里实际上好得多,但它在稳定版本中不可用。

1

你所有的“如何建模这个或那个”真的不能回答,因为良好的架构设计取决于很多因素(接入patters,硬件特性,是使用集群等)。

如果状态文档被修改我会需要修改非规范化的数据?

通常是的,这denormalisation的缺点。但有时你不必(某些社交网站的商店用户名带有照片标签,并且在用户更改他的名字时不更新)。

查询/找到刚才的子阵列或它的一部分?

目前不能仅获取数组的一部分(当然,除非使用map/reduce)。

而鉴于4MB限制

你从哪儿弄来的?现在是16mb。

+0

谢谢塞尔吉奥,当然,我并没有要求一个明确的manswer - 更真实的使用mongo/nosql的其他经验。从我看过的最近的网络广播中的4MB,显然有点老(sry) – sambomartin 2012-02-03 22:48:37

0

虽然模式设计确实考虑了很多因素,但是对数据进行非规范化的需求通常会出现在某处。我倾向于利用非规范化的我的应用程序使用MongoDB的,因为我觉得它很适合存储非规范化的数据:

  • 没有额外列哈希和数组作为字段类型维护
  • 支持(完善的用于存储非规范化字段)
  • 迅速的,无阻塞的写入使同步数据更便宜
  • 文件的大小,生长仅轻微影响性能达到极限(为大部分)

有几个宝石可以帮助您管理非规范化数据,包括设置并保持同步。如果你使用的是Mongoid,你可以试试mongoid_alize。免责声明:我是mongoid_alize的作者和维护者。