2014-08-30 29 views
5

Voglio rappresentare una relazione padre-figlio ricorsiva in un database MySQL. Voglio creare una relazione category - subcategory. Una categoria può avere N sottocategorie e ognuna di esse può avere sottocategorie N e così via. Stavo pensando di avere una singola tabella category con una chiave straniera che punta in se stessa. Ecco cosa intendo:Progettazione database SQL, relazione ricorsiva padre-figlio?

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 può essere nullo se una categoria è una categoria di livello superiore.

È questo il modo corretto di rappresentare una relazione come questa? Inoltre ci sono altre cose che dovrei prendere in considerazione nel mio design (prestazioni, domande ...)?

+0

possibile duplicato di [SQL -? Come conservare e spostarsi nelle gerarchie] (http://stackoverflow.com/questions/38801/sql -how-to-store-and-navigate-hierarchies) –

+2

A causa delle funzionalità SQL limitate di MySQL, non lo farei in questo modo in MySQL. Avrai davvero difficoltà a recuperare i dati da quella gerarchia a causa della mancanza di query ricorsive. Cerca "nested set model" per un design diverso che può essere implementato con MySQL –

risposta

4

Dipende da come si desidera utilizzare i dati e se si desidera favorire le query per aggiornamento e inserimento. La tua soluzione si chiama modello adiacente e ti facilita l'inserimento o l'aggiornamento dei dati. Le query possono essere complicate se si dispone di una profondità illimitata di fratelli, ma, ancora una volta, dipende da come si prevede di utilizzare questa struttura di dati. Se l'unica cosa che vuoi è mostrare tutti i fratelli di un nodo, questo è ok. d'altra parte, se vuoi mostrare l'intero albero sviluppato e farlo in una query, ti viene un mal di testa.

Un'altra soluzione sarebbe utilizzare una stringa concatenata che rappresenta la gerarchia. Per esempio:

  1. Europa 1.1 Francia 1.1.1 Parigi 1.1.2 Marsiglia
  2. America del 2.1 Stati Uniti d'America 2.1.1 Washington

Il DDL sarebbe qualcosa In questo modo:

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

Questa struttura dati facilita le query, ma gli aggiornamenti sono più lenti

Un'altra soluzione è il modello di serie nidificato in cui si registra l'id del nodo a destra e a sinistra del nodo corrente. È la struttura più efficiente per le query, ma rende più difficile l'inserimento e l'aggiornamento.

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

vi consiglio il libro di Joe Celko sugli alberi e gerarchie