mongodb - 文档数据库如何处理对象之间不断变化的关系(或者根本不处理)?

标签 mongodb relational-database document-database

假设,在项目开始时,我想存储一组公司,并在每个公司内存储一组员工。

由于我使用的是文档数据库(例如 MongoDB),因此我的结构可能如下所示:

+ Customers[]
   +--Customer
      +--Employees[]
         +--Employee
         +--Employee
   +--Customer
      +--Employees[]
         +--Employee

如果以后出现新的要求,让一些员工在多家公司工作,会发生什么?

如何管理文档数据库中的这种更改?

文档数据库的简单性是否会成为您最大的敌人,因为它会创建不易修改的脆弱数据结构?

在上面的示例中,我必须运行修改脚本来创建一个新的“员工”集合,并将每个员工移动到该集合中,同时维护某种关系键(例如每个员工的 CompanyID)。

如果我足够彻底地完成上述操作,我最终会得到许多集合,但层次结构很少,并且文档通过键连接。

那么,我是否仍然按应有的方式使用文档数据库?

它不是变得更像关系数据库了吗?

最佳答案

具体来说 MongoDB...因为该数据库不像关系数据库那样强制执行任何关系,所以您需要维护诸如此类的任何类型的数据完整性。它在许多情况下都非常有用,但您最终会编写更多的应用程序代码来处理此类事情。

话虽如此,使用 MongoDB 这样的系统的关键是对数据进行建模以适应 MongoDB。如果您使用 MySQL,那么上面的内容是完全有意义的...使用 Mongo,如果您像关系数据库一样构建数据,那么您绝对会遇到麻烦。

如果您有可以在一个或多个公司工作的员工,我会将其结构如下:

// company records
{ _id: 12345, name : 'Apple' }
{ _id: 55555, name : 'Pixar' }
{ _id: 67890, name : 'Microsoft' }

// employees
{ _id : ObjectId('abc123'), name : "Steve Jobs", companies : [ 12345, 55555 ] }
{ _id : ObjectId('abc456'), name : "Steve Ballmer", companies : [ 67890 ] }

您可以在 employees.companies 上添加一个索引,这样可以非常快速地获取为给定公司工作的所有员工...无论他们为多少家公司工作。维护每个员工的简短公司列表比维护公司的大量员工列表要容易得多。要获取公司及其所有员工的所有数据将需要两个(快速)查询。

Doesn't the simplicity of a document database become your worse enemy, since it creates brittle data structures which can't easily be modified?

简单性可能会让您感到困扰,但以后更新和更改非常容易。您可以通过 Javascript 编写更改脚本并通过 Mongo shell 运行它们。

关于mongodb - 文档数据库如何处理对象之间不断变化的关系(或者根本不处理)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146401/

相关文章:

c# - 从 MongoDB 数组中删除元素

java - 文件存储服务器

database - 数据库的层次模型和网络模型到底有什么问题?

database - DBMS 中的非平凡函数依赖

mysql - 使用 Null 字段来表示某些东西?

nosql - 我们是否应该对文档中的数据进行非规范化以提高性能? (文档数据库)

document-database - 如何对文档数据库中的家谱等结构进行建模

MongoDB - 查找值为空或小于 X 的结果

mongodb - mongoexport 不会将任何记录写入 json 输出文件

c# - 按类型属性查询 Cosmos DB