我是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"
从数据建模最佳实践的角度来看,我很好奇哪种方法更好。显然,这是一个非常简单的例子,现实世界的集合会有更复杂的文档。
答案 0 :(得分:2)
您的第一个示例(使用type
字段)是最常见的,一些实体框架支持此功能。
但是,我进行了一些性能测试,发现单独的isStudent
和isTeacher
字段是布尔值并且始终为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
我从未见过有人以你的第二种方式做到这一点,也没有尝试过对其进行性能分析,但我的猜测是它会有与我上面推荐的相似的性能特征。
我的基本建议是做一些实验。然后,如果差异很小,那么请选择对您和您的开发人员最有意义的那个。