Bu ses, bir e-ticaret sitesi için Odaklı Tasarım itiraz edilir?

5 Cevap php

Ben OOP / OOD oldukça yeniyim, ve ben öğrenmek için bir şey var fark, bu yüzden onların giriş için SO topluluk sormak istiyorum.

Temelde, ben CakePHP'nin MVC framework kullanıyorum ve ben yapıyorum online mağaza sadece deyimleri oluşturuyor aşağıdaki tarif 2 modelleri, Kategori ve Ürün, kullanıyor:

CREATE TABLE `categories` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `name` varchar(255) default NULL,
    `parent_id` int(11) default NULL REFERENCES categories(`id`),
    `lft` int(11) default NULL,
    `rght` int(11) default NULL,
    PRIMARY KEY (`id`)
);
CREATE TABLE `products` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `name` varchar(255) default NULL,
    `artist_id` int(11) default NULL REFERENCES artists(`id`),
    `description` text default NULL,
    `category_id` int(11) default NULL REFERENCES categories(`id`),
    `status` enum('in stock', 'pre-order', 'out of stock') NOT NULL,
    `price` decimal(6,2) default NULL,
    `picture` varchar(255) default NULL,
    `picture2` varchar(255) default NULL,
    PRIMARY KEY (`id`)
);

Online mağaza kapsayacak şekilde gidiyor:

  • Music
    • CD'ler
    • DVD'ler
  • Apparel
    • Hoodies
    • T-shirts
      • Uzun kollu Tees
      • Babydolls
    • Şapkalar
  • Misc Merch
    • Etiketler
    • Posterler
    • Tote Çanta
  • Downloads
    • Zil
    • MP3'ler

Gelecekte yeni kategoriler ekleyebilir olsa da, temelde, yani kategori ağacın yapısı bulunuyor. Şu anda tüm ürünler kendi category_id ürünlerin farklı ayırt etmek için tek yol olmak, Ürün sınıfı nesneler olarak eşit muamele yapılmaktadır. Online mağaza da sitenin sadece bir bölümüdür. Sitenin geri kalanı, sanatçı biyografisi ve diskografilerini gibi bilgileri içerir; böylece ben de için modeller / tablolar var: Artist, Album, Track.

Bu iyi bir yaklaşım mı? Yoksa CD'ler/T-shirts/MP3'ler / ... Ürün sınıfından devralan için ayrı alt sınıflarını yaratmak olmalıdır? Ben otomatik parça listeleri ve ürün açıklaması için diğer bilgi üretmek için diskografisi giriş deposunda her müzik CD'si bağlamak istiyorum.

Bu şeyler hakkında gitmek için iyi bir yol değilse, bunu nasıl yerine yapardınız? Ayrıca, hangi yöntemleri / özellikleri benim Kategori / Ürün sınıfta içermelidir? Ve ben sadece kategori ağacının yaprak düğümlerin ürünler listesi gerekir?

Edit:
Obviously this design is incomplete. As Cyril pointed out, the Product.price field was missing, and there are still no provisions for sales. I'm actually still trying to work out how best to design & implement those aspects of the store. Most likely, I will just have another model called Orders, but actually processing orders is made more complicated by the fact that we are applying different shipping rates based on shipping destination and what the order contains.

5 Cevap

Hala ürünler tablosunu tutmak ve polymorphic behavior kullanıyorsanız, farklı "ürünlerin alt" yapabiliriz. Yani bir yerde (fiyat vb) tüm common veri tutmak için kolay bir yoldur.

Alternatif olarak, attributes, bir masanın üzerinde aynı polimorfik davranış kullanın ve bir şey ürünü özel bir niteliği (isim => değer çiftleri) olarak ekleyebilirsiniz. Bu, tüm baş ve veri miktarı fikri bağlıdır.

Eğer büyük bir veritabanı var planlıyorsanız ilk çözüm muhtemelen daha iyidir.

Yerine alt sınıflarından daha bir yapılandırma + davranış yaklaşımı seviyorum.

Bu kategori düzeyinde davranışların bit olabilir. Senaryoya bağlı olarak, bazı davranışları ne olursa olsun kategorilerden belirli ürünler için geçerlidir şey için olduğu gibi, ayrı ürün türlerine ilişkili olabilir. Eğer ek kategorilerde ilişkili bu ekstra davranışlar olabilir çünkü bu son parça Sigara öneri de, anlamda bir sürü olur. Bu şekilde sürece zaten kodlu davranışları ile çalışan olarak, bunu destekleyecek davranışlar gösteren hangi yeni kategoriler ekleyebilirsiniz.

Küçük bir varyasyon, yerine bit kategorilerine ilişkili davranışların listesi olacaktır.

Ek sınıflar yerine ürün sınıflarında altında tüm karıştırmak zorunda kalmadan, davranışları için olacaktır. Bu ekstra şeyler için bir UI ilişkilendirmek gerekirse, ne olursa olsun ürün türleri, davranışları için ilgili olabilir.

Onlar tipine özgü özelliğe sahip olacak, özellikle Evet, muhtemelen, ürünlerin farklı türleri için ayrı alt sınıflarının oluşturulması gerekir. Otomatik olarak söz parça listeleri üretme gibi.

Ürün tipi özel kod ile uğraşırken Ama bu bile olmadan, ayrı ayrı adlandırılmış ürün sınıfları kullanarak Eğer kodu daha okunabilir ve daha mantıklı hale getirecek.

You also might want to create a more specific database model. Like

table: product
prod_id
...common stuff..

product_clothes
prod_id
...Clothes specific stuff...

product_music
prod_id
...music specific stuff...

product_merch
prod_id
...merchandise specific stuff..

Müzik yok çünkü inç ve giysi ölçülen bir boyut bitrate yok.

Sen category_id sütunu atlamak ve daha bir etiket bulutu gibi ilişki modeli olmalıdır. Bir veya daha fazla kategori ile her ürün ilişkilendirmek istediğiniz olacaktır.

Sen artist_id sütunu atlamak ve daha bir etiket bulutu gibi ilişki modeli olmalıdır. En sonunda birden sanatçılar ile bazı ürün ilişkilendirmek isteyeceksiniz.

Kategoriler, etiket bulutları kullanmak için VAR, tarihlenmektedir. Kural olarak, bir referans deyimi ile tablo oluşturmak ASLA; Tablodaki her sütun bir başvuruları deyimi vardır SÜRECE.

Hayır,

Siz) Basit bir kategori bölümü elde edilemez (özel t-shirt gibi logolar, vb) bazı mırıldanmak-jumbo sihirli gerekli olmadıkça kesinlikle ayrı alt sınıflarının oluşturulması gerekir. Hatta bu durumda kategori sınıfına (örneğin HasLogo) bir ekstra bayrak alanında koyarak güvenli olabilir.

Fakat tasarım henüz beni etkilemek değil. Ne tür bir dükkan satışları için hiçbir hüküm vardır? Ne fiyat alanı hakkında?

Ayrıca esneklik uğruna ayrı bir tabloda resmi koyabilirsiniz.

Eğer lft / rght ne için kullanıyorsunuz? Sen ağaç kategorinin yerini saklamak için basit bir Inde özelliğini kullanın, ancak bir kategori eklemek / silmek her zaman güncellemek gerekir hatırlıyorum.