我刚刚开始使用nosql数据库,尤其是OrientDB。我之前的经验是使用关系数据库,主要是SQL Server。
在MSSQL中,我可以执行以下操作:
SELECT s.url, p.title
FROM Site s
JOIN Page p ON s.Id = p.SiteId
它会给我一个包含所有页面的表格,以及它们所属网站的url:
url | title
----------------------------
site1.com | page1
site1.com | page2
site2.com | page1
现在,在OrientDb中,我的理解是您应该使用
link
对于单向关系,或
edge
用于双向关系。因为我想知道哪些页面属于某个站点,以及某个特定页面属于哪个站点,所以我决定在本例中使用edge。站点和页面类/顶点已经以类似的方式创建,但我不知道如何获得类似的结果集。从文档中(
https://orientdb.com/docs/2.2/SQL.html
):
OrientDB只允许一个类(类与中的表等效
与SQL相反,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,甚至图形/nosql数据库,通常情况下都不是这样吗?我应该打两个单独的电话来获取我需要的所有数据吗。
SELECT FROM Site WHERE Url = "site1.com"
以及
SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com"
?
非常感谢。