ikhalilatteib Şöyle bir şey olabilir:
Önce size, color gibi ürüne eklenebilen özellikleri tutalım. Bunlara sonradan ekleme yapılabilir ve genellikle üründen ürüne değişirler.
attributes
+----+-------+
| id | name |
+----+-------+
| 1 | Beden |
| 2 | Renk |
+----+-------+
Bunların bir de alabileceği değerler olur:
attribute_values
+----+---------+---------+
| id | attr_id | name |
+----+---------+---------+
| 1 | 1 | S |
| 2 | 1 | M |
| 3 | 1 | L |
| 4 | 1 | XL |
| 5 | 2 | Kırmızı |
| 6 | 2 | Siyah |
| 7 | 2 | Beyaz |
+----+---------+---------+
Bazı özellikleri bazı ürünlerde kullanamazsınız, örneğin ayakkabının bedeni değil numarası olur. O yüzden ayakkabıları listelerken S, M, L diye filtre görmek istemem. Bunun için de hangi ürünün hangi özelliğe sahip olacağını ara bir tabloda tutmam gerekecek:
product_has_attributes
+------------+---------+
| product_id | attr_id |
+------------+---------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 1 |
+------------+---------+
Son olarak da bir ürün hangi özelliğin hangi değerine sahip onu tutmam gerekiyor. Yani tshirt bedeni var ama hangi beden, ayakkabının rengi var ama hangi renk:
product_has_attribute_values
+------------+----------+
| product_id | value_id |
+------------+----------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
+------------+----------+
İlişkilere bakarsak:
+-----------+---------------+----------------+
| Model | Relation | Model |
+-----------+---------------+----------------+
| Attribute | HasMany | AttributeValue |
| Product | BelongsToMany | Attribute |
| Product | BelongsToMany | AttributeValue |
+-----------+---------------+----------------+
Bu çok basit bir tasarım. Gerçek dünyada uygularken ne yazık ki değişir. Örneğin özellikler ürüne mi iliştirilmeli kategoriye mi iliştirilmeli yoksa bir grup oluşturup o gruba mı iliştirimeli. Kategoriler de o grup altına alınabilinir mi... Kategoriye iliştirdiğinizde o kategori altındaki tüm ürünler bu özelliklere sahip olacak ama ya aralarıdan bir tanesi ekstra bir özelliğe sahip olacaksa? Diğer yandan ürün varyantları var, bazı varyantlarda ana üründeki özellikler olmayabilir vs...
Bu şekilde bir başlangıç yapabilirsiniz.