Frage

Zum Beispiel: „Dole Banana“ ist eine Art von Produkt, es ist zu finden unter der „Bananas“ Kategorie, wenn ich die „Früchte“ Kategorie öffnen, ich will „Dole Banana“ sehen.

+ Food
|--+ Fruits
|------+ Bananas   
|------+ Apples
|--+ Vegetables
|------+ Onion
|------+ Spinach
War es hilfreich?

Lösung

Ich habe in der Regel links-rechts Bäume verwendet die sehr gut an Datenbank querys angepasst. Sie haben eine parentId, links und rechts Wert für jeden Knoten. Jeder Knoten Kinder hat eine Links / Rechts-Wert, der zwischen den übergeordneten Knoten nach links und rechts, die zum Beispiel alle Kinder / Eltern eines Knotens ist es sehr leicht zu finden macht. Sie gibt einen leichten Overhead auf Einfügungen, aber es sollte nicht zu viel Einfluss sein, wenn Sie eine Menge ein.

Edit: Nur ein Wort der Warnung aber, müssen Sie die insert / update-Operationen in einer gesperrten Transaktion oder der Baum erhalten verwirrt machen

.

Andere Tipps

Wenn Sie sich für Online-Ressourcen suchen, um dieses Problem zu lösen, wäre eine gute Suchbegriff „einen Baum in einer Datenbank zu speichern“.

Wie für die Lösung, beachten Sie, dass jede Untergruppe haben kann entweder Eins oder Null übergeordnete Kategorien. Daher kann der gesamte Baum mit einem „übergeordneten“ Feld in einer einzigen selbst refferental Tabelle gespeichert werden.

Mit Ihrem Beispiel Baum:

 ID  | PARENT | NAME
-----+--------+-------------
  1  |  null  | Food
  2  |   1    | Fruits
  3  |   2    | Bananas
  4  |   2    | Apples
  5  |   1    | Vegetables
  6  |   5    | Onion
  7  |   5    | Spinach

Eine Tabelle „Kategorien“ mit 3 Feldern.

  1. CategoryId nicht null (Primärschlüssel)
  2. ParentCategoryId null
  3. Kategorie nicht null

Um alle Root-Kategorien zu erhalten

select * from Categories where ParentCategoryId is null

Um alle Unterkategorien von einigen bestimmten Kategorie zu erhalten:

select * from Categories where ParentCategoryId = 12

Sie einfache Tabellenstruktur mit parent_category_id verwenden könnten und ganzen Baum mit Rekursion abrufen oder links / rechts Werte implementieren und ganzen Baum mit vorbestellt Baum-Traversal-Methode abgerufen werden.

Wenn Sie eine unendliche Anzahl von Ebenen bedeuten, dann eine selbstverweisenden Tabelle, die rekursiv werden kann. Beispiel: StuffID, StuffName, StuffParentID (FK Stuff ID)

Für eine endliche Zahl, feste Tabellen: Eltern-Kind-Enkel

    CREATE TABLE [dbo].[Category](
    [CategoryId] [int] NOT NULL,
    [ParentCategoryId] [int] NULL,
    [CategoryName] [nvarchar](50) NOT NULL,
     CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED 
    (
        [CategoryId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON 

[PRIMARY]

GO

ALTER TABLE [dbo].[Category]  WITH CHECK ADD  CONSTRAINT [FK_Category_Category] FOREIGN KEY([ParentCategoryId])
REFERENCES [dbo].[Category] ([CategoryId])
GO

ALTER TABLE [dbo].[Category] CHECK CONSTRAINT [FK_Category_Category]
GO

Für unendliche Hierarchie, verwenden Sie die modifizierte Preorder Baum Traversierungsalgorithmus

Hier ist ein anderer Ansatz, die Ihnen nützlich sein könnten. Es hat etwas mehr Wartungskosten als die PARENT_ID oder LFT / rght Ansatz, aber Retrieval ist viel einfacher (und schneller).

Dole Bananen können in Produkten Tabelle sein. Sie haben einen einzigen category_id für ein Produkt.

Wir hatten eine Anforderung, um mehrere Kategorien für ein Produkt zu ermöglichen. Dies führt uns zu, die ein categories_products Join-Tabelle, wo Produkt mehr verknüpften Zeilen haben könnte. Dann mussten wir entscheiden, ob Dole Bananen in nur Bananen haben oder in Bananen und all seinen Eltern. Wenn die Geschwindigkeit des Abrufs kritisch war, setzen wir Bananen in seinen Kategorien und alle ihre übergeordneten Kategorien dole. Es gibt drei Kategorie-Produkt für dole Bananen verbindet.

Mit dieser Struktur, Rückkehr alle Elemente aus jeder Kategorie einfach und schnell, nur eine Abfrage. Sie können dies in der PARENT_ID Ansatz nicht tun (es sei denn, Sie hart Code Eltern, Großeltern, etc.) Hinzufügen einer Kategorie ist einfach. ein Produkt Kategorisieren erfordert mehrere Zeilen in der Join-Tabelle einfügen. Löschen und Verschieben von Kategorien sind ein bisschen schwieriger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top