עדכונים תכופים של המוצרים

ה-Products sub-API מאפשר לכם לבצע עדכונים חלקיים במוצרים הקיימים. השיטה הזו מתאימה במיוחד לנתונים שמשתנים לעיתים קרובות, כמו מחיר וזמינות, כי היא מאפשרת לעדכן שינויים קטנים בלי לשלוח מחדש את כל המוצר. עם זאת, כדאי להוסיף מחדש מוצרים באופן קבוע כדי לוודא שכל נתוני המוצרים מסונכרנים.

במדריך הזה מוסבר איך להשתמש בשיטת productinputs.patch כדי לעדכן את המוצרים.

דרישות מוקדמות

כדי לעדכן מוצר, צריך:

עדכון פרטים ספציפיים של מוצרים

כדי לשנות כמה פרטים של מוצר, כמו המחיר או הזמינות שלו, בלי לשלוח מחדש את כל המידע שלו, צריך להשתמש בשיטה productInputs.patch.

אפשר לציין אילו שדות משנים בפרמטר updateMask. ‫updateMask: רשימה מופרדת בפסיקים של השדות שרוצים לעדכן. השיטה patch פועלת באופן הבא:

  • שדות ב-updateMask ובגוף: השדות האלה מתעדכנים עם הערכים החדשים.
  • שדות ב-updateMask אבל לא בגוף ההודעה: השדות האלה נמחקים מקלט המוצר.
  • שדות שלא מופיעים ב-updateMask: השדות האלה לא משתנים.
  • הפרמטר 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",
    "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"
  }
}

בדוגמה הזו מעדכנים את title ואת availability של מוצר ומוחקים את imageLink שלו. הערכים description ו-price לא נמצאים ב-updateMask ולא ישתנו.

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"
    }
 }
}

קריאה מוצלחת מחזירה את המשאב ProductInput המעודכן. הערכים של title ושל availability מתעדכנים, והערך של imageLink מוסר כי הוא היה ב-updateMask אבל לא בגוף הבקשה. המינויים description ו-price לא השתנו כי הם לא נכללו ברשימה 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"
    ],
  }
}

בדוגמאות הקוד הבאות מוצגות דרכים לעדכן מוצר.

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"
   }
}'

עדכון באמצעות מאפיינים מותאמים אישית

אפשר לעדכן מאפיינים רגילים ומותאמים אישית בקריאה אחת. כדי לעדכן מאפיין מותאם אישית, מוסיפים את הקידומת customAttributes לשם שלו ב-updateMask.

בדוגמה הזו מתבצעות כמה פעולות בבקשה אחת:

  • מעדכן ישירות את מאפיין title הרגיל.
  • עדכון של מאפיין מותאם אישית קיים (myCustomAttrToBeUpdated).
  • הוספה של מאפיין מותאם אישית חדש (myCustomAttrToBeInserted).
  • מחיקת מאפיין מותאם אישית קיים (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"
    }
  ]
}

אם הבקשה מצליחה, מוחזרת ProductInput מעודכנת עם כל השינויים שצוינו.

הסבר על עדכונים של מאפיינים מותאמים אישית

אפשר להשתמש בשדה customAttributes כדי לעדכן מאפיינים שהגדרתם בעצמכם. המאפיינים האלה לא ממופים למפרט הרגיל והם יישמרו כמאפיינים מותאמים אישית במוצר הסופי.

איך מתבצע עיבוד של עדכוני מוצרים

כששולחים בקשת patch, העדכון חל על נתוני ProductInput הספציפיים לפני הפעלת הכללים. כתוצאה מכך, ההתנהגות של המערכת עקבית גם כשמוסיפים מוצרים וגם כשמעדכנים אותם.

כך מתבצע העיבוד של העדכון:

  1. עדכון קלט: הבקשה שלך patch משנה את ProductInput הספציפי שמשויך למקור הנתונים שסיפקת.

  2. עיבוד ומיזוג: אחרי שהקלט מתעדכן, מתחיל העיבוד:

    • כללי פיד ומקורות נתונים משלימים: כללים שהוגדרו במקור הראשי של המוצר משלבים את ProductInput מהמקורות הראשיים והמשלימים. הכללים האלה יכולים לשנות מאפיינים או ליצור מאפיינים חדשים. מידע נוסף על הגדרת הכללים זמין במאמר https://support.google.com/merchants/answer/14994083.
    • מקורות נתונים אחרים: נתונים ממקורות אחרים (לדוגמה, שיפורים אוטומטיים) ממוזגים גם הם עם הקלט של מקור הנתונים הראשי.
    • אימות: הנתונים הממוזגים מאומתים בהתאם למפרט נתוני המוצרים ולמדיניות של Google שופינג.
  3. המוצר הסופי: התוצאה של צינור העיבוד הזה היא משאב Product סופי שעבר עיבוד שאפשר להחזיר באמצעות products.get או products.list. זו גם הגרסה של המוצר שמוצגת ב-Merchant Center ויכולה להופיע ביעדים שונים.

בגלל התהליך הרב-שלבי הזה, יש עיכוב, בדרך כלל של כמה דקות, בין שליחת בקשת העדכון לבין הזמן שבו השינויים משתקפים במשאב Product הסופי שאפשר לאחזר באמצעות products.get.

דוגמה: עדכון מוצר עם קלט ראשי יחיד

זהו התרחיש הנפוץ ביותר. מוצר קיים במקור נתונים ראשי יחיד, ואתם רוצים לעדכן חלק מהמאפיינים שלו.

  1. מצב התחלתי: מוצר en~US~SKU12345 קיים במקור הנתונים הראשי עם הערכים title: "Classic T-Shirt" ו-price: 15.99 USD.
  2. בקשת עדכון: אתם שולחים בקשה של patch לעדכן את price ל-14.99 USD ולהגדיר את availability ל-out of stock.
  3. בתהליך עיבוד:
    • המאפיין ProductInput של SKU12345 עודכן.
  4. המוצר הסופי: ל-Product הסופי יש עכשיו title: "Classic T-Shirt",‏ price: 14.99 USD ו-availability: "out of stock".

דוגמה: עדכון מוצר באמצעות נתונים משלימים וכללים

בדוגמה הזו אפשר לראות איך כללי פיד יכולים להשפיע על עדכון, ולגרום לכך שחלק מהשינויים יחולו ואחרים יבוטלו.

  1. Initial State:
    • קלט ראשי: ל-en~US~SKU12345 יש title: "Great T-Shirt" ו-description: "A great short-sleeve t-shirt.".
    • קלט משלים: לאותו מוצר יש רשומה במקור נתונים משלים עם הערכים title: "Awesome T-Shirt" ו-description: "An awesome short-sleeve t-shirt.".
    • כלל פיד: כלל מוגדר כך שיקח את הערך title ממקור הנתונים המשני. אין כלל לdescription.
    • תוצאה: Product שעבר עיבוד סופי כולל title: "Awesome T-Shirt" ו-description: "A great short-sleeve t-shirt.".
  2. בקשת עדכון: אתם שולחים בקשת patch לעדכון מקור הנתונים הראשי, ומגדירים את title לערך "Fantastic T-Shirt" ואת description לערך "A fantastic short-sleeve t-shirt.".
  3. בתהליך עיבוד:
    • הערך ProductInput במקור הנתונים הראשי מתעדכן ל-title: "Fantastic T-Shirt" ו-description: "A fantastic short-sleeve t-shirt.".
    • צינור העיבוד פועל.
    • במקרה של title, כלל הפיד קובע שהערך ממקור הנתונים המשלים (Awesome T-Shirt) קודם לערך שעדכנתם, ולכן הוא יחליף אותו.
    • במקרה של description, מכיוון שאין כלל שמבטל את ברירת המחדל, נעשה שימוש בערך המעודכן מהקלט הראשי (A fantastic short-sleeve t-shirt.).
  4. המוצר הסופי: השם הסופי של Product נשאר Awesome T-Shirt (העדכון שלכם בוטל), אבל התיאור שלו הוא עכשיו A fantastic short-sleeve t-shirt. (העדכון שלכם הוחל).

בחירה בין עדכונים לבין מקורות נתונים משלימים

אפשר לשנות את נתוני המוצרים באמצעות productinputs.patch או על ידי הוספת נתונים למקורות נתונים משלימים. הבחירה הטובה ביותר תלויה באסטרטגיה שלכם לניהול נתונים.

כדי למנוע תוצאות בלתי צפויות, מומלץ לא להשתמש גם בproductinputs.patch וגם במקורות נתונים משלימים כדי לנהל את אותם נתוני מוצרים של אותו מוצר.

הנה השוואה מפורטת:

תכונה productinputs.patch (עדכונים) מקורות נתונים משלימים
הכי מתאים ל שינויים מהירים, תכופים וחלקיים בנתונים קיימים (למשל, מחיר, זמינות). שילוב של נתונים נפרדים באופן הגיוני, ניהול מאפיינים שונים על ידי מערכות שונות או ביטולים מורכבים שמבוססים על כללים.
מנגנון משנה ProductInput קיים במקום. יוצרת ProductInput חדש ונפרד במקור נתונים משלים.
רמת הפירוט של הנתונים הפעולה מתבצעת בשדות ספציפיים של ProductInput יחיד. הפעולה מתבצעת על כל ProductInput במקור המשני.
התמדה השינויים נשמרים עד שקובץ ProductInput זהה מוחלף על ידי קובץ insert מלא או קובץ patch אחר. ההתמדה נקבעת על ידי כללי הפיד. יכולים לבטל את הנתונים הראשיים ללא הגבלת זמן אם הכללים נותנים לו עדיפות.
אינטראקציה עם כללים אפשר להשתמש בו בלי כללי הפיד כי הוא מעדכן מקור נתונים קיים ProductInput. צריך להגדיר במפורש כלל במקור הראשי כדי לקשר את המקור המשלים.
הגדרת מקור נתונים הפעולה מתבצעת במקור נתונים קיים. אין צורך במקורות חדשים. האפשרות הזו מחייבת ליצור ולנהל מקורות נתונים משלימים נפרדים ולקשר אותם באמצעות כללי פיד.