2014-08-30 23 views
5

Chcę reprezentować rekursywne relacji rodzic-dziecko w bazie danych MySQL. Chcę utworzyć relację category - subcategory. Kategoria może mieć N podkategorii i każda z nich może zawierać N podkategorii i tak dalej. Myślałem o pojedynczym stole z obcym kluczem wskazującym w jego jaźni. Oto co mam na myśli:Konstrukcja bazy danych SQL, rekursywna relacja rodzic-dziecko?

CREATE TABLE `category` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `parent_category` int NULL, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`parent_category`) REFERENCES `category` (`id`) 
) 

parent_category może być null, jeśli kategoria jest na najwyższym poziomie.

Czy to jest właściwy sposób reprezentowania takiego związku? Czy są jeszcze inne rzeczy, które powinienem wziąć pod uwagę w moim projekcie (wydajność, zapytania ...)?

+0

możliwe duplikat [SQL - Jak przechowywać i nawigowanie hierarchie] (http://stackoverflow.com/questions/38801/sql -how-to-store-and-navigate-hierarchies) –

+2

Ze względu na ograniczone funkcje SQL MySQL nie zrobiłbym tego w MySQL. Naprawdę trudno będzie odzyskać dane z tej hierarchii ze względu na brak zapytań rekursywnych. Wyszukaj "model zestawu zagnieżdżonego" dla innego projektu, który można zaimplementować za pomocą MySQL –

Odpowiedz

4

To zależy od tego, w jaki sposób chcesz użyć swoich danych i czy chcesz faworyzować zapytania dotyczące aktualizacji i wstawiania. Twoje rozwiązanie nazywa się sąsiednim modelem listy i sprawia, że ​​dane są bardzo łatwe do wstawienia lub aktualizacji. Zapytania mogą być skomplikowane, jeśli masz nieograniczoną głębokość rodzeństwa, ale to zależy od tego, w jaki sposób planujesz korzystać z tej struktury danych. Jeśli jedyne, czego chcesz, to pokazać wszystkim rodzeństwo jednego węzła, to jest w porządku. z drugiej strony, jeśli chcesz pokazać całe drzewo rozwinięte i zrobić to w jednym zapytaniu, to odczuwasz ból głowy.

Innym rozwiązaniem byłoby użycie połączonego łańcucha reprezentującego hierarchię. Na przykład:

  1. Europy 1,1 Francja 1.1.1 Paryż 1.1.2 Marseille
  2. Ameryka 2.1 Stany Zjednoczone Ameryki 2.1.1 Washington

DDL byłoby coś tak:

CREATE TABLE `category` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `link` varchar(30) NOT NULL DEFAULT '.', 
    PRIMARY KEY (`id`), 
) 

Ta struktura danych ułatwia wyszukiwanie zapytań, ale aktualizacje są wolniejsze. Innym rozwiązaniem jest zagnieżdżony model zestawu, w którym rejestruje się identyfikator węzła po prawej i lewej stronie bieżącego węzła. Jest to najbardziej wydajna struktura dla zapytań, ale sprawia, że ​​wstawianie i aktualizowanie jest trudniejsze.

http://en.wikipedia.org/wiki/Nested_set_model

Polecam Ci książkę Joe Čelko w sprawie drzew i hierarchie