Birden fazla kategoride en iyi uygulamalar Öğeler

3 Cevap php

I'm making list of items in categories, problem is that item can be in multiple categories. What is your best practice to store items in categories and how list all items within category and its child categories? I am using Zend Framework and MySQL to slove this issue.

Cevaplar için teşekkürler.

İngilizcem için özür dilerim :)

3 Cevap

Yani, sen kategorilerde bir hiyerarşi var, evet? Bu bir seviye (kategori ve alt kategori) veya herhangi bir sayı (çocuk vs, çocuk sahibi olabilir) var mı? Bu çözüm ne etkileyecektir.

Genellikle, gibi, bir çok-çok ilişkisi olan bu gibi bir şey Modele istiyorum:

CREATE TABLE Item(
  item_id INT NOT NULL, 
  item_name VARCHAR(255) NOT NULL
)
CREATE TABLE Category(
  category_id INT NOT NULL, 
  category_name VARCHAR(255) NOT NULL
)
CREATE TABLE Item_Category(
  item_id INT NOT NULL REFERENCES Item(item_id), 
  category_id INT NOT NULL REFERENCES Category(category_id)
 )

"Item_Category" in bir kayıt listelenen madde listelenen kategorisinde olduğu anlamına gelir. Daha sonra yapılacaklar öğeleri hangi kategorilerde olan listelemek için bu tabloları 2 (veya 3) arasına katıldı yapabilirsiniz:

SELECT I.* 
  FROM Item I 
    INNER JOIN Item_Category IC ON I.item_id = IC.item_id 
    INNER JOIN Category C on IC.category_id = C.category_id 
  WHERE 
    C.category_name = 'MyCategory'

Ya da hangi kategoride bir öğe vardır:

SELECT C.*
  FROM Category C
    INNER JOIN Item_Category IC.category_id = C.category_id 
    INNER JOIN Item I on IC.item_id = I.item_id
  WHERE 
    I.item_name = 'MyItem'

Kategorilerde bir hiyerarşi varsa, bu gibi kategori tablosunda yinelenen ilişki, kullanılarak ifade edilebilir:

CREATE TABLE Category(
  category_id INT NOT NULL, 
  category_name VARCHAR(255) NOT NULL,
  parent_category_id INT NOT NULL REFERENCES Category(category_id)
)

Bir kategori ve çocuklar için tüm kayıtları almak için özyinelemeli sorguları kullanmak zorunda çünkü bu işler daha karmaşık hale getirir. Eğer kategorilerden yalnızca iki seviyeleri varsa basit bir yolu, sadece gibi, bu kategori masaya ikinci bir alan yapmak için:

CREATE TABLE Category(
  category_id INT NOT NULL, 
  category_name VARCHAR(255) NOT NULL,
  subcategory_name VARCHAR(255) NULL
)

Bir öğe birden fazla kategoride olabilir eğer, daha sonra bu 'kategoriler' değildir. daha etiketleri gibiler.

öğeleri ve etiketleri arasında çok-çok ilişkileri kullanın. Eğer etiketleri bir hiyerarşi istiyorsanız, bunun için gitmek; ama değer katacak çok nadiren genellikle overkill ve bulunuyor.

Tipik olarak, çoğu durumda çalışır ben buldum iyi çözüm sadece kategoriler tablosundaki parent_id alanını kullanıyor. Bu şekilde sadece tek bir kategoride tablo gerekir. Bu seviyelerden herhangi sayıda destek ya da sadece bir sen (bu durumda, kategorisinde üçüncü düzeyi oluşturmak için yeteneği kodunuzda önlenebilir gerekir) istiyorsanız olacaktır.

For example:
CREATE TABLE category ( id INT NOT NULL AUTO_INCREMENT, parent_id INT NOT NULL DEFAULT '0' name VARCHAR(255) NOT NULL ) It's simpler that way. Any category with a parent_id of 0 will be your top-most level. If you have a category whose id is 1 and you create a sub-category of that it's parent_id will be 1 etc.