Shop Projekt - Dokumentation

Shop LDM

Teil 04: Kategorien & Artikel

Dieses Modul bildet die Kategorie- und Artikelverwaltung des Shops ab.

Hier werden auch viele Verbindungen, Attribute und Bilder der Artikel verwaltet, mit Fokus auf den Marktplatz.

🗺️ Stufe 0 | 📚 Aktuell | 📟 2026 06 15 | 📍 Datenbank - Kategorien & Artikel

  • Kategorie: Hierarchisches Knoten-Kategoriensystem mit Knotentyp, Stammbaum und Seitenverknüpfung.
  • Cat_hierarchy: Ermöglicht es, dass eine Kategorie mehrere Eltern oder Kinder hat.
  • Condition: Zustandsdefinitionen pro Kategorie mit JSON-Übersetzungen und optionaler Icon-Funktion.
  • Packaging: Verpackungseinheiten zur automatischen Versandkostenberechnung.
  • Artikel: Das konkrete Handelsstück, das tatsächlich verkauft oder inseriert wird. Kann direkt an ein Produkt oder nur an eine Kategorie gebunden sein (z. B. für Kleinanzeigen).
  • Art_image: Verwaltet Bilder der Artikel.
  • Art_storage & art_manager: Zusatzstrukturen für Lagerorte und Mengen-/Reservierungsverwaltung.
  • Attribute & att_content: Flexible Möglichkeit, Produkten, Varianten oder Artikeln zusätzliche Merkmale (z. B. Größe, Material, technische Daten) zuzuweisen.

Für die Produkte gibt es noch ein 2. Teil. Hier werden aber die Grundlagen geschaffen und das Nötige für den Marktplatz gelegt.

Category (Kategorien)

Zweck: Orchestriert was wo wie zusammen gehört

Felder:
    - cat_ID        (PK)
    - pag_ID        (FK → page.pag_ID, NULL)
    - cat_key       VARCHAR(100)
    - cat_node_type VARCHAR(100)                   -- N = normal, S = specialisation, L = list type und weitere
    - cat_level     INT NOT NULL                   -- 0 = Hauptkategorie, 1 = Subkategorie …
    - cat_tree_num  INT NOT NULL,                  -- Primär-Stamm (System-Stamm)
    - cat_status    CHAR(1)                        -- C=Created, O=On_check, A=Active

Cat_Hierarchy (Kategorien)

Zweck: Definiert die Hierarchie (n:n Mapping) und Verbindungsart der Kategorien

Felder:
    - parent_cat_ID (PK → category.cat\_ID, NULL)
    - child_cat_ID  (PK → category.cat\_ID, NULL)
    - relation_type ENUM('tree', 'ref', 'special') NOT NULL
    - rel_tree_num  INT NOT NULL
    - sort_order    INT NOT NULL

INSERT Trigger: Synchronisation von tb_category.cat_key mit tb_page.pag_key
UPDATE Trigger: Synchronisation von tb_category.cat_key mit tb_page.pag_key

tr_sync_cat_key_insert Trigger

Auslöser: Vor dem Einfügen in tb_category
Prozess:
   1. Synchronisiert den Kategroien Key mit der den Seiten fals zutreffend

Ausgabe:

tr_sync_cat_key_update Trigger

Auslöser: Vor dem Aktualisieren in tb_category
Prozess:
   1. Synchronisiert den Kategorien Key mit der den Seiten fals zutreffend

Ausgabe:

Condition (Zustände)

Felder:
    - con_ID        (PK)
    - cat_ID        (FK → category.cat\_ID)        -- ermöglicht spezialisierte Zustandslisten je Kategorie
    - con_key       VARCHAR(100)                   -- für vergleiche und system interne nutzen
    - con_name      JSON NOT NULL                  -- für dirrekt übersetzung, verhinder label überlastung
                                                      Format: {"DE":"Neu", "EN":"New"}
    - con_icon      VARCHAR(50)                    -- Name der PHP Funktion (z.B. place_newIcon)
    - con_status    CHAR(1)                        -- C=Created, O=On_check, A=Active, I=Inactive

Packaging (Verpackungseinheiten)

Zweck: Definiert Verpackungseinheiten für Versand.

Felder:
    - pac_ID        (PK)
    - pac_name      VARCHAR(100)
    - pac_weight    DECIMAL(12)
    - pac_in_length DECIMAL(12)
    - pac_in_width  DECIMAL(12)
    - pac_in_height DECIMAL(12)
    - pac_out_length DECIMAL(12)
    - pac_out_width DECIMAL(12)
    - pac_out_height DECIMAL(12)
    - pac_status    CHAR(1)                        -- C=Created, O=On\_check, A=Active, I=Inactive

Artikel (Verkaufsobjekt)

Zweck: Definiert Verkaufsobjekte.

Felder:
    - art_ID        (PK)
    - u_ID          (FK → user.u_ID)
    - var_ID        (FK → product_variant.var_ID, NULL)
    - cat_ID        (FK → category.cat_ID, NULL)
    - pac_ID        (FK → packaging.pac_ID, NULL)
    - con_ID        (FK → condition.con_ID)
    - art_name      VARCHAR(250)
    - art_description TEXT
    - art_quantity  INT
    - art_open_quan INT
    - art_price     DECIMAL(12,2)
    - art_host_status CHAR(1)                        -- C=Created, O=On Check, A=Active, I=Inactive, B=Blocked

Hinweis: Die exklusive Prüfung zwischen var\_ID und cat\_ID ist im SQL vorbereitet, aktuell aber auskommentiert.
Hinweis: Verkaufsstatus wird durch den Artikel-Manager definiert nicht zu verwächseln mit dem host Status.

Art_image (Marktplatz)

Zweck: Bilder für Kleinanzeige oder extrabilder

Felder:
    - img_ID        (PK)
    - art_ID        (FK → article.art_ID)
    - img_name      VARCHAR(255)
    - img_priority  INT                -- 0 = Hauptbild, 1+ = Galerie
    - img_status    CHAR(1)            -- 'A' = Aktiv, 'O' = On Check (Virenscan/Moderation)

Art_storage (Lagerung)

Zweck: Definiert Lagerorte für Artikel

Felder:
    - ast_ID        (PK)
    - u_ID          (FK → user.u_ID)
    - ast_name      VARCHAR(100)       -- z. B. 'Main Warehouse', 'Set Box 12'
    - ast_is_a_set  CHAR(1)            -- Y/N: Wird es als Set/Sammlung behandelt
    - ast_location  VARCHAR(100)
    - ast_description TEXT NULL        -- optional: weitere Infos (z. B. Standortbeschreibung)

Art_manager (Fulfillment)

Zweck: Verknüpft Artikel mit Lagerorten, Bestellungen und verfügbaren Mengen

Felder:
    - ama_ID        (PK)
    - art_ID        (FK → article.art_ID)
    - ast_ID        (FK → art_storage.ast_ID, NULL)  -- Lagerort oder Set-Zuordnung
    - pur_ID        (FK → purchase.pur_ID, NULL)     -- Wenn Teil einer Bestellung, sonst NULL
    - ama_quantity  INT
    - ama_status    CHAR(1)                      -- R=Reserviert, P=Privat, S=Sold, C=Cancelled, A=Active
    - ama_stor_locat VARCHAR(100) NULL        -- z. B. Regalnummer, Fach, Schublade
Trigger: SUM(ama_quantity) <= article.art_quantity
    -- Stelle sicher, dass die Gesamtmenge in art_manager die verfügbare Menge im Artikel nicht überschreitet

tr_sync_cat_key_insert Trigger

Zweck:   Stellt sicher, dass die Gesamtmenge in tb_art_manager die verfügbare Menge nicht überschreitet

Auslöser: Vor dem Einfügen in tb_art_manager
Prozess:
   1. Überprüft die Gesamtmenge in tb_art_manager für den entsprechenden Artikel

Ausgabe:
   - Fehlermeldung, wenn die Gesamtmenge die verfügbare Menge überschreitet

Attribute (generell)

Felder:
    - att_ID        (PK)
    - att_name      VARCHAR(100)
    - att_type      ENUM ('numeric', 'string', 'text', 'bool', 'size')
    - att_status    CHAR(1)                      -- C=Created, O=On_check, A=Active, I=Inactive

Att_content (Attribute-Zieltabellen)

Zweck:   Speichert Attributwerte für verschiedene Zieltabellen

Felder:
    - atc_ID        (PK)
    - att_ID        (FK → attribute.att_ID)
    - cat_ID        (FK → category.cat_ID)
    - art_ID        (FK → article.art_ID)
    - pro_ID        (FK → product.pro_ID)
    - pin_ID        (FK → product_info.pin_ID)
    - var_ID        (FK → product_variant.var_ID)
    - atc_value_n   DECIMAL(12,4) NULL
    - atc_value_n2  DECIMAL(12,4) NULL
    - atc_value_n3  DECIMAL(12,4) NULL
    - atc_value_s   VARCHAR(255) NULL
    - atc_value_t   TEXT NULL
    - atc_value_b   BOOLEAN NULL
Trigger: genau eine Entity-FK muss/darf gesetzt sein

trg_attcontent_single_entity Trigger

Auslöser: Vor dem Einfügen in tb_att_content
Prozess:
   1. Prüft dass genau eine Entity-ID gesetzt ist

Ausgabe:
   - Fehlermeldung, wenn nicht genau eine Entity-ID gesetzt ist

Views Kategorie Navigation & Artikel

v_navigation_base View

Zweck: Kombiniert Kategorien mit Seiten-Keys und Hierarchie-Daten für den PHP-Baumbau.

Felder:
    - cat_ID      Kategorie
    - pag_ID      Seite
    - cat_node_type Kategorie                  -- Typ des Knotens
    - cat_type    Kategorie                    -- Typ der Kategorie
    - cat_key     Kategorie                    -- Eindeutiger Schlüssel der Kategorie
    - cat_level   Kategorie                    -- Ebene der Kategorie
    - cat_tree_num Kategorie                   -- Nummer des Baums
    - cat_status  Kategorie                    -- Status der Kategorie
    - cat_P_ID    Kategorie                    -- ID der übergeordneten Kategorie
    - cat_r_type  Kategorie                    -- Beziehungstyp
    - cat_sort    Kategorie                    -- Sortierreihenfolge

Hinweis: Diese View ist 2-teilig aufgebaut. Der erste Teil enthält alle tatsächlichen Hierarchie-Verknüpfungen (Trees, Refs, Specials), 
         während der zweite Teil alle Level-0 Kategorien als eigenständige 'Wurzeln' darstellt. Dadurch wird sichergestellt, dass 'Level 0' Kategorien, die nicht referenziert wurden, auch wirklich als 'Wurzeln' erscheinen.

v_node_children View

Zweck: Liefert eine flache Liste aller Kind-Beziehungen basierend auf der tb_cat_hierarchy

Felder:
    - parent_cat_ID ID der übergeordneten Kategorie
    - child_id      ID der Kind-Kategorie
    - child_key     Key der Kind-Kategorie
    - child_pag_id  Seiten-ID der Kind-Kategorie (NULL, wenn keine Seite zugeordnet)
    - cat_node_type Node-Typ der Kind-Kategorie
    - cat_type      Kategorie-Typ der Kind-Kategorie
    - relation_type Beziehungstyp (tree, ref, special)
    - sort_order    Sortierreihenfolge der Kinder unter dem gleichen Elternteil

v_category_path View

Zweck: Liefert den Parent-Pfad einer Kategorie (für Vererbungen)

Felder:
    - start_cat_ID  ID der Ausgangskategorie
    - current_cat_ID ID der aktuellen Kategorie im Pfad
    - depth         Tiefe im Pfad (0 = Ausgangskategorie, 1 = Elternteil, ...)

Hinweis: Diese View verwendet eine rekursive CTE, um alle übergeordneten Kategorien einer gegebenen Kategorie zu ermitteln. Es werden nur Beziehungen des Typs 'tree' berücksichtigt, um die eigentliche Hierarchie abzubilden.

v_category_condition View

Zweck: Liefert Conditions der ersten gültigen Kategorie-Ebene

Felder:
    - cat_ID    ID der Kategorie
    - con_ID    ID des Zustands
    - con_name  Name des Zustands
    - con_icon  Icon des Zustands
    - con_status Status des Zustands

Hinweis: Diese View liefert die Conditions der ersten gültigen Kategorie-Ebene für jede Kategorie. 
         Es wird zuerst geprüft, ob die Kategorie selbst Conditions hat. Wenn nicht, wird die nächstgelegene übergeordnete Kategorie mit Conditions ermittelt und deren Conditions zurückgegeben. 
         Dadurch wird eine Art Vererbung von Conditions entlang der Kategorienhierarchie ermöglicht.

v_cat_descendants View

Zweck: Liefert für jede Kategorie alle Kind-Kategorien (tree + ref) rekursiv

Felder:
    - start_cat_ID  ID der Ausgangskategorie
    - current_cat_ID ID der aktuellen Kind-Kategorie
    - depth         Tiefe der Beziehung (0 = Ausgangskategorie, 1 = direkte Kinder, ...)

Hinweis: Diese View verwendet eine rekursive CTE, um alle Kind-Kategorien einer gegebenen Kategorie zu ermitteln. 
         Es werden Beziehungen des Typs 'tree' und 'ref' berücksichtigt, um sowohl echte Hierarchie-Kinder als auch Referenz-Kinder einzubeziehen.

v_article_by_category View

Zweck: Liefert alle Artikel einer Kategorie inkl. Children + Hauptbild + Zustände

Felder:
    - cat_ID            ID der Kategorie
    - found_cat_ID      ID der Kategorie, in der der Artikel gefunden wurde (kann von cat_ID abweichen, wenn Artikel in Child-Kategorie liegt)
    - art_ID            ID des Artikels
    - u_ID              ID des Benutzers (Verkäufers)
    - art_name          Name des Artikels
    - art_open_quan     Verfügbare Menge des Artikels
    - art_price         Preis des Artikels
    - art_host_status   Host-Status des Artikels (C=Created, O=On Check, A=Active, I=Inactive, B=Blocked)
    - con_name          JSON mit den übersetzten Namen des Zustands (z.B. {"DE": "Neu", "EN": "New"})
    - con_icon          Name der PHP-Funktion für das Zustandssymbol (z.B. getConditionIcon)
    - art_main_image    Dateiname des Hauptbilds (img_priority = 0) oder NULL, wenn kein Bild vorhanden
    - art_main_img_status Status des Hauptbilds (C=Created, O=On Check, A=Active, I=Inactive) oder NULL

Hinweis: Diese View basiert auf v_cat_descendants und liefert alle Artikel, die direkt in der Kategorie oder in einer beliebigen Unterkategorie liegen.
          Es werden auch Informationen zum Zustand und zum Hauptbild des Artikels bereitgestellt, um die Anzeige in der Galerie zu erleichtern.