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
)