日本語版
最新ニュース
企業

D を使用した効率的なカタログ メタデータ管理と製品更新

この投稿では、Data Transfer Objects (DTO) を利用して、Optimizely Commerce でカタログ メタデータを管理および更新する方法について説明します。 DTO は、データベースからデータに直接アクセスするための軽量でパフォーマンスが最適化された方法を提供し、コンテンツ リポジトリを使用するよりも高速でリソースの消費量が少なくなります。 Optimizely Commerce のコンテンツ リポジトリは機能が豊富ですが、特に大規模なカタログの場合、処理が集中し、パフォーマンスの面でコストがかかる可能性があります。 DTO を選択することで、このアプローチは処理負荷を最小限に抑え、データ アクセスを高速化するため、カタログ エントリ、カテゴリ、またはメタデータを迅速に取得して更新する必要があるシナリオに最適です。 メタデータコンテキストのセットアップ まず、メタデータ コンテキストは、特定の文化および言語設定を処理するように構成されます。これにより、すべてのカタログ データが正しいロケールでアクセスされるようになります。これは、一貫した言語または形式の設定を必要とするアプリケーションにとって重要です。 string originalMetaDataContextLanguage = CatalogContext.MetaDataContext.Language; bool originalUseCurrentUiCulture = CatalogContext.MetaDataContext.UseCurrentThreadCulture; CatalogContext.MetaDataContext.UseCurrentThreadCulture = false; CatalogContext.MetaDataContext.Language = culture.Name; 設定…

D を使用した効率的なカタログ メタデータ管理と製品更新

1730705503
2024-10-31 16:09:00

この投稿では、Data Transfer Objects (DTO) を利用して、Optimizely Commerce でカタログ メタデータを管理および更新する方法について説明します。 DTO は、データベースからデータに直接アクセスするための軽量でパフォーマンスが最適化された方法を提供し、コンテンツ リポジトリを使用するよりも高速でリソースの消費量が少なくなります。

Optimizely Commerce のコンテンツ リポジトリは機能が豊富ですが、特に大規模なカタログの場合、処理が集中し、パフォーマンスの面でコストがかかる可能性があります。 DTO を選択することで、このアプローチは処理負荷を最小限に抑え、データ アクセスを高速化するため、カタログ エントリ、カテゴリ、またはメタデータを迅速に取得して更新する必要があるシナリオに最適です。

メタデータコンテキストのセットアップ

まず、メタデータ コンテキストは、特定の文化および言語設定を処理するように構成されます。これにより、すべてのカタログ データが正しいロケールでアクセスされるようになります。これは、一貫した言語または形式の設定を必要とするアプリケーションにとって重要です。

string originalMetaDataContextLanguage = CatalogContext.MetaDataContext.Language;
bool originalUseCurrentUiCulture = CatalogContext.MetaDataContext.UseCurrentThreadCulture;

CatalogContext.MetaDataContext.UseCurrentThreadCulture = false;
CatalogContext.MetaDataContext.Language = culture.Name;

設定 UseCurrentThreadCulturefalse また、言語を明示的に指定すると、デフォルトのカルチャ設定をバイパスして、一貫したデータ取得形式を適用できます。

DTO を使用したカテゴリとエントリの取得

DTO の使用 (具体的には CatalogNodeDto そして CatalogEntryDto) は、コンテンツ リポジトリに関連するパフォーマンスのオーバーヘッドを発生させずに、カテゴリとエントリを取得する直接的かつ効率的な方法を提供します。このアプローチでは、カタログ ノードとエントリに直接アクセスすることで、データの取得と処理にかかる時間が短縮されます。

// Retrieve all categories
CatalogNodeDto childNodes = CatalogContext.Current.GetCatalogNodesDto(
    catalogId, 
    new CatalogNodeResponseGroup(CatalogNodeResponseGroup.ResponseGroup.CatalogNodeInfo)
);

// Retrieve entries associated with the catalog node
CatalogEntryDto catalogEntries = CatalogContext.Current.GetCatalogEntriesDto(
    catalogId, 
    new CatalogEntryResponseGroup(CatalogEntryResponseGroup.ResponseGroup.CatalogEntryFull)
);

GetCatalogNodesDto そして GetCatalogEntriesDto メソッドはデータベースに直接クエリを実行し、最小限の形式でデータを返します。これは、コンテンツ リポジトリからコンテンツ アイテム全体と関連するメタデータをロードするよりもはるかに高速です。

エントリの処理とバリアントの関連付けの更新

カタログ データを取得すると、コードは各カタログ エントリを反復処理し、特定の条件に基づいてフィルタリングします。エントリが基準を満たしている場合は、 MetaObject そのエントリに関連付けられています。の MetaObject その後、に渡されます UpdateProductBasedOnVariantAssociation メソッドには、バリアント関係に基づいて製品を更新するためのカスタム ロジックが含まれています。

foreach (var entry in catalogEntries.CatalogEntry)
{
    MetaClass entryMetaClass = MetaClass.Load(CatalogContext.MetaDataContext, entry.MetaClassId);

    if (!entryMetaClass.IsCatalogMetaClass)
        continue;

    if (!entryMetaClass.Name.Contains("Product"))
        continue;

    MetaObject metaObject = MetaObject.Load(CatalogContext.MetaDataContext, entry.CatalogEntryId, entryMetaClass);

    // Custom update logic for products based on variant association
    this.UpdateProductBasedOnVariantAssociation(metaObject, entryMetaClass.Name, entry.Code); 
}

このアプローチは、バリアントの関連付けに基づいて更新することで、負荷の高いコンテンツの読み込み操作を必要とせずに、製品のバリエーション間の一貫性を維持するのに役立ちます。それぞれ MetaObject はエントリの基礎となるメタデータを表し、パフォーマンスを維持しながらきめ細かな更新を可能にします。

インオーダートラバーサルを使用した効率的なカテゴリトラバーサル

次に、コードは、カテゴリ内のカテゴリ (ノード) を順番に走査します。 childNodes。各ノードに対して、関連するエントリをロードし、同じ更新ロジックを適用します。各レベルのメタオブジェクトを更新した後、変更を受け入れる必要があります。

foreach (var node in childNodes.CatalogNode)
{
    MetaClass nodeMetaClass = MetaClass.Load(CatalogContext.MetaDataContext, node.MetaClassId);

    if (!nodeMetaClass.IsCatalogMetaClass)
        continue;

    CatalogEntryDto categoryEntries = CatalogContext.Current.GetCatalogEntriesDto(
        catalogId, 
        node.CatalogNodeId, 
        new CatalogEntryResponseGroup(CatalogEntryResponseGroup.ResponseGroup.CatalogEntryFull)
    );

    if (categoryEntries.CatalogEntry.Count == 0)
        continue;

    MetaObject nodeObject = MetaObject.Load(CatalogContext.MetaDataContext, node.CatalogNodeId, nodeMetaClass);

    foreach (var entry in categoryEntries.CatalogEntry)
    {
        MetaClass entryMetaClass = MetaClass.Load(CatalogContext.MetaDataContext, entry.MetaClassId);

        if (!entryMetaClass.IsCatalogMetaClass || !entryMetaClass.Name.Contains("Product"))
            continue;

        MetaObject metaObject = MetaObject.Load(CatalogContext.MetaDataContext, entry.CatalogEntryId, entryMetaClass);

        // Update product based on variant association
        this.UpdateProductBasedOnVariantAssociation(metaObject, entryMetaClass.Name, entry.Code); 

        // Accept changes at the node level to maintain consistency
        nodeObject.AcceptChanges(CatalogContext.MetaDataContext);
    }
}

ここで DTO を使用することで、コンテンツ リポジトリのオーバーヘッドが回避され、基になるデータへのアクセスが高速化されます。各ノードのメタデータは変更があった場合にのみ変更され、変更は効率的に受け入れられるため、インデックスの再作成や完全なカタログの再ロードの必要性が軽減されます。

元のメタデータコンテキストの復元

すべての更新が完了したら、メタデータ コンテキストを元の設定にリセットします。

CatalogContext.MetaDataContext.Language = originalMetaDataContextLanguage;
CatalogContext.MetaDataContext.UseCurrentThreadCulture = originalUseCurrentUiCulture;

まとめ

カタログ メタデータ管理と製品更新に対するこのアプローチは、効率的かつスケーラブルです。

  1. DTO による効率的なデータ アクセス: DTO は、コンテンツ リポジトリと比較してカタログ データにアクセスして変更するための効率的で高速な方法を提供し、パフォーマンスが重要なシナリオに最適です。
  2. ローカライズされたコンテキスト設定: 特定の文化と言語を設定すると、さまざまなロケール間で一貫したデータ処理が可能になります。
  3. メタデータの直接変更: との作業 MetaObject そして MetaClass 完全なコンテンツ構造の処理負荷をかけずに、特定のメタデータベースの更新を可能にします。
  4. カテゴリの横断と更新: 順序トラバーサルを使用すると、ノード レベルでの効率的な更新が可能になり、大規模な再インデックス作成の必要性が最小限に抑えられます。

この方法では、コンテンツ リポジトリの代わりに DTO を使用することでパフォーマンスが向上し、最新の正確なカタログを維持しながらプラットフォームの全体的な負荷が軽減されます。この手法は、速度と効率が重要な大規模な電子商取引サイトに特に有益です。

2024 年 10 月 31 日

#を使用した効率的なカタログ #メタデータ管理と製品更新

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。