【发布时间】:2013-04-28 17:16:44
【问题描述】:
我的项目有问题。相对而言,我会有以下表格:
用户
昵称 密码 会话
** Student、Teacher 和 Managerial 继承 Person ** **一个人就是一个用户**
人
名称 姓 DNI
学生
鳕鱼 学期
老师
codTeach 类型 专业
管理
鳕鱼管理 部分 类型 收费
我应该嵌入所有表格并将它们放在一个集合中吗?
谢谢。
【问题讨论】:
我的项目有问题。相对而言,我会有以下表格:
昵称 密码 会话
** Student、Teacher 和 Managerial 继承 Person ** **一个人就是一个用户**
名称 姓 DNI
鳕鱼 学期
codTeach 类型 专业
鳕鱼管理 部分 类型 收费
我应该嵌入所有表格并将它们放在一个集合中吗?
谢谢。
【问题讨论】:
当您使用像 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 中不太关心的规范化之外, 收藏的大小和维护可能是个问题!
然而,主要的缺点是这样做你将你的对象规范混合在一个集合中,因此你不能用所有这些规范来传达。 让我再解释一下: 假设您有唯一的教师姓名,但学生允许有重复的姓名。 因此,您是否必须使集合中的名称字段唯一,因此学生必须具有与学生规范相矛盾的唯一名称。或者不要使名称字段唯一,因此它与教师规范相矛盾!
这三种方法中的哪一种各有优缺点。但一般来说,我会选择第一种方法!因为它更易于理解、维护和扩展。 但它是你的软件!您肯定会更好地了解您的软件要求和规格。所以只有你才能判断哪个更好!
【讨论】: