我刚刚开始使用nosql数据库,特别是OrientDB。我以前的经验是关系数据库,主要是SQL Server。
在MSSQL中,我可以这样做:
SELECT s.url, p.title
FROM Site s
JOIN Page p ON s.Id = p.SiteId
它会给我一张所有页面的表格,以及他们所属网站的网址:
url | title
----------------------------
site1.com | page1
site1.com | page2
site2.com | page1
现在,在OrientDb中,我的理解是你应该使用link
表示单向关系,或edge
表示双向关系。由于我想知道哪些页面属于某个站点,以及某个特定页面属于哪个站点,因此我决定在这种情况下使用边缘。 Site和Page类/顶点已经以类似的方式创建,但我无法弄清楚如何获得类似的结果集。从文档(https://orientdb.com/docs/2.2/SQL.html):
OrientDB只允许一个类(类相当于表中的类) 这个讨论)而不是SQL,它允许许多表格 目标。如果要从2个类中进行选择,则必须执行 2个子查询并使用UNIONALL函数
连接它们
他们的示例SELECT FROM E, V
变为SELECT EXPAND( $c ) LET $a = ( SELECT FROM E ), $b = ( SELECT FROM V ), $c = UNIONALL( $a, $b )
,但这不是我想要的。这导致了
url | title
----------------------------
site1.com |
site1.com |
site2.com |
| page1
| page2
| page1
如何创建原始结果集,如在MSSQL中?
其他考虑因素:我对MSSQL的培训和经验要求数据库操作应该在数据库中完成,而不是应用程序代码。例如,我可以完成一个数据库调用以获取s.url
和s.id
字段,然后再进行第二次调用以获取p.title
和p.SiteId
字段,然后匹配它们在应用程序代码中。我避免这种情况的原因是因为多次数据库调用的时间效率低于返回额外/冗余信息所需的时间(在我的示例中,site1.com
返回两次)。
对于OrientDb,或者甚至是graph / nosql数据库,这可能不是这样吗?我是否应该进行两次单独的调用以获取我需要的所有数据,即SELECT FROM Site WHERE Url = "site1.com"
和SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com"
?
谢谢
答案 0 :(得分:2)
试试这个:
select Url, out("HasPages").title as title from Site unwind title
希望有所帮助
此致