データの結合

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

ジョイン (ジョイン文) は、データベース内の2つ以上のテーブルのレコードを結合します。このトピックでは、結合を使用する状況と、結合を使用する際に考慮する必要がある事項について説明します。

LINQレイヤーは、JoinSelf JoinGroup JoinおよびSelect Manyの4つの結合をサポートしています。これら4つの方法は、ユーザーがデータをページングするときに評価されるサブクエリを使用します。Solrは特定の側面のみをサポートします。

大事な

可能な限り、これらの方法の使用を避けるようにする必要があります。これらはすべて、処理時間、I/Oの量、およびメモリ使用量の両方でパフォーマンスに悪影響を及ぼします。

たとえば、LINQでJoinクエリを使用して、Contactsが存在していたEngagement Statesと結合します。ユーザーがデータをページングすると、結合またはサブクエリは最初のページ に対してのみ 実行されます。つまり、IDを指定すると、そのIDを使用して別のドキュメントを検索するサブクエリが実行されます。

LINQでJoinクエリを実行すると、1つまたは複数のドキュメントの和集合セットが実質的に返されます。LINQクエリを記述するときは、結合を使用してSQLクエリを記述する場合と同様に、パフォーマンスを考慮する必要があります。また、データを適切に保存し、インデックスを作成することも必要です。Sitecoreは、LINQでの多対1または多対多のクエリ (たとえば、Engagement Statesへの複数の参照を保存し、それらをEngagement Statesドキュメントで結合するContact) をサポートしていません。

「外部キー」を エンゲージメントステート にアタッチして、代わりにContactIdのようなものを使用して参加できるようにすることができます。

public class Contact {
public string Name { get; set; }
public Guid ContactId { get; set; }
}
public class EngagementState {
public string Name { get; set; }
public Guid ContactId { get; set; }
public Guid Id { get; set; }
}

上記のクラスを考えると、データが重複する結果になりますが、これにより、ContactIdを介してContactsEngagement Statesに結合できます。LINQレイヤーは、次のようにこれをサポートします。

var repo = this.CreateVisitors();
var repoPlans = this.GetStates();
var result = from t in repo
join x in repoPlans on t.ContactId equals x.ContactId
where x.Id == new Guid("E1B604F1-EE0E-408E-A344-869CC45D25D9")
select t;

LINQScratchPadでのテスト

次のように、LinqScratchPad.aspx内の大量のデータに対して結合をテストできます。

using (var context = ContentSearchManager.GetIndex("sitecore_master_index").CreateSearchContext())
{
    using (var context2 = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext())
        {
            return context.GetQueryable<SearchResultItem>().Join(context2.GetQueryable<SearchResultItem>()
            .Where(i => i.Name.StartsWith("S")), i => i.ItemId, o => o.ItemId, (o, i) => o).Take(10).ToList();
        }
}

これにより、2つの個別の検索コンテキストが開き、ItemIdに基づいて結合が実行されます。この例では、このクエリは、nameフィールドがSで始まる項目がwebインデックスとmasterインデックスの両方にあるかどうかを確認し、webインデックス (外部) の結果を返します。

Solrでの結合

Solrプロバイダーを使用する場合、実際のSolr結合を実行する結合はSelf Joinつだけです。その他の方法 ( JoinGroup Joinなど) は、Lucene.netプロバイダーが使用する列挙手法を使用します。列挙時には、サブクエリが実行されて他のドキュメントが取得されます。

ジョインを使用する場合

LINQレイヤーで結合を使用する必要があるのは、別のドキュメントへの参照を含むドキュメントがある場合です。通常、参照はID参照です。

Sitecoreはクロールするオブジェクトをフラット化しません。クローラーの実装は、データの保存方法をSitecoreに指示する必要があります。 Joinメソッド、Self Joinメソッド、またはGroup Joinメソッドは、結合のサブクエリを実行して別のドキュメントを取得し、ID/キーに基づいて評価します。

データを適切に保存していることを確認する必要があります。ジョインの準備が整うようにデータを準備することも、完全にジョインフリーの取得に備えることもできます。どちらのアプローチにも長所と短所があります。

次のルールに従って、ソリューションが適切にスケーリングされるようにします。

  • 結合の量を制限します。

  • 結合を使用する代わりに、データをフラット化することを検討してください。その結果、フィールドが複数値になり、列が多くなる可能性があります。

  • 結合を使用する場合は、データのページングを小さくします (一度に10個または20個のアイテム)。その理由は、実行に100ミリ秒かかるクエリがある場合、サブクエリと初期クエリを返すのに1.1秒かかる可能性があるためです。

  • 100% 必要なもののみを格納またはインデックス化します (パフォーマンスに影響がある場合を除く)。

結合、自己結合、およびグループ結合の方法の違い

たとえば、次の2つのデータ テーブルがあるとします。

身分証明書

価値

1

ある

2

B

3

C

身分証明書

チャイルドバリュー

1

A1

1

A2の

1

A3の

2

B1の

2

B2の

Idフィールドの2つのリストでJoinメソッドを使用すると、次の結果が得られます。

価値

チャイルドバリュー

ある

A1

ある

A2の

ある

A3の

B

B1の

B

B2の

Idフィールドの2つのリストでGroup Joinメソッドを使用すると、次の結果が得られます。

価値

チャイルドバリュー

ある

【A1、A2、A3】

B

B1、B2

C

Idフィールドの2つのリストでSelf Joinメソッドを使用すると、次の結果が得られます。

価値

チャイルドバリュー

ある

A1

ある

A2の

ある

A3の

B

B1の

B

B2の

Self Joinメソッドを使用する場合は、resultSelectorパラメーターを指定する必要はありません。外側の結果を返すと推測されます。これは基本的に、内部結合と外部結合の違いです。

メモ

結合クエリを実行するときは、内部 結合または 外部 結合に、結果を制限するフィルターが必要です。それ以外の場合、結合クエリはインデックス内のすべてのドキュメントで結合を試みます。

この記事を改善するための提案がある場合は、 お知らせください!