2010-01-22 7 views
5

Mam tabelę, która wygląda mniej więcej tak:Projektowanie tabeli SQL z hierarchią/podkategoriami

ID | Słowo kluczowe | Kategoria | Podkategoria | Podkategoria | Pod-pod-podkategoria:

Czy muszę podzielić to na dwie tabele (tabelę słów kluczowych i tabelę kategorii z identyfikatorem rodzica) , jeśli jedno słowo kluczowe może należeć tylko do jednej kategorii, podkategorii ... itp. co znaczy, że nie ma powtórzeń. czy nadal istnieje potrzeba jego rozdzielenia?

Odpowiedz

5

Potrzebna jest tylko jedna tabela do odwzorowania 1-1. Aby reprezentować 1-wiele lub wiele-wiele mapowań, powinieneś użyć wielu tabel.

Jeśli słowo kluczowe może odpowiadać tylko jednej kategorii/podkategorii/podkategorii, obecny układ powinien być w porządku.

Jedna uwaga: jeśli chcesz wyszukiwać w oparciu o słowo kluczowe, może wystąpić wzrost wydajności rozdzielania tabel. O wiele szybciej jest wykonywać wyszukiwanie liczb całkowitych.

Dyskusja na temat zapisywania wartości słów kluczowych w innej tabeli z grubsza odpowiada this discussion przechowywania nazw krajów (które w większości są statyczne) w innej tabeli. Kluczowymi zaletami korzystania z innej tabeli mogą być: niezależność językowa (mówiona), szybkie wyszukiwanie i łatwość aktualizacji w późniejszym czasie.

1

Używałbym dwóch stołów w ten sposób.

Categories 
------------------- 
PK,FK1 | CategoryID 
     | Keyword 
     | Category 

    SubCategories 
-------------------- 
PK,FK1 | CategoryID 
PK,FK1 | SubCategoryID 
1

To może mieć sens, aby podzielić go jeśli można oczekiwać, aby zmienić nazwę lub zmienić swoje kategorie później:

  • jeśli zostawisz go jak to jest, trzeba będzie zrobić to rename/reorganizacja kroku (zmiana kategorii/podkategorii/podkategorii/podkategorii) dla każdego wiersza w tej tabeli, który zawiera tę kategorię (((pod) pod) podrzędną). w wyniku czego powstaje bardziej złożone zapytanie, a jeśli w tabeli ze słowami kluczowymi znajduje się bardzo wiele wierszy, może to być problem z wydajnością (= trochę czasu, zanim baza danych zrobi); z drugiej strony, zapytania (czytanie) będą tak szybkie, jak to tylko możliwe.
  • jeśli to podzielisz, wówczas aktualizowanie (((sub) sub) sub) kategorii będzie wykonywane tylko dla mniejszych wierszy, ale zapytanie (odczyt) potrwa dłużej, ponieważ musi działać z dwoma (lub więcej) tabelami .

Zważyć zalety i wady obu, a następnie dokonać decision.m

1

Dlaczego nie wystarczy dodać kolumnę parentId FK do PK?

6

zrobiłbym to w dwóch tabelach ze sobą klucz obcy pochodzące z tabeli Kategorie:

Keywords 
id (PK) 
keyword 
category_id (FK) 

Categories 
category_id (PK) 
category 
parent_category_id (FK) 

dane w tabeli Kategorie wyglądałby następująco:

category_id category parent_category_id 
1    Food  null 
2    meat  1 
3    organic  1 
4    fruit  3 

a dane w Tabela Słowa kluczowe będzie wyglądać następująco:

id  keyword category_id 
1  grapes  4 
2  chicken 2 
+0

To jest świetne! dzięki. na podstawie drugiej odpowiedzi podzielę ją na wydajność i podążę za twoim projektem. – chips