我是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 回答
您的第一个示例(使用
type
字段)是最常见的,一些实体框架支持此功能 .但是,我做了一些性能测试,发现单独的
isStudent
和isTeacher
字段是布尔值并且总是为真或字段丢失的情况稍好一些 . 所以,使用你的例子:然后查询:
我从来没有见过任何人以你的第二种方式做到这一点,也没有尝试过对其进行性能分析,但我的猜测是它具有与我上面推荐的相似的性能特征 .
我的基本建议是做一些实验 . 然后,如果差异很小,那么请选择对您和您的开发人员最有意义的差异 .