首页 文章

Azure DocumentDb建模平面与嵌套

提问于
浏览
1

我是Azure DocumentDb的新手,对于在集合中建模数据的最佳方法有疑问 . 在集合中,并非所有文档都必须具有相同的模式 . 在一个非常简单的例子中,假设我有一个包含有关教师和学生的文档的学校集合 . 几个json属性可能是相同的,例如'lastName' . 我需要区分老师和学生,并运行一个查询,给我所有学生姓氏“史密斯” . 我的问题是什么是定义“学生”文档与“教师”相比的最佳方式 . 我见过添加“type”属性的示例,如下所示:

//Student document
    {
       "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4",
        "lastName": "Smith",
        "grade": 10,
        "type": "student"
    }

//Teacher document
    {
       "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4",
        "lastName": "Smith",
        "subjectTaught": "Algebra I",
        "type": "teacher"
    }

然后你可以像这样查询:

SELECT * from c where c.lastName = "Smith" and c.type ="student"

我还看到了嵌套对象类型的另一种方法:

//Student document
  {
      "student": {
        "lastName": "Smith",
        "grade": 10
      },
      "id": "7d2c5595-21b1-4598-8a70-196a3feeeab0"
    }

//Teacher document
{
  "teacher": {
    "lastName": "Smith",
    "subjectTaught": "Algebra I",
  },
  "id": "7d2c5595-21b1-4598-8a70-196a3feeeab0"
}

然后您的查询将如下所示:

SELECT c.student from c where c.student.lastName = "Smith"

从数据建模最佳实践的角度来看,我很好奇哪种方法更好 . 显然,这是一个非常简单的例子,现实世界的集合会有更复杂的文档 .

1 回答

  • 2

    您的第一个示例(使用 type 字段)是最常见的,一些实体框架支持此功能 .

    但是,我做了一些性能测试,发现单独的 isStudentisTeacher 字段是布尔值并且总是为真或字段丢失的情况稍好一些 . 所以,使用你的例子:

    //Student document
        {
           "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4",
            "lastName": "Smith",
            "grade": 10,
            "isStudent": true
        }
    
    //Teacher document
        {
           "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4",
            "lastName": "Smith",
            "subjectTaught": "Algebra I",
            "isTeacher": true
        }
    

    然后查询:

    SELECT * from c where c.lastName = "Smith" and c.isStudent
    

    我从来没有见过任何人以你的第二种方式做到这一点,也没有尝试过对其进行性能分析,但我的猜测是它具有与我上面推荐的相似的性能特征 .

    我的基本建议是做一些实验 . 然后,如果差异很小,那么请选择对您和您的开发人员最有意义的差异 .

相关问题