Azure DocumentDb建模平面与嵌套

时间:2016-11-15 21:43:06

标签: azure azure-cosmosdb

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

//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 个答案:

答案 0 :(得分:2)

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

但是,我进行了一些性能测试,发现单独的isStudentisTeacher字段是布尔值并且始终为true或字段缺失,这样会稍微好一些。所以,使用你的例子:

//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 

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

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

相关问题