【问题标题】:SQL relations in NoSQL Schemas [closed]NoSQL 模式中的 SQL 关系 [关闭]
【发布时间】:2018-03-12 05:42:09
【问题描述】:

所以我需要从下一个 SQL 数据库设计 NoSQL 模式(Mongoose)。 Image of SQL database

所以我有几个关于如何制作这些 Schemas 的问题:

  1. course_student 表中有一个名为 entryDate 的字段。我将此字段存储在什么架构中,如何将其连接到其他架构? (指一个学生进入特定课程的日期)(对于 course_teacher 表中的 startDate 也是如此)
  2. 在 Admin、Teacher 和 Student Schema 中,我如何从 PersonSchema 继承所有属性(判别器是这种情况吗?),还是将它们的所有字段存储在 PersonSchema 中(我不喜欢这种情况,因为在“admin”的情况下,教师和学生字段将全部为 NULL)
  3. (可选)另外,如何处理多对多关系的非规范化情况? (假设没有course_teacher表,teacherscourses是多对多关系)

【问题讨论】:

    标签: mysql node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    在 Mongo 中,与在 SQL 中一样,您可以通过多种方式构建数据。在 Mongo 中要考虑的关键是您需要如何访问数据。尝试以匹配您期望执行的查询的方式对数据进行分组。使用该上下文,我将尝试回答您的一些具体问题:

    1) 您询问将学生的 entryDate 存储到课程中的位置。你经常独立拉学生吗?或者你总是在他们的课上抓住他们?你需要独立上课吗?

    一种选择是在你的学生中嵌套类: 学生 =>

    {
       firstName: "John",
       lastName: "Smith",
       classes: [{
          classCode: "EN101",
          entryDate: "10/10/2017"
       }]
    }
    

    如果您通常访问一次,您还可以拥有一个包含学生列表的类对象: 类 =>

    {
       classCode: "En101"
       students: [{
          studentId: 12345,
          firstName: "John",
          lastName: "Smith,
          entryDate: "10/10/2017"
       }]
    }
    

    如果您经常单独引用事物,您可以在 SQL 中创建一个只有 classCode、studentId、studentEntryDate 的平面表

    1. 这些对象都存储在一个表中?如果是这样,这听起来像是对鉴别器的一种很好的使用。就像你只有一个 People 集合一样。但是,我猜它们是分开存储的?教师和学生存储在不同的集合中?在这种情况下,您可以让它们在代码中继承相同的类,并且它们将很好地序列化为 mongo 而没有任何鉴别器。

    2. 有多种方法可以处理此问题。您可以为每个表创建集合并维护一个链接表,但通常不是最好的方法。我认为教师和课程将是一对多而不是多对多?所以每门课都会有老师。如果课程确实有很多老师,您可以只拥有一个老师列表而不是一个名为teacher的字段。

    希望我的回答很清楚,请随时发表评论以获取更多信息。

    如果您是 Mongo 的新手,我建议您注册其中的一些免费 courses。那里非常有用,可以为您打下良好的基础。

    祝你在切换到 mongo 时好运。值得!

    【讨论】:

    • 1.在您的代码的第一种情况下,我如何通过引用将其变为模式?如果我这样去:Picture 它不会认为字段 entryDate 位于 Course 中吗? 2.你说得对,我想为老师和学生提供不同的收藏(如果可能的话,因为他们都是用户,所以他们都在Person下)。如何让他们从 PersonSchema 继承字段(无需重复 Teacher 和 StudentSchema 中的每个字段,只需添加新字段)
    • 3.它的设计使课程可以有多名教师。如果我在 CourseSchema 内部有教师:[TeacherSchema],并且在 TeacherSchema 课程内部:[CourseSchema],不会有一些错误,比如我首先定义什么以便它可以访问其他?
    • MongoDB 原生支持日期时间类型;使用它们,例如{ lastName:"Smith", entryDate: new ISODate("2017-09-29") } 这将提供卓越的可查询性和可排序性,而且您永远不会遇到解析问题和 YYYYMMDD 与 YYYYDDMM 问题。
    • @Wolfdog,对于 1,在您的图片中,我认为如果您要将 entryDate 放在课程对象上,您需要将它放在嵌套的学生列表中。这样每个学生可以有不同的入学日期。 2. 我主要在 .net 中编写代码,但我假设这会转移。我会有一个教师和学生班级,他们都将继承 PersonSchema。然后每个类将获取 PersonSchema 上的所有字段,以及定义的任何附加字段。然后,Mongo 将完美地处理保存,而无需任何重复代码。
    • 对于 3,通常最好将引用放在多对多对象之一中。我可能只有 CourseSchema 上的教师名单。教师模式不会有课程列表。如果您需要知道教师正在教授哪些课程,那么您可以查询教师数组中包含该教师的课程对象。该数组可能不是 TeacherSchema,而只是教师的 id。或者也许是新的 CourseTeacher 类,它只有一个教师 ID 和他们的名字。
    【解决方案2】:

    以下是 RDBMS 和 NoSQL 数据库之间比较的两个很好的资源。

    https://www.mongodb.com/compare/mongodb-mysql

    https://docs.mongodb.com/manual/reference/sql-comparison/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多