Kategori ve kategori tarama E-ticaret, ürün

2 Cevap php

Ben bir müşteri için bir EC web sitesi inşa ediyorum ve proje yöneticisi bazı tuhaf fikirleri ile geldi ve ben aslında o müşteriye satılan ne uygulamak için mücadele ediyorum.

İşte benim ana sorun ve sistem kurulum nasıl hızlı bir özeti geliyor: Ürün içinde kategoriler, kategoriler bir başka kategori çocukları olabilir. Yani kategori web sitesinin sol kenar çubuğunda bir ağaç olarak sunulmaktadır.

Olmayan yaprak kategorisinde kullanıcı tıklama böyle bir liste bir seviye 1 kategori Exemple sunulacak olmalıdır eğer kullanıcı, herhangi bir kategori bile olmayan "yaprak" kategorisini göz atabilirsiniz (aynı seviyeye 2 kategoriler geçerlidir):

big category 1
 category level ( 3 or 2 )
  product 1
  product 2
  product 3
 category level ( 3 or 2 )

Şeyler de bazı çağrı ve her sayfada 5 ürün üzerinde mevcut olmalıdır. Artı kategori onlar sol taraftaki menüde görünür aynı şekilde sipariş edilmelidir ... benim DB düzeni şöyle:

+-------------+    +-------------+
+ category    +    + product     +
+-------------+    +-------------+
+ category_id +    + product_id  +
+ parent_id   +    + category_id + 
+-------------+    +-------------+

Ben gerçekten ürün, (ürün ve kategoriler sipariş gibi bir menü var) olmalıdır sırayla görünür emin olmak için SQL kodu nasıl anlamaya olamaz.

Ayrıca kullanıcının tüm alt kategori arama ve (id1, id2, ID3) IN büyük bir kategori yapmak gerekir olmayan bir "yaprak" kategorisini seçerseniz ben, bütün kurulum performansı hakkında endişe duyuyorum ve ben deneyim uzun biliyorum IN deyimini iyi yapmazlar.

Birisi aynı tasarım / sorunla karşılaştı ve bunu yapmak için nasıl bazı tavsiyeler var varsa ben minnettar olacaktır.

2 Cevap

Sen Materialized Path tasarımı kullanabilirsiniz. Bir dizin yolu hayata yolu bir örnektir. Yani, bazı karakter ("/" veya "," ortak) ayırarak ile birlikte birleştirilmiş ata değerleri bir dizi vardır.

Yani kategoriler olabilir:

+---------------------------------------------+
| cat_id | Name            | cat_path | depth |
+---------------------------------------------+
|    1   | Electronics     | 1/       |   1   |
|    2   | Digital cameras | 1/2/     |   2   |
|    3   | SLR cameras     | 1/2/3/   |   3   |
|    4   | Audio           | 1/4/     |   2   |
|    5   | Konuşmacılar        | 1/4/5/   |   3   |
|    6   | Wall Satellites | 1/4/5/6/ |   4   |
|    7   | Bilgisayarlar       | 1/7/     |   2   |
+---------------------------------------------+

Eğer Ses altında olan tüm ürünleri istiyorsanız Şimdi, sizin gibi bir sorgu yapabilirsiniz:

SELECT p.*, pc.*
FROM Products p JOIN Categories pc ON (p.cat_id = pc.cat_id)
JOIN Categories c ON (pc.cat_path LIKE c.cat_path||'%')
WHERE c.name = 'Audio';

Örneğin, '1/4/5/6' LIKE '1/4/%', bu nedenle duvar Uydular dahildir, geçerlidir. Ve Ses başka alt kategorisi için aynı.


Re your question about menu rendering: I assume you'd want the menu to render: - All ancestors of the chosen category - All siblings of the ancestors of the chosen category

Yani 'Konuşmacılar' seçerseniz, görmek istiyorum:

  • Electronics
    • Audio
      • Konuşmacılar
    • Bilgisayarlar
    • Dijital Kameralar

Ama Bilgisayarlar veya Dijital Fotoğraf Makineleri (Konuşmacılar yani "kuzenleri") soyundan istemiyorum.

SELECT uncle.name, uncle.depth
FROM Categories chosen
JOIN Categories ancestor ON (chosen.cat_path LIKE ancestor.cat_path||'%')
JOIN Categories uncle ON (ancestor.depth = uncle.depth
  AND SUBSTRING(REVERSE(ancestor.cat_path), 3, 100) = SUBSTRING(REVERSE(uncle.cat_path), 3, 100))
WHERE chosen.name = 'Konuşmacılar'
ORDER BY uncle.depth, uncle.name;

Ben amcam algılamak için bir hile kullanıyorum: yollarını karşılaştırmak, son öğe sıyırma sonra. Bunu yapmak için, dize ters ve ardından first elemanı şerit. Bu, en azından MySQL ve MS SQL Server çalışır, ancak REVERSE() standart değildir ve RDBMS'in diğer markalara taşınabilir olmayabilir gerekir.

Muhtemelen ofset substring da artırmak gerekir bu durumda, cat_path her öğe için birden fazla basamak için izin gerektiğini unutmayın.

Performans açısından bakıldığında, bu kötü bir tasarımdır. Bir müşteri yanlışlıkla toppermost kategorisinde tıklarsa tüm envanter sorgu yürütmek istiyorum. Bu muhtemelen bir zaman kabul edilemez miktarda alacaktır. Web açısından bu rakibinin site ve never visiting your site again üzerine tıklayarak, müşteri kaybetme sabır çevirir.

Tabii ki, erken optimizasyon kötü tüm ve tüm bu kök, ama tamamen aptalca şeyler yapıyor önlemek için iyi bir fikirdir.

Ben de bir yaklaşım olarak ağaç navigasyon fikrine ile sorun alacaktı. Bu "Guess nasıl envanter bizim stok" bir oyun oynamak için müşterilerinize soran biraz fazla smacks. Başka bir şey dışında, birçok alanda bir ürün birden fazla kategoriye ait, yani bir hiyerarşi içinde onları uydurma keyfi bir süreç olabilir. En azından muhtemelen çok yapraklı kategoride bir ürünü atama destekleyen bir veri modeli gerekirdi. (Bu satıyorsanız ne doğa ve kategorilerin parçalı bağlı olabilir).

Patronun yolda ısrar ederse o zaman yine sorgu performansını artırmak için bazı seçenekler var. Örneğin siz tüm ana kategorilerde katıldığı tüm ürünlerini içeren bir tablo olabilir ...

cat1 product1
cat1 product2
cat1 product3
cat1 product4
cat1 cat1.1 product1
cat1 cat1.1 product2
cat1 cat1.2 product3
cat1 cat1.2 product4
cat1 cat1.1 cat1.1.1 product1
cat1 cat1.1 cat1.1.2 product2
cat1 cat1.2 cat1.2.1 product3
cat1 cat1.2 cat1.2.2 product4

Siz (ne veritabanı lezzet sunuyor bağlı) yoluyla tetikler ya da bir bakış olarak veya başka bir mekanizma aracılığıyla, bu korumak gerekir. Ama bunu sürdürmenin havai her müşteri sorgu için yeniden monte ürün hiyerarşi zorunda değil performans faydaları ile karşılaştırıldığında önemsizdir olacaktır. Bu mümkün değildir yanında envanter o kadar volatilite var.