Sering memperbarui produk Anda

Sub-API Produk memungkinkan Anda melakukan pembaruan sebagian pada produk yang ada. Cara ini ideal untuk data yang sering berubah, seperti harga dan ketersediaan, karena Anda tidak perlu mengirim ulang seluruh produk untuk perubahan kecil. Namun, Anda harus memasukkan kembali produk secara rutin untuk memastikan semua data produk disinkronkan.

Panduan ini membahas cara menggunakan metode productinputs.patch untuk memperbarui produk Anda.

Prasyarat

Sebelum dapat memperbarui produk, Anda memerlukan hal berikut:

Memperbarui detail produk tertentu

Untuk mengubah beberapa detail produk, seperti harga atau ketersediaannya, tanpa mengirim ulang semua informasinya, gunakan metode productInputs.patch.

Anda dapat menentukan kolom yang diubah dalam parameter updateMask. updateMask adalah daftar kolom yang dipisahkan koma yang ingin Anda perbarui. Metode patch berperilaku sebagai berikut:

  • Kolom di updateMask dan isi: Kolom ini diperbarui dengan nilai baru.
  • Kolom di updateMask tetapi tidak ada di isi email: Kolom ini dihapus dari input produk.
  • Kolom yang tidak ada di updateMask: Kolom ini tidak berubah.
  • Parameter updateMask tidak disertakan: Semua kolom yang diberikan dalam isi permintaan akan diperbarui. Kolom yang tidak diberikan dalam isi permintaan tidak dihapus dari input produk.

Berikut adalah contoh data produk sebelum pembaruan:

{
  "name": "accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345",
  "product": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
  "offerId": "SKU12345",
  "contentLanguage": "en",
  "feedLabel": "US",
  "productAttributes": {
    "title": "Classic Cotton T-Shirt",
    "description": "A comfortable, durable, and stylish t-shirt made from 100% cotton.",
    "link": "https://www.example.com/p/SKU12345",
    "availability": "IN_STOCK",
    "price": {
      "amountMicros": "15990000",
      "currencyCode": "USD"
    },
    "condition": "NEW",
    "gtins": [
      "9780007350896"
    ],
    "imageLink": "https://www.example.com/image/SKU12345"
  }
}

Contoh ini memperbarui title dan availability produk serta menghapus imageLink-nya. description dan price tidak ada di updateMask dan akan tetap tidak berubah.

PATCH https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,productAttributes.availability,productAttributes.imageLink&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
{
 "productAttributes": {
   "title": "Classic Cotton T-Shirt - New Edition",
   "availability": "OUT_OF_STOCK",
    "description": "A comfortable T-shirt from premium cotton, newer edition.",
    "price": {
      "amountMicros": "9990000",
      "currencyCode": "USD"
    }
 }
}

Panggilan yang berhasil akan menampilkan resource ProductInput yang diperbarui. title dan availability diperbarui, dan imageLink dihapus karena berada di updateMask, tetapi tidak ada di isi permintaan. description dan price tetap tidak berubah karena tidak tercantum dalam updateMask.

{
  "name": "accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345",
  "product": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
  "offerId": "SKU12345",
  "contentLanguage": "en",
  "feedLabel": "US",
  "productAttributes": {
    "title": "Classic Cotton T-Shirt - New Edition",
    "description": "A comfortable, durable, and stylish t-shirt made from 100% cotton.",
    "link": "https://www.example.com/p/SKU12345",
    "availability": "OUT_OF_STOCK",
    "price": {
      "amountMicros": "15990000",
      "currencyCode": "USD"
    },
    "condition": "NEW",
    "gtins": [
      "9780007350896"
    ],
  }
}

Contoh kode berikut menunjukkan cara memperbarui produk.

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.protobuf.FieldMask;
import com.google.shopping.merchant.datasources.v1.DataSourceName;
import com.google.shopping.merchant.products.v1.Availability;
import com.google.shopping.merchant.products.v1.Condition;
import com.google.shopping.merchant.products.v1.ProductAttributes;
import com.google.shopping.merchant.products.v1.ProductInput;
import com.google.shopping.merchant.products.v1.ProductInputName;
import com.google.shopping.merchant.products.v1.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1.UpdateProductInputRequest;
import com.google.shopping.type.CustomAttribute;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to update a product input */
public class UpdateProductInputSample {

  public static void updateProductInput(Config config, String productId, String dataSourceId)
      throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    ProductInputsServiceSettings productInputsServiceSettings =
        ProductInputsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates product name to identify product.
    String name =
        ProductInputName.newBuilder()
            .setAccount(config.getAccountId().toString())
            .setProductinput(productId)
            .build()
            .toString();

    // Just productAttributes and customAttributes can be updated
    FieldMask fieldMask =
        FieldMask.newBuilder()
            .addPaths("product_attributes.title")
            .addPaths("product_attributes.description")
            .addPaths("product_attributes.link")
            .addPaths("product_attributes.image_link")
            .addPaths("product_attributes.availability")
            .addPaths("product_attributes.condition")
            .addPaths("product_attributes.gtins")
            .addPaths("custom_attributes.mycustomattribute")
            .build();

    // Calls the API and catches and prints any network failures/errors.
    try (ProductInputsServiceClient productInputsServiceClient =
        ProductInputsServiceClient.create(productInputsServiceSettings)) {

      ProductAttributes attributes =
          ProductAttributes.newBuilder()
              .setTitle("A Tale of Two Cities")
              .setDescription("A classic novel about the French Revolution")
              .setLink("https://exampleWebsite.com/tale-of-two-cities.html")
              .setImageLink("https://exampleWebsite.com/tale-of-two-cities.jpg")
              .setAvailability(Availability.IN_STOCK)
              .setCondition(Condition.NEW)
              .addGtins("9780007350896")
              .build();

      // The datasource can be either a primary or supplemental datasource.
      String dataSource =
          DataSourceName.newBuilder()
              .setAccount(config.getAccountId().toString())
              .setDatasource(dataSourceId)
              .build()
              .toString();

      UpdateProductInputRequest request =
          UpdateProductInputRequest.newBuilder()
              .setUpdateMask(fieldMask)
              // You can only update product attributes and custom_attributes
              .setDataSource(dataSource)
              .setProductInput(
                  ProductInput.newBuilder()
                      .setName(name)
                      .setProductAttributes(attributes)
                      .addCustomAttributes(
                          CustomAttribute.newBuilder()
                              .setName("mycustomattribute")
                              .setValue("Example value")
                              .build())
                      .build())
              .build();

      System.out.println("Sending update ProductInput request");
      ProductInput response = productInputsServiceClient.updateProductInput(request);
      System.out.println("Updated ProductInput Name below");
      // The last part of the product name will be the product ID assigned to a product by Google.
      // Product ID has the format `contentLanguage~feedLabel~offerId`
      System.out.println(response.getName());
      System.out.println("Updated Product below");
      System.out.println(response);
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // An ID assigned to a product by Google. In the format
    // contentLanguage~feedLabel~offerId
    String productId = "en~label~sku123"; // Replace with your product ID.

    // Identifies the data source that will own the product input.
    String dataSourceId = "{INSERT_DATASOURCE_ID}"; // Replace with your datasource ID.

    updateProductInput(config, productId, dataSourceId);
  }
}

PHP

use Google\ApiCore\ApiException;
use Google\Protobuf\FieldMask;
use Google\Shopping\Merchant\Products\V1\Availability;
use Google\Shopping\Merchant\Products\V1\Condition;
use Google\Shopping\Merchant\Products\V1\ProductAttributes;
use Google\Shopping\Merchant\Products\V1\Client\ProductInputsServiceClient;
use Google\Shopping\Merchant\Products\V1\ProductInput;
use Google\Shopping\Merchant\Products\V1\UpdateProductInputRequest;
use Google\Shopping\Type\CustomAttribute;

/**
 * This class demonstrates how to update a product input.
 */
class UpdateProductInputSample
{
    // An ID assigned to a product by Google. In the format
    // contentLanguage~feedLabel~offerId
    // Please ensure this product ID exists for the update to succeed.
    private const PRODUCT_ID = "online~en~label~sku123";

    // Identifies the data source that will own the product input.
    // Please ensure this data source ID exists.
    private const DATASOURCE_ID = "<INSERT_DATASOURCE_ID>";

    /**
     * Helper function to construct the full product input resource name.
     *
     * @param string $accountId The merchant account ID.
     * @param string $productInputId The product input ID (e.g., "online~en~label~sku123").
     * @return string The full product input resource name.
     */
    private static function getProductInputName(string $accountId, string $productInputId): string
    {
        return sprintf("accounts/%s/productInputs/%s", $accountId, $productInputId);
    }

    /**
     * Helper function to construct the full data source resource name.
     *
     * @param string $accountId The merchant account ID.
     * @param string $dataSourceId The data source ID.
     * @return string The full data source resource name.
     */
    private static function getDataSourceName(string $accountId, string $dataSourceId): string
    {
        return sprintf("accounts/%s/dataSources/%s", $accountId, $dataSourceId);
    }

    /**
     * Updates an existing product input in your Merchant Center account.
     *
     * @param array $config The configuration array containing the account ID.
     * @param string $productId The ID of the product input to update.
     * @param string $dataSourceId The ID of the data source.
     */
    public static function updateProductInput(
        array $config,
        string $productId,
        string $dataSourceId
    ): void {
        // Gets the OAuth credentials to make the request.
        $credentials = Authentication::useServiceAccountOrTokenFile();

        // Creates options config containing credentials for the client to use.
        $options = ['credentials' => $credentials];

        // Creates a ProductInputsServiceClient.
        $productInputsServiceClient = new ProductInputsServiceClient($options);

        // Construct the full resource name of the product input to be updated.
        $name = self::getProductInputName($config['accountId'], $productId);

        // Define the FieldMask to specify which fields to update.
        // Only 'attributes' and 'custom_attributes' can be specified in the
        // FieldMask for product input updates.
        $fieldMask = new FieldMask([
            'paths' => [
                "product_attributes.title",
                "product_attributes.description",
                "product_attributes.link",
                "product_attributes.image_link",
                "product_attributes.availability",
                "product_attributes.condition",
                "product_attributes.gtin",
                "custom_attributes.mycustomattribute" // Path for a specific custom attribute
            ]
        ]);

        // Calls the API and handles any network failures or errors.
        try {
            // Define the new attributes for the product.
            $attributes = new ProductAttributes([
                'title' => 'A Tale of Two Cities 3',
                'description' => 'A classic novel about the French Revolution',
                'link' => 'https://exampleWebsite.com/tale-of-two-cities.html',
                'image_link' => 'https://exampleWebsite.com/tale-of-two-cities.jpg',
                'availability' => Availability::IN_STOCK,
                'condition' => Condition::PBNEW,
                'gtins' => ['9780007350896'] // GTIN is a repeated field.
            ]);

            // Construct the full data source name.
            // This specifies the data source context for the update.
            $dataSource = self::getDataSourceName($config['accountId'], $dataSourceId);

            // Create the ProductInput object with the desired updates.
            // The 'name' field must match the product input being updated.
            $productInput = new ProductInput([
                'name' => $name,
                'product_attributes' => $attributes,
                'custom_attributes' => [ // Provide the list of custom attributes.
                    new CustomAttribute([
                        'name' => 'mycustomattribute',
                        'value' => 'Example value'
                    ])
                ]
            ]);

            // Create the UpdateProductInputRequest.
            $request = new UpdateProductInputRequest([
                'update_mask' => $fieldMask,
                'data_source' => $dataSource,
                'product_input' => $productInput
            ]);

            print "Sending update ProductInput request\n";
            // Make the API call to update the product input.
            $response = $productInputsServiceClient->updateProductInput($request);

            print "Updated ProductInput Name below\n";
            // The name of the updated product input.
            // The last part of the product name is the product ID (e.g., contentLanguage~feedLabel~offerId).
            print $response->getName() . "\n";
            print "Updated Product below\n";
            // Print the full updated product input object.
            print_r($response);

        } catch (ApiException $e) {
            printf("ApiException caught: %s\n", $e->getMessage());
        }
    }

    /**
     * Executes the UpdateProductInput sample.
     */
    public function callSample(): void
    {
        $config = Config::generateConfig();
        $productId = self::PRODUCT_ID;
        $dataSourceId = self::DATASOURCE_ID;

        self::updateProductInput($config, $productId, $dataSourceId);
    }
}

// Run the script.
$sample = new UpdateProductInputSample();
$sample->callSample();

Python

"""A module to update a product input."""

from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.protobuf import field_mask_pb2
from google.shopping.merchant_products_v1 import Availability
from google.shopping.merchant_products_v1 import Condition
from google.shopping.merchant_products_v1 import ProductAttributes
from google.shopping.merchant_products_v1 import ProductInput
from google.shopping.merchant_products_v1 import ProductInputsServiceClient
from google.shopping.merchant_products_v1 import UpdateProductInputRequest
from google.shopping.type import CustomAttribute


# Fetches the Merchant Center account ID from the authentication examples.
# This ID is needed to construct resource names for the API.
_ACCOUNT_ID = configuration.Configuration().read_merchant_info()


def update_product_input(account_id: str, product_id: str, data_source_id: str):
  """Updates an existing product input for a specific account.

  Args:
    account_id: The Merchant Center account ID.
    product_id: The ID of the product input to update. This ID is assigned by
      Google and has the format `contentLanguage~feedLabel~offerId`.
    data_source_id: The ID of the data source that owns the product input.
  """

  # Obtains OAuth credentials for authentication.
  credentials = generate_user_credentials.main()

  # Creates a ProductInputsServiceClient instance.
  client = ProductInputsServiceClient(credentials=credentials)

  # Constructs the full resource name for the product input.
  # Format: accounts/{account}/productInputs/{productinput}
  name = f"accounts/{account_id}/productInputs/{product_id}"

  # Defines the FieldMask to specify which fields of the product input
  # are being updated. Only 'attributes' and 'custom_attributes' can be updated.
  field_mask = field_mask_pb2.FieldMask(
      paths=[
          "product_attributes.title",
          "product_attributes.description",
          "product_attributes.link",
          "product_attributes.image_link",
          "product_attributes.availability",
          "product_attributes.condition",
          "product_attributes.gtins",
          "custom_attributes.mycustomattribute",
      ]
  )

  # Prepares the new attribute values for the product.
  attributes = ProductAttributes(
      title="A Tale of Two Cities updated",
      description="A classic novel about the French Revolution",
      link="https://exampleWebsite.com/tale-of-two-cities.html",
      image_link="https://exampleWebsite.com/tale-of-two-cities.jpg",
      availability=Availability.IN_STOCK,
      condition=Condition.NEW,
      gtins=["9780007350896"],  # GTIN is a repeated field.
  )

  # Constructs the full resource name for the data source.
  # The data source can be primary or supplemental.
  # Format: accounts/{account}/dataSources/{datasource}
  data_source = f"accounts/{account_id}/dataSources/{data_source_id}"

  # Prepares the ProductInput object with the updated information.
  product_input_data = ProductInput(
      name=name,
      product_attributes=attributes,
      custom_attributes=[
          CustomAttribute(
              name="mycustomattribute", value="Example value"
          )
      ],
  )

  # Creates the UpdateProductInputRequest.
  request = UpdateProductInputRequest(
      update_mask=field_mask,
      data_source=data_source,
      product_input=product_input_data,
  )

  # Sends the update request to the API.
  try:
    print("Sending update ProductInput request")
    response = client.update_product_input(request=request)
    print("Updated ProductInput Name below")
    # The response includes the name of the updated product input.
    # The last part of the product name is the product ID assigned by Google.
    print(response.name)
    print("Updated Product below")
    print(response)
  except RuntimeError as e:
    # Catches and prints any errors that occur during the API call.
    print(e)


if __name__ == "__main__":
  # The ID of the product to be updated.
  # This ID is assigned by Google and typically follows the format:
  # contentLanguage~feedLabel~offerId
  # Replace with an actual product ID from your Merchant Center account.
  product_id_to_update = "online~en~label~sku123"

  # The ID of the data source that will own the updated product input.
  # Replace with an actual data source ID from your Merchant Center account.
  data_source_id_for_update = "<INSERT_DATA_SOURCE_ID>"

  update_product_input(
      _ACCOUNT_ID, product_id_to_update, data_source_id_for_update
  )

cURL

curl --location --request PATCH 'https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,productAttributes.description&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}' \
--header 'Authorization: Bearer <API_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
   "productAttributes": {
       "title": "A Tale of Two Cities",
       "description": "A classic novel about the French Revolution"
   }
}'

Memperbarui menggunakan atribut khusus

Anda dapat memperbarui atribut standar dan kustom dalam satu panggilan. Untuk memperbarui atribut kustom, tambahkan awalan customAttributes pada namanya dengan updateMask.

Contoh ini melakukan beberapa tindakan dalam satu permintaan:

  • Memperbarui atribut title standar secara langsung.
  • Memperbarui atribut khusus yang ada (myCustomAttrToBeUpdated).
  • Menyisipkan atribut khusus baru (myCustomAttrToBeInserted).
  • Menghapus atribut khusus yang ada (myCustomAttrToBeDeleted).
PATCH https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,customAttributes.myCustomAttrToBeInserted,customAttributes.myCustomAttrToBeUpdated,customAttributes.myCustomAttrToBeDeleted&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
{
  "productAttributes": {
    "title": "ProductTitle Updated"
  },
  "customAttributes": [
    {
      "name": "description",
      "value": "A newly updated description."
    },
    {
      "name": "myCustomAttrToBeUpdated",
      "value": "myCustomAttrToBeUpdated updated value"
    },
    {
      "name": "myCustomAttrToBeInserted",
      "value": "new from update"
    }
  ]
}

Permintaan yang berhasil akan menampilkan ProductInput yang telah diperbarui dan mencerminkan semua perubahan yang ditentukan.

Memahami pembaruan atribut kustom

Anda dapat menggunakan kolom customAttributes untuk memperbarui atribut yang telah Anda tentukan sendiri. Atribut ini tidak dipetakan ke spesifikasi standar dan akan disimpan sebagai atribut kustom pada produk akhir.

Cara pembaruan produk diproses

Saat Anda mengirim permintaan patch, update diterapkan ke data ProductInput tertentusebelum aturan apa pun diterapkan. Hal ini menghasilkan perilaku yang konsisten antara penyisipan dan pembaruan produk.

Berikut cara pembaruan Anda diproses:

  1. Perbarui Input: Permintaan patch Anda mengubah ProductInput tertentu yang terkait dengan sumber data yang Anda berikan.

  2. Memproses dan Menggabungkan: Setelah input diperbarui, pemrosesan dimulai:

    • Aturan Feed dan Sumber Data Tambahan: Aturan yang dikonfigurasi di sumber utama produk menggabungkan ProductInput dari sumber utama dan sumber tambahan. Aturan ini dapat mengubah atribut atau mendapatkan atribut baru. Untuk mempelajari lebih lanjut cara menyiapkan aturan, lihat artikel https://support.google.com/merchants/answer/14994083.
    • Sumber data lainnya: Data dari sumber lain (misalnya, peningkatan otomatis) juga digabungkan dengan input sumber data utama.
    • Validasi: Data gabungan divalidasi terhadap Spesifikasi data produk dan kebijakan Shopping Google.
  3. Produk Akhir: Hasil pipeline ini adalah resource Product akhir yang diproses yang dapat ditampilkan menggunakan products.get atau products.list. Ini juga merupakan versi produk yang ditampilkan di Merchant Center dan memenuhi syarat untuk muncul di berbagai tujuan.

Karena proses multi-langkah ini, ada penundaan, biasanya beberapa menit, antara saat Anda mengirim permintaan pembaruan dan saat perubahan ditampilkan di resource Product akhir yang dapat Anda ambil dengan products.get.

Contoh: Memperbarui produk dengan satu input utama

Ini adalah kasus penggunaan yang paling umum. Produk ada di satu sumber data utama, dan Anda ingin memperbarui beberapa atributnya.

  1. Kondisi Awal: Produk en~US~SKU12345 ada di sumber data utama Anda dengan title: "Classic T-Shirt" dan price: 15.99 USD.
  2. Permintaan Pembaruan: Anda mengirim permintaan patch untuk memperbarui price ke 14.99 USD dan menetapkan availability ke out of stock.
  3. Memproses:
    • ProductInput untuk SKU12345 diperbarui.
  4. Produk Akhir: Product akhir kini memiliki title: "Classic T-Shirt", price: 14.99 USD, dan availability: "out of stock".

Contoh: Memperbarui produk dengan data dan aturan tambahan

Contoh ini menunjukkan bagaimana aturan feed dapat memengaruhi pembaruan, sehingga beberapa perubahan diterapkan sementara yang lain diganti.

  1. Status Awal:
    • Input Utama: en~US~SKU12345 memiliki title: "Great T-Shirt" dan description: "A great short-sleeve t-shirt.".
    • Input Tambahan: Produk yang sama memiliki entri di sumber data tambahan dengan title: "Awesome T-Shirt" dan description: "An awesome short-sleeve t-shirt.".
    • Aturan Feed: Aturan ditetapkan untuk mengambil title dari sumber data tambahan. Tidak ada aturan untuk description.
    • Hasil: Product yang diproses terakhir memiliki title: "Awesome T-Shirt" dan description: "A great short-sleeve t-shirt.".
  2. Permintaan Pembaruan: Anda mengirim permintaan patch untuk memperbarui sumber data utama, menetapkan title ke "Fantastic T-Shirt" dan description ke "A fantastic short-sleeve t-shirt.".
  3. Memproses:
    • ProductInput di sumber data utama diperbarui agar memiliki title: "Fantastic T-Shirt" dan description: "A fantastic short-sleeve t-shirt.".
    • Pipeline pemrosesan berjalan.
    • Untuk title, aturan feed menyatakan bahwa nilai dari sumber data tambahan (Awesome T-Shirt) lebih diprioritaskan, sehingga menggantikan pembaruan Anda.
    • Untuk description, karena tidak ada aturan penggantian, nilai yang diperbarui dari input utama (A fantastic short-sleeve t-shirt.) akan digunakan.
  4. Produk Akhir: Judul Product akhir tetap Awesome T-Shirt (pembaruan Anda diganti), tetapi deskripsinya kini adalah A fantastic short-sleeve t-shirt. (pembaruan Anda diterapkan).

Memilih antara pembaruan dan sumber data tambahan

Anda dapat mengubah data produk menggunakan productinputs.patch atau dengan menyisipkan data ke dalam sumber data tambahan. Pilihan terbaik bergantung pada strategi pengelolaan data Anda.

Untuk menghindari hasil yang tidak dapat diprediksi, sebaiknya jangan gunakan productinputs.patch dan sumber data tambahan untuk mengelola data produk yang sama untuk produk yang sama.

Berikut perbandingan mendetailnya:

Fitur productinputs.patch (Pembaruan) Sumber Data Tambahan
Terbaik Untuk Perubahan sebagian yang cepat dan sering pada data yang ada (misalnya, harga, ketersediaan). Menyusun data yang terpisah secara logis, mengelola berbagai atribut oleh sistem yang berbeda, atau penggantian berbasis aturan yang kompleks.
Mekanisme Mengubah ProductInput yang ada di tempatnya. Membuat ProductInput baru yang terpisah di sumber data tambahan.
Perincian Data Beroperasi pada kolom tertentu dari satu ProductInput. Beroperasi di seluruh ProductInput dalam sumber tambahan.
Persistensi Perubahan akan tetap ada hingga ProductInput yang sama ditimpa oleh insert lengkap atau patch lain. Persistensi dikontrol oleh aturan feed. Dapat menggantikan data utama tanpa batas waktu jika aturan memprioritaskannya.
Interaksi Aturan Dapat digunakan tanpa aturan feed karena memperbarui sumber data & ProductInput yang ada. Memerlukan penyiapan aturan secara eksplisit di sumber utama untuk menautkan sumber tambahan.
Penyiapan Sumber Data Beroperasi pada sumber data yang ada. Tidak memerlukan sumber baru. Memerlukan pembuatan dan pengelolaan sumber data tambahan terpisah serta menautkannya menggunakan aturan feed.