我是MongoDB和NoSQL的新手。实际上,我有不同的后续问题,取决于如何回答这个问题。我会把我的后续问题作为一个单独的问题。开始吧..。
我试图建立一个数据库,以帮助我回答这样的问题:“找到所有的部门,每个部门的2(2)个或更多的团队都有2(2)个或更多的员工,这些员工所造成的事故比他们团队的max_accidents还要大。”如果允许我在MySQL中使用关系数据库,我将通过创建以下表来解决这个问题:
department:department_id, location_id (FK to a location table not described here), unit_type
team: team_id, department_id, max_accidents
employee: employee_id, team_id, accidents
然后我会使用这个查询(未经测试,但希望您能理解):
SELECT department_id FROM team
WHERE EXISTS (
SELECT 1 FROM department
WHERE department.department_id = team.team_id
AND team.team_id IN (
SELECT team_id FROM employee
WHERE EXISTS (
SELECT 1 FROM team
WHERE team.team_id = employee.team_id
AND employee.accidents > team.max_accidents
) GROUP BY team_id HAVING COUNT(*) >=2
)
) GROUP BY department_id HAVING COUNT(*) >= 2
根据我对NoSQL数据库的了解,我可以看到两种方法来建模我的集合。首先,我可以按照上面列出的表的方式对每个集合进行建模,这意味着存在外键。第二种可能的方法是:
department = {_id,teams:[]team};
team = {_id,max_accidents,employees:[]employee};
employee = {_id,accidents};
我的猜测是,我应该使用第二种方法来嵌入文档数组。然后,要执行我的查询,我需要学习如何使用MongoDB聚合框架,如下所示:
Compare embedded document to parent field with mongoDB
我可以在聚合方法的基础上,通过使用HAVING COUNT(*)
特性来实现$match
行为,如下所示:
What is the correct way to do a HAVING in a MongoDB GROUP BY?
如果我正确地处理这个问题,我想确认一下。如果不是的话,如果有人能解释我为什么会以错误的方式对待它,或者我可能需要关注什么,那就太好了。
发布于 2019-11-27 17:51:25
来自MongoDB文档
通常,
在以下情况下使用嵌入式数据模型:
实体之间的
一般来说,嵌入为读取操作提供了更好的性能,以及在单个数据库操作中请求和检索相关数据的能力。嵌入式数据模型使得在单个原子写入操作中更新相关数据成为可能。
这是一个足够公平的指导方针。不过,你可以根据你的情况打电话。
问问题:
如果答案是肯定的,就不会考虑嵌入式文档。
假设一名员工是多个团队的一部分。这意味着employee对象存在于多个文档中。
这会导致:数据重复,需要更多的存储,使更新冗余。
https://stackoverflow.com/questions/59080541
复制