2010-01-22 9 views
5

Ho una tabella simile a questa:Progettazione di una tabella SQL con gerarchia/sottocategorie

ID | Parola chiave | Categoria | Sottocategoria | Sottocategoria | Sub-Sottotitolo Sottocategoria

Devo dividerlo in due tabelle (una tabella di parole chiave e una tabella di categorie con ID genitore) se una parola chiave può appartenere solo a una categoria, sottocategoria ... eccetera. il che significa che non ci sono ripetizioni. c'è ancora bisogno di dividerlo?

risposta

5

È necessaria solo una tabella per rappresentare una mappatura 1-1. Per rappresentare i mapping 1-many o many-many, è necessario utilizzare più tabelle.

Se una parola chiave può corrispondere solo a una categoria/sottocategoria/sotto-categoria secondaria, il layout corrente dovrebbe essere corretto.

Un avvertimento: se si desidera effettuare una ricerca in base alla parola chiave, potrebbero esserci dei miglioramenti nelle prestazioni per separare le tabelle. È molto più veloce eseguire una ricerca intera.

La discussione sull'archiviazione dei valori delle parole chiave in un'altra tabella corrisponde grossolanamente allo this discussion dei nomi dei paesi di memorizzazione (che sono per lo più statici) in un'altra tabella. Alcuni vantaggi chiave dell'utilizzo di un'altra tabella potrebbero essere l'indipendenza (parlata) della lingua, la ricerca rapida e la facilità di aggiornamento in seguito.

1

Vorrei usare due tabelle come questa.

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

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

Potrebbe avere senso per dividerlo se si prevede di rinominare o riorganizzare le categorie più avanti:

  • se si lascia così com'è, si dovrà farlo rinominare/riorganizza il passaggio (modificando i campi categoria/sottocategoria/sottocategoria/sub-sotto-sottocategoria) per ogni riga in questa tabella che contiene quella categoria ((sub) sub) sub). ciò si traduce in una query più complessa e, se in questa tabella di parole chiave sono presenti molte righe, potrebbe verificarsi un problema di prestazioni (= richiede un po 'di tempo per il database); d'altra parte, le query (lettura) saranno il più veloci possibile.
  • se lo dividi, quindi l'aggiornamento (categoria ((sub) sub) sub) verrà eseguito solo su meno righe, ma query (lettura) richiederà più tempo perché deve funzionare con due (o più) tabelle .

pesare i contro e pro di entrambi e poi fare una decision.m

1

Perché non basta aggiungere una colonna ParentID e FK al PK?

6

lo farei in due tabelle con ogni chiave esterna proveniente dalla tabella Categorie:

Keywords 
id (PK) 
keyword 
category_id (FK) 

Categories 
category_id (PK) 
category 
parent_category_id (FK) 

I dati nella tabella Categorie sarebbe simile:

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

e che i dati in la tabella delle parole chiave sarà simile a:

id  keyword category_id 
1  grapes  4 
2  chicken 2 
+0

Questo è fantastico! Grazie. sulla base dell'altra risposta, la dividerò per le prestazioni e seguirò il tuo progetto. – chips