Join documentdb上的自连接语法错误
在documentdb上执行SQL有效的自连接查询时遇到问题 因此,以下查询有效:Join documentdb上的自连接语法错误,join,azure-cosmosdb,Join,Azure Cosmosdb,在documentdb上执行SQL有效的自连接查询时遇到问题 因此,以下查询有效: 从c中选择*作为c1,其中c1.obj=“car” 但是这个简单的自连接查询没有:从c中选择c1.url作为c1,将c作为c2,其中c1.obj=“car”和c2.obj=“person”以及c1.url=c2.url,如果出现错误,标识符“c”无法解析 documendb支持文档内的自联接,但我是在集合级别上询问的 我看了看官员,了解到藏品名称基本上是推断出来的;我尝试将c更改为显式地显示我的集合名称和根目录,
从c中选择*作为c1,其中c1.obj=“car”
但是这个简单的自连接查询没有:从c中选择c1.url作为c1,将c作为c2,其中c1.obj=“car”和c2.obj=“person”以及c1.url=c2.url
,如果出现错误,标识符“c”无法解析
documendb支持文档内的自联接,但我是在集合级别上询问的
我看了看官员,了解到藏品名称基本上是推断出来的;我尝试将c
更改为显式地显示我的集合名称和根目录,但都不起作用
我错过了什么明显的东西吗?谢谢 有几件事需要澄清: 1。)关于
标识符“c”无法解析
查询的范围为单个集合;在上面的示例中,c
是集合的隐式别名,该集合使用AS
关键字重新别名为c1
您可以修改示例查询,将联接修改为引用c1
:
选择c1.url
从c到c1
将c1连接为c2
其中c1.obj=“car”和c2.obj=“person”和c1.url=c2.url`
这也相当于:
选择c1.url
来自c1
将c1连接为c2
其中c1.obj=“car”和c2.obj=“person”和c1.url=c2.url`
2.)了解连接并检查数据模型
尽管如此,我认为修复上面的查询语法问题不会产生您所期望的行为。DocumentDB SQL中的JOIN
关键字用于在文档中使用非规范化的元素数组形成叉积(而不是在同一集合中的其他文档之间形成叉积)。如果您在这里遇到了困难,那么不妨退一步,重新探讨如何为Azure Cosmos DB建模数据
在RDBMS中,您被训练为首先考虑实体,并基于实体规范化数据模型。您在很大程度上依赖于查询引擎来优化查询以适应您的工作负载(这在检索数据方面通常做得很好,但并不总是最佳的)。这里的挑战是,随着规模的增加,许多关系优势都会消失,向外扩展到多个碎片/分区成为一种需求
对于像Cosmos DB这样的横向扩展分布式数据库,您需要首先了解工作负载,并优化数据模型以适应工作负载(而不是首先考虑实体)。您需要记住,集合仅仅是一个逻辑抽象,由生活在分区集中的许多副本组成。它们不强制模式,是查询的边界
设计模型时,您需要将以下问题纳入您的思考过程:
- 就规模和吞吐量而言,更广泛的解决方案的规模是多少(数量级的估计就足够了)
- 读与写的比率是多少
- 对于写入-写入的模式是什么?它主要是插入,还是有很多更新
- 对于读取-前N个查询是什么样子的
- 请求的比率将有助于指导您如何进行权衡(使用帕累托原理并针对大部分工作负载进行优化)
- 对于读取繁重的工作负载,通常筛选的属性成为选择分区键的候选
- 倾向于经常一起更新的属性应在数据模型中一起抽象,并远离以较慢节奏更新的属性(以降低更新的RU费用)
- 不要害怕在不同的记录类型之间复制属性以丰富可查询性和注释类型。例如,我们有两种类型的文档:cat和person
从c中选择*,其中c.familyId=“Liu”
如果我们想在type=“Person”上进行筛选,只需在查询中添加一个type上的筛选:
从c中选择*,其中c.familyId=“Liu”和c.type=“Person”
当前查询对于任何普通关系数据库都有效。可能对自联接有一些限制,您不知道。嗯,它们似乎不支持集合之间的联接;哇,这么小的功能。。。这可能是有原因的;SQL接口可能会误导我们。但作为db的研究生,我必须说,具有第六范式的LogicBlox人员可能会不同意您的观点!:P
{
"id": "Andrew",
"type": "Person",
"familyId": "Liu",
"employer": "Microsoft"
}
{
"id": "Ralph",
"type": "Cat",
"familyId": "Liu",
"fur": {
"length": "short",
"color": "brown"
}
}