私は、特にnosqlデータベースとOrientDBを使い始めました。私の以前の経験は、SQL Serverを中心としたリレーショナルデータベースにあります。 MSSQLでOrientDb - グラフを使用して複数の頂点から選択
、私はこのような何か行うことができます。
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
を使用する必要があります。私はどのページがサイトに属しているのか、特定のページがどのサイトに属しているのかを知りたいので、この場合はエッジを使用することに決めました。サイトとページのクラス/頂点はすでに同様の方法で作成されていますが、同様の結果セットを取得する方法はわかりません。ドキュメント(https://orientdb.com/docs/2.2/SQL.html)から:
OrientDBは ターゲットとして多くのテーブルを可能SQL、とは対照的に、クラスを1つだけ(クラスは でこの議論のテーブルに相当します)ことができます。あなたは2つのクラスから選択したい場合は、あなたが 2サブクエリを実行し、彼らの例
SELECT FROM E, V
UNIONALL機能を
をそれらを結合する必要があり、その後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
フィールドを取得するための2回目の呼び出しを行った後、アプリケーションコードでそれらを一致させることができます。私がこれを避ける理由は、複数のデータベース呼び出しが余分な/冗長な情報を返す時間よりも時間効率が悪いためです(私の例では、site1.com
が2回返されます)。
OrientDbの場合や、一般的なグラフ/ nosqlデータベースの場合ではないでしょうか?代わりに、必要なすべてのデータを取得するために別々の呼び出しを2回行う必要があります。つまり、SELECT FROM Site WHERE Url = "site1.com"
とSELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com"
?
は
を役に立てば幸い!ありがとうございました!私は、nosql/graphsのコンセプトの周りに頭を抱えていると思います。再度、感謝します! –