2009-05-29 12 views
7

Sto creando un sito Web di video in cui le categorie saranno nidificate:Come si creano le categorie nidificate in un database?

ad es. Programming-> C Lingua -> MIT Video -> Video 1 Programmazione -> C Lingua -> Stanford Video -> Video 1 Programmazione -> Python -> Video 1

Queste categorie e sottocategorie verrà creato da utenti al volo. Avrò bisogno di mostrarli mentre le persone li creano sotto forma di un menu navigabile, in modo che le persone possano sfogliare facilmente la raccolta.

Qualcuno potrebbe aiutarmi con come posso creare un tale database?

+0

duplicato? http://stackoverflow.com/questions/317322/optimized-sql-for-tree-structures –

+0

https://stackoverflow.com/questions/17081951/my-sql-multiple-category-subcategory-subcategory – Calvin

risposta

7

Quassnoi detto:

si dovrebbe usare uno insiemi nidificati o modelli padre-figlio.

Sono solito implementare entrambi. Quello che potrei dire è:

Utilizzare l'architettura del set nidificato se la tabella delle categorie non cambia spesso, perché su una clausola select è veloce e con una sola richiesta è possibile ottenere l'intero ramo della gerarchia per una determinata voce . Ma su una clausola insert o update ci vuole più tempo di un modello figlio genitore per aggiornare i campi sinistro e destro (o inferiore e superiore nell'esempio sotto).

Un altro punto, piuttosto banale, devo ammettere, ma:
È molto difficile cambiare la gerarchia a mano direttamente nel database (potrebbe accadere durante lo sviluppo). Quindi, essere sicuri di realizzare il primo un'interfaccia a giocare con il set nidificato (cambiando nodo padre, spostare un nodo ramo, l'eliminazione di un nodo o l'intero ramo, ecc)

Qui ci sono due articoli sul tema:

Ultima cosa, non ho provato, ma ho letto da qualche parte che si può hav e più di un albero in una tabella dei set nidificati, intendo diverse radici.

3

È necessario utilizzare i modelli nested sets o parent-child.

Parent-child:

 
typeid parent name 

1  0  Buyers 
2  0  Sellers 
3  0  Referee 
4  1  Electrical 
5  1  Mechanic 
SELECT * 
FROM mytable 
WHERE group IN 
     (
     SELECT typeid 
     FROM group_types 
     START WITH 
       typeid = 1 
     CONNECT BY 
       parent = PRIOR typeid 
     ) 

selezionerà tutti gli acquirenti in Oracle.

Nested sets:

 
typeid lower upper Name 
1  1  2  Buyers 
2  3  3  Sellers 
3  4  4  Referee 
4  1  1  Electrical 
5  2  2  Mechanic 
SELECT * 
FROM group_types 
JOIN mytable 
ON  group BETWEEN lower AND upper 
WHERE typeid = 1 

selezionerà tutti gli acquirenti di qualsiasi database.

Vedere this answer per ulteriori dettagli.

Nested sets è più facile da interrogare, ma è più difficile aggiornare e più difficile da costruire una struttura ad albero.

11

Fai un tavolo le categorie con i seguenti campi:

  • IDCategoria - Integer
  • NomeCategoria - String/Varchar/Qualunque sia
  • ParentID - Integer

tuo ParentID sarà quindi fare riferimento indietro al CategoryID del suo genitore.

Esempio:

CategoryID CategoryName ParentID 
--------------------------------- 
1   Dog   NULL 
2   Cat   NULL 
3   Poodle  1 
4   Dachsund  1 
5   Persian  2 
6   Toy Poodle 3 
+0

Come faccio a costruire una query per creare la navigazione da tale tabella? C'è un modo semplice? – MathOldTimer

+0

Jake: Non so come si farebbe la propria navigazione, ma il modo standard sarebbe quello di visualizzare un singolo livello (come il primo livello) usando prima una query come "seleziona * da tblCategories dove ParentID è NULL" quindi avresti preso Dog e Cat. Quindi quando fai clic su un cane puoi ottenere il livello successivo interrogando "Seleziona * da tblCategories where ParentID = 1" perché 1 è il categoryid di Dog. E poi continui nella stessa maniera, più in basso ti trapani. – TheTXI

+0

Grazie! Questo è stato utile! – MathOldTimer

0

Quello che vi serve è una relazione padre-figlio di base:

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000)) 
5

Dall'esempio nella tua domanda sembra che ci si vuole che sia possibile per un data categoria per avere più genitori (ad es., "Video MIT -> Programmazione Video 1" e "Video -> Programmazione Video 1"), nel qual caso semplicemente aggiungere una colonna ParentID non sarebbe sufficiente.

Si consiglia di creare due tabelle: una tabella Categorie semplice con colonne CategoryID e CategoryName e una tabella CategoryRelationships separata con le colonne ParentCategoryID e ChildCategoryID. In questo modo puoi specificare tutte le relazioni genitore-figlio che desideri per una particolare categoria. Sarebbe anche possibile utilizzare questo modello per avere una doppia relazione in cui due categorie sono reciprocamente genitore e figlio contemporaneamente.(. Fuori della parte superiore della mia testa, non riesco a pensare ad un grande uso per questo scenario, ma almeno illustra come flessibile il modello è)

+0

Grazie! Questo è esattamente quello che volevo. Ad esempio vorrei che un "video di primer linguaggio assembly" sia elencato sia in "reverse engineering basic" che in "linguaggi di programmazione". – MathOldTimer

0

Un modo migliore per archiviare il parent_id del tavolo è di averlo inserito all'interno della ID esempio

100000 Programmazione 110000 C Lingua 111000 Video 1 Programmazione 111100 C Lingua 111110 Stanford Video

ecc .. tutto ciò di cui hai bisogno è uno script per elaborare l'ID in modo tale che la prima cifra rappresenti la categoria di livello superiore e così via mentre vai più in basso nella gerarchia

+0

Questo è un modo abbastanza interessante. Hai qualche idea su come interrogare tali dati? –

+0

Questo non ti limita a 10 articoli di primo livello 0-9?Qual è il motivo dell'uso degli zeri, stai utilizzando un numero predefinito di numeri interi che limita il numero di possibili bambini? Come inseriresti nuovi elementi e li aggiorneresti? –

Problemi correlati