我的项目有问题。相对而言,我将有以下表格:
用户
昵称密码会话
** Student、Teacher 和 Managerial 继承 Person ** ** 一个人就是一个用户 **
人
姓名姓氏 DNI
学生
鳕鱼学期
老师
codTeach型专业
管理的
codManag 部分类型收费
我应该嵌入所有表格并将它们放在一个集合中吗?
谢谢。
我的项目有问题。相对而言,我将有以下表格:
昵称密码会话
** Student、Teacher 和 Managerial 继承 Person ** ** 一个人就是一个用户 **
姓名姓氏 DNI
鳕鱼学期
codTeach型专业
codManag 部分类型收费
我应该嵌入所有表格并将它们放在一个集合中吗?
谢谢。
当您使用像 MongoDB 这样的文档存储时,您的模式设计在很大程度上受到访问模式或用户使用数据的方式的影响。这是一种数据的预连接/聚合。
编辑
由于您需要进行一般搜索,我建议将其存储在具有type
属性的单个集合中。因此,要搜索第二学期的所有学生,您将使用以下查询
db.users.find({"type":"student", "semester":2})
这不是您可以仅根据搜索条件做出的决定!您的问题的简单答案是:
这取决于!
当您在其中存储对象时,您在 MongoDB 中具有对象关系映射的所有(几乎所有)限制。
这里一般有3种方法!
第一的:
您可以将每个对象存储在其自己的集合中。对于搜索,您可以简单地将每棵树或所有树一起调用!
第二:您可以将孩子和父母分开在单独的集合中,并通过 Id 引用它们
{"name":"Steph", "semester":2, "personID":123}
这不是 mongoDB 中的最佳方法,因为它是一个文档库数据库,并且不支持跨 2 个集合的事务!但如果对象的大小超过 16MB,可能会有所帮助。
第三种方法是@Pangea 提到的:
使用区分键将所有对象存储在一个集合中!
{"type":"Student", "name":"Steph", "semester":2}
{"type":"Teacher", "name":"George", "Courses":[101,202,303,404]}
这有一个很大的缺点,你需要在做出决定之前知道。
除了在 MongoDB 中不太关心的规范化之外,集合的大小和维护也可能是一个问题!
然而主要的缺点是这样做你将你的对象规范混合在一个集合中,因此你不能用所有这些规范来传达。让我解释一下:假设您有唯一的教师姓名,但学生允许有重复的姓名。因此,您是否必须使集合中的名称字段唯一,因此学生必须具有与学生规范相矛盾的唯一名称。或者不要使名称字段唯一,因此它与教师规范相矛盾!
这三种方法中的哪一种有其自身的优点和缺点。但一般来说,我会选择第一种方法!因为它更易于理解、维护和扩展。但它是你的软件!您肯定会更好地了解您的软件要求和规格。所以你是唯一可以判断哪个更好的人!