SQL 关系在 NoSQL 模式中
SQL relations in NoSQL Schemas
所以我需要从下一个 SQL 数据库设计 NoSQL 模式(Mongoose)。
Image of SQL database
所以我有几个关于如何制作这些模式的问题:
- tablecourse_student 中有一个名为 entryDate 的字段。我将这个字段存储在什么模式中,如何将它连接到其他模式? (指一个学生进入特定课程的日期)(course_teacher table 中 startDate 的情况也是如此)
- 在 Admin、Teacher 和 Student Schemas 中,我如何从 PersonSchema 继承所有属性(Discrimantor 是这种情况吗?),或者我是否将它们的所有字段存储在 PersonSchema 中(我不喜欢这种情况,因为在 "admin" 的情况下,教师和学生字段将全部为 NULL)
- (Optional)另外,如何处理多对多关系的非规范化情况? (假设没有 course_teacher table,并且 teachers & courses 与多对多关系相连)
在 Mongo 中,与在 SQL 中一样,您可以通过多种方式构建数据。 Mongo 中要考虑的关键是您需要如何访问数据。尝试以匹配您期望执行的查询的方式对数据进行分组。使用该上下文,我将尝试回答您的一些具体问题:
1) 您询问将学生的 entryDate 存储到 class 的何处。你经常独立拉学生吗?还是你总是用 classes 抓住他们?您是否独立需要 classes?
一种选择是将 classes 嵌套在您的学生中:
学生=>
{
firstName: "John",
lastName: "Smith",
classes: [{
classCode: "EN101",
entryDate: "10/10/2017"
}]
}
如果您通常只访问一次,您还可以拥有一个包含学生列表的 class 对象:
Class =>
{
classCode: "En101"
students: [{
studentId: 12345,
firstName: "John",
lastName: "Smith,
entryDate: "10/10/2017"
}]
}
如果您经常单独引用事物,您可以像 SQL 中那样有一个平面 table,它只有 classCode、studentId、studentEntryDate
这些对象都存储在一个table?如果是这样的话,这听起来像是对鉴别器的一种很好的使用。就像你只有一个人物集合一样。但是,我猜想它们是分开存储的?教师和学生存储在不同的集合中?在那种情况下,您可以让它们在代码中继承相同的 class,它们将很好地序列化为 mongo,而无需任何鉴别器。
有多种方法可以解决这个问题。您可以为每个 table 创建集合并维护一个链接 table,但通常不是最好的方法。我认为教师和课程是一对多而不是多对多?所以每门课程都会有一位老师。如果课程确实有很多教师,您可以只使用教师列表而不是名为教师的字段。
希望我的回答很清楚,欢迎发表评论以了解更多信息。
如果您是 Mongo 的新手,我建议您免费注册一些 courses。很有用,打好基础
祝你切换到 mongo 好运。值得!
下面是两个比较 RDBMS 和 NoSQL 数据库的好资源。
所以我需要从下一个 SQL 数据库设计 NoSQL 模式(Mongoose)。 Image of SQL database
所以我有几个关于如何制作这些模式的问题:
- tablecourse_student 中有一个名为 entryDate 的字段。我将这个字段存储在什么模式中,如何将它连接到其他模式? (指一个学生进入特定课程的日期)(course_teacher table 中 startDate 的情况也是如此)
- 在 Admin、Teacher 和 Student Schemas 中,我如何从 PersonSchema 继承所有属性(Discrimantor 是这种情况吗?),或者我是否将它们的所有字段存储在 PersonSchema 中(我不喜欢这种情况,因为在 "admin" 的情况下,教师和学生字段将全部为 NULL)
- (Optional)另外,如何处理多对多关系的非规范化情况? (假设没有 course_teacher table,并且 teachers & courses 与多对多关系相连)
在 Mongo 中,与在 SQL 中一样,您可以通过多种方式构建数据。 Mongo 中要考虑的关键是您需要如何访问数据。尝试以匹配您期望执行的查询的方式对数据进行分组。使用该上下文,我将尝试回答您的一些具体问题:
1) 您询问将学生的 entryDate 存储到 class 的何处。你经常独立拉学生吗?还是你总是用 classes 抓住他们?您是否独立需要 classes?
一种选择是将 classes 嵌套在您的学生中: 学生=>
{
firstName: "John",
lastName: "Smith",
classes: [{
classCode: "EN101",
entryDate: "10/10/2017"
}]
}
如果您通常只访问一次,您还可以拥有一个包含学生列表的 class 对象: Class =>
{
classCode: "En101"
students: [{
studentId: 12345,
firstName: "John",
lastName: "Smith,
entryDate: "10/10/2017"
}]
}
如果您经常单独引用事物,您可以像 SQL 中那样有一个平面 table,它只有 classCode、studentId、studentEntryDate
这些对象都存储在一个table?如果是这样的话,这听起来像是对鉴别器的一种很好的使用。就像你只有一个人物集合一样。但是,我猜想它们是分开存储的?教师和学生存储在不同的集合中?在那种情况下,您可以让它们在代码中继承相同的 class,它们将很好地序列化为 mongo,而无需任何鉴别器。
有多种方法可以解决这个问题。您可以为每个 table 创建集合并维护一个链接 table,但通常不是最好的方法。我认为教师和课程是一对多而不是多对多?所以每门课程都会有一位老师。如果课程确实有很多教师,您可以只使用教师列表而不是名为教师的字段。
希望我的回答很清楚,欢迎发表评论以了解更多信息。
如果您是 Mongo 的新手,我建议您免费注册一些 courses。很有用,打好基础
祝你切换到 mongo 好运。值得!
下面是两个比较 RDBMS 和 NoSQL 数据库的好资源。