• 15-04-2025, 15:17:13
    #1
    Laravel ile geliştirdiğim bir ürün yönetimi sisteminde her kategorinin kendine özgü attribute'ları (özellikleri) bulunuyor ve yalnızca en alt kategorilere ürün atanabiliyor. Ayrıca bazı attribute'lar varyant oluştururken, bazıları sadece ürün açıklaması seviyesinde kalıyor.

    Genel Yapı:

    • Her kategorinin kendi attribute seti var.
    • Attribute'lar şu flag’lerle tanımlanıyor: is_variant, is_mandatory, is_custom_value gibi.
    • Varyantlı ürünler için attribute kombinasyonlarıyla farklı stok/fiyat oluşturulabiliyor.

    Örnek Senaryo:

    • Kategori: “Küvet”
      • Attribute: Renk (is_variant = true, is_custom_value = true)
      • Attribute: Menşei (is_variant = false)
    • Ürün oluşturulurken: “Antrasit Küvet” -> fiyat, stok vs. giriliyor.

    Örnek Kategori Yapısı



    {
      "categories": [
        {
          "id": 101,
          "parentId": null,
          "name": "Banyo & Tuvalet",
          "subCategories": [
            {
              "id": 1153,
              "parentId": 101 ,
              "name": "Küvet",
              "subCategories": null
            }
          ]
        }
      ]
    }



    Örnek Kategoriye Bağlı Attribute'lar


    {
      "id": 1153 ,
      "name": "Küvet",
      "categoryAttributes": [
        {
          "attributeId": 1262,
          "categoryId": 1153 ,
          "attributeName": "Menşei",
          "isMandatory": false,
          "isVariant": false,
          "isSlicer": false,
          "isCustomValue": false,
          "attributeValues": [
            {
              "id": 11893953,
              "value": "AD - (Andora)"
            },
            {
              "id": 11893954,
              "value": "AE - (Birleşik Arap Emirlikleri)"
            }
          ]
        },
        {
          "attributeId": 429,
          "categoryId": 1153 ,
          "attributeName": "Renk",
          "isMandatory": true,
          "isVariant": true,
          "isSlicer": false,
          "isCustomValue": true,
          "attributeValues": [
            {
              "id": 6810790,
              "value": "Antrasit"
            },
            {
              "id": 6701330,
              "value": "Açık Gri"
            }
          ]
        }
      ]
    }
    Ürün Kaydı Örneği
    {
      "category_id": 1153 ,
      "name": "Köşe Küvet",
      "description": "Dayanıklı köşe küvet",
      "attributes": [
        {
          "attribute_id": 1262,
          "value_id": 11893954
        }
      ],
      "variants": [
        {
          "price": 1999.90,
          "stock": 20,
          "sku": "KUVET-ACT120",
          "attributes": [
            { "attribute_id": 429, "custom_value": "Antrasit" }
          ]
        }
      ]
    }

    Sormak İstediğim:

    1. Bu sistemin veri modellemesi hakkında ne düşünüyorsunuz? Eksik veya karmaşık gördüğünüz yer var mı?
    2. Varyant yönetimi için daha iyi bir yaklaşım önerir misiniz?
    3. “Kategoriye göre attribute” yaklaşımı ölçeklenebilir mi? Yarın 1000 kategoriye çıktığında bu yapı yorucu hale gelir mi?
    4. is_variant, is_custom_value, is_slicer gibi bayraklarla kontrol sizce sağlıklı mı, başka modelleme öneriniz olur mu?
  • 15-04-2025, 15:51:03
    #2
    Gayet güzel olmuş hocam.

    Attribute değerleri her kategori için tekrar tekrar saklanıyor. Bu da aynı attribute'un farklı kategorilerde kullanıldığında veri tekrarına neden olabilir. subCategories: null yerine subCategories: [] kullanırsanız frontend null kontrolünü azaltmış olursunuz. Benzer kategorilerde aynı attribute'ların tekrar tekrar tanımlanması, yönetim zorluğu ve veri tekrarı yaratabilir.

    Kategori hiyerarşisi üzerinden attribute kalıtımı sistemi ekleyerek, üst kategoride tanımlanan attribute'ların otomatik olarak alt kategorilere aktarılmasını sağlayabilirsiniz:

    function getCategoryAttributes($categoryId) {
        $attributes = [];
        $category = Category::find($categoryId);
        
        // Kendi attribute'larını ekle
        $attributes = array_merge($attributes, $category->attributes);
        
        // Üst kategori attribute'larını ekle (isteğe bağlı olarak)
        if ($category->parent_id) {
            $parentAttributes = getCategoryAttributes($category->parent_id);
            $attributes = array_merge($attributes, $parentAttributes);
        }
        
        return $attributes;
    }
  • 15-04-2025, 15:58:20
    #3
    lookout adlı üyeden alıntı: mesajı görüntüle
    Gayet güzel olmuş hocam.

    Attribute değerleri her kategori için tekrar tekrar saklanıyor. Bu da aynı attribute'un farklı kategorilerde kullanıldığında veri tekrarına neden olabilir. subCategories: null yerine subCategories: [] kullanırsanız frontend null kontrolünü azaltmış olursunuz. Benzer kategorilerde aynı attribute'ların tekrar tekrar tanımlanması, yönetim zorluğu ve veri tekrarı yaratabilir.

    Kategori hiyerarşisi üzerinden attribute kalıtımı sistemi ekleyerek, üst kategoride tanımlanan attribute'ların otomatik olarak alt kategorilere aktarılmasını sağlayabilirsiniz:

    function getCategoryAttributes($categoryId) {
        $attributes = [];
        $category = Category::find($categoryId);
        
        // Kendi attribute'larını ekle
        $attributes = array_merge($attributes, $category->attributes);
        
        // Üst kategori attribute'larını ekle (isteğe bağlı olarak)
        if ($category->parent_id) {
            $parentAttributes = getCategoryAttributes($category->parent_id);
            $attributes = array_merge($attributes, $parentAttributes);
        }
        
        return $attributes;
    }
    Aslında şöyle şuanki eticaret sistemlerinin de yapmış olduğu sadece en alt uç kategoriye ürün girilmesini sağlamak amacım ağacın dalından değilde yaprağından faydalanmak
  • 15-04-2025, 16:01:04
    #4
    EvrenOnur adlı üyeden alıntı: mesajı görüntüle
    Aslında şöyle şuanki eticaret sistemlerinin de yapmış olduğu sadece en alt uç kategoriye ürün girilmesini sağlamak amacım ağacın dalından değilde yaprağından faydalanmak
    Haklısınız. Trendyol api kategori listesini incelemişsinizdir diye tahmin ediyorum.

    https://api.trendyol.com/sapigw/product-categories
    https://api.trendyol.com/sapigw/prod...856/attributes
  • 15-04-2025, 16:09:31
    #5
    lookout adlı üyeden alıntı: mesajı görüntüle
    Haklısınız. Trendyol api kategori listesini incelemişsinizdir diye tahmin ediyorum.

    https://api.trendyol.com/sapigw/product-categories
    https://api.trendyol.com/sapigw/prod...856/attributes
    evet hocam ordan yola çıkarak ilerledim