noSQL和规范化数据

5
我在考虑开始我的第一个CouchDB项目,但由于我有ORM背景,我担心如何创建可能难以维护的文档。
例如,如果我有以下模型:
A *--->(1)B
这意味着对于每个A对象,都有一个B对象,并且有许多A实例可以共享一个B对象。在这种情况下,在A中有指向B的指针/外键。
我可以创建一个包含所有A数据和B数据的文档。然而,我的问题是,如果在以后的某个阶段(创建了10000个文档之后),我可能需要更改一些数据,这意味着我必须更新所有文档。
在ORM /规范化数据库世界中,我只需更新B,所有引用现在都更新到了数据库中。
在CouchDB中我该如何处理这个问题,或者说NoSQL方法不适合这些类型的情况吗?
1个回答

5
这个问题的一般答案是: 这个问题没有一般答案。 重点在于,在NoSQL中,数据结构不是由数据本身决定的,而是由数据结构必须支持的查询所决定的。因此,与其针对每一个1:N或M:N关联问题使用相同的模式,NoSQL的方式是根据您特定的需求使用不同的模式。例如:
- 写入/读取比率 - 特定数据库功能是否使嵌入更容易或更难 - 需要支持的查询类型 - 性能考虑:数据如何被索引、分片、联合或以任何其他方式拆分或缓存
一般来说,我认为初学者倾向于“过度嵌入”,但我只能代表MongoDB说话。嵌入是一项强大的功能,但嵌入对象不是“一等公民”,因此不应将其用作每个1:n关系的替代品。只适用于一部分情况 :)

3
同意。我认为有两个主要指标: a)您更改嵌入式对象的次数有多少次 b)您是否需要每次显示父对象时都显示嵌入式对象?如果是这样,您在哪种设备上执行此操作(例如,是否可以进行查询)。 因为如果它仅在100,000份文件中更改一次,那么将其嵌入存储并进行一次更改可能更容易,而不是每次显示对象时查询。 - rit
@mneomosyn: 当你说“过度嵌入”时,是指使用引用还是包含所有所需数据的文档? - JD.
我的意思是包含其他文档的文档。我认为@rit指出了一些有用的标准来确定是否嵌入文档或使用引用。 - mnemosyn
1
@JD。是的,我建议您将文档嵌入其中,因为它看起来非常小(例如IP地址)。如果您经常查询它,那么您的速度将非常快。 - rit
谢谢大家。这是我第一次尝试使用NoSQL,所以我会努力确保考虑到你们提出的问题。如果我需要更改嵌入式IP地址,您会离线更改还是像任何请求一样通过UI进行更改(通过UI会花费一些时间)? - JD.
显示剩余2条评论

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