4 Stimmen

Artikel aus mehreren Kategorien Best Practices

Ich erstelle eine Liste von Artikeln in Kategorien. Das Problem ist, dass ein Artikel in mehreren Kategorien sein kann. Was ist Ihre beste Praxis, um Elemente in Kategorien zu speichern und wie Liste alle Elemente innerhalb der Kategorie und deren Kind Kategorien? Ich verwende Zend Framework und MySQL, um dieses Problem zu lösen.

Vielen Dank für Ihre Antworten.

Entschuldigung für mein Englisch :)

9voto

Ian Varley Punkte 8897

Sie haben also eine Hierarchie in den Kategorien, ja? Ist es eine Ebene (Kategorie und Unterkategorie) oder eine beliebige Anzahl (Kinder können Kinder haben usw.)? Das wird sich auf die Lösung auswirken.

Normalerweise würde man so etwas mit einer Many-to-many-Beziehung modellieren, etwa:

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)
 )

Ein Eintrag in "Item_Category" bedeutet, dass der gelistete Artikel in die gelistete Kategorie fällt. Sie können dann Verknüpfungen zwischen 2 (oder 3) dieser Tabellen durchführen, um aufzulisten, welche Artikel in welchen Kategorien sind:

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'

Oder welche Kategorien ein Artikel hat:

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'

Wenn es eine Hierarchie in den Kategorien gibt, könnte dies durch eine rekursive Beziehung in der Kategorietabelle ausgedrückt werden, wie z. B.:

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

Das macht die Sache komplizierter, weil Sie rekursive Abfragen verwenden müssen, um alle Datensätze für eine Kategorie und ihre Kinder zu erhalten. Eine einfachere Möglichkeit, wenn Sie nur zwei Ebenen von Kategorien haben, ist es, einfach ein zweites Feld in der Kategorietabelle zu erstellen, wie:

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

3voto

Javier Punkte 58737

Wenn ein Artikel in mehreren Kategorien enthalten sein kann, handelt es sich nicht um "Kategorien", sondern eher um "Tags".

Verwenden Sie Many-to-many-Beziehungen zwischen Ihren Artikeln und Tags. Wenn Sie eine Hierarchie von Tags wünschen, können Sie das tun, aber das ist in der Regel ein Overkill und bringt nur selten einen Mehrwert.

0voto

Yes Barry Punkte 9228

Die beste Lösung, die ich gefunden habe und die in den meisten Fällen funktioniert, ist die Verwendung eines parent_id-Feldes in Ihrer Kategorientabelle. Auf diese Weise benötigen Sie nur eine Kategorietabelle. Dies unterstützt eine beliebige Anzahl von Ebenen oder nur eine, wenn Sie wollen (in diesem Fall müsste die Möglichkeit, eine dritte Ebene der Kategorie zu erstellen, in Ihrem Code verhindert werden).

Zum Beispiel:
CREATE TABLE category ( id INT NOT NULL AUTO_INCREMENT, parent_id INT NOT NULL DEFAULT '0' name VARCHAR(255) NOT NULL ) Auf diese Weise ist es einfacher. Jede Kategorie mit einer parent_id von 0 wird Ihre oberste Ebene sein. Wenn Sie eine Kategorie mit der ID 1 haben und eine Unterkategorie mit der ID 1 erstellen, ist die übergeordnete ID 1 usw.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X