2010-02-19 2 views
7

Sono in procinto di creare un social network. Ha diverse entità come notizie, foto, che possono avere commenti. Poiché tutti i commenti hanno le stesse colonne e si comportano allo stesso modo e l'unica differenza è il loro tipo: notizie, foto o qualcos'altro da aggiungere in futuro, ho deciso di creare una tabella per tutti i commenti con una colonna denominata type . Ha funzionato perfettamente fino a quando ho deciso di aggiungere chiavi esterne al mio schema di database.Come posso creare una chiave esterna su una colonna, ogni record di cui può fare riferimento a una colonna in una delle varie tabelle?

La comment tabella hanno una colonna parent, che si riferisce ad id di news o photo tabella, seconda colonna type.

Il problema è che non riesco ad aggiungere una chiave esterna che fa riferimento allo sconosciuto nella tabella precedente, e ancor più, che si riferisce a più tabelle contemporaneamente.

L'intero database ora utilizza chiavi esterne, ad eccezione di questa colonna parent nella tabella comment. Mi dà fastidio perché è il solo luogo in cui non riesco ad aggiungere una chiave esterna.

Sono sicuro di non poter creare una chiave esterna del genere; qualcosa nel mio progetto di database deve essere cambiato. Ho deciso di creare una tabella per i commenti per essere pronti ad aggiungere nuovi tipi di commenti per le nuove entità in futuro - video, musica, articoli, ecc. E non incorrere in problemi di manutenzione quando voglio aggiungere una nuova colonna per tutti i commenti .

Se devo assolutamente creare una tabella separata per ogni tipo di commento per poter utilizzare completamente le chiavi esterne, lo farò. Ma forse esiste già un'altra soluzione comune a questo problema, e io non ne sono a conoscenza?

Forse dovrei creare una sorta di tabella di collegamento, che collega la tabella comment con le tabelle di altre entità? Ma forse questa soluzione è ancora più complessa della creazione di una tabella separata per ogni tipo di commento?

Forse dovrei avere più colonne nella tabella comment, come newsId, photoId, a cui posso aggiungere chiave esterna?

Queste soluzioni non mi sembrano eleganti, o ho solo frainteso qualcosa. La mia intera percezione di questo problema potrebbe essere semplicemente sbagliata. Questo è il motivo per cui sono qui. Per favore condividi le tue idee.

+0

È stato difficile per me scegliere ** una risposta giusta **: la prima collega a una risposta simile, e la seconda è scritta specificamente per la mia domanda - entrambe sono buone. Ho scelto il secondo - APC - perché è più dettagliato e utilizza i miei termini. Grazie ad entrambi. –

+0

possibile duplicato di [Chiave esterna che si riferisce a chiavi primarie su più tabelle?] (Http://stackoverflow.com/questions/668921/foreign-key-refering-to-primary-keys-across-multiple-tables) –

risposta

5

Penso che il tuo problema sia che hai diverse entità: notizie, foto. Ma questi sono solo tipi di (dire) oggetti. Come i commenti, gli oggetti avranno probabilmente alcuni attributi in comune così come alcuni attributi distinti. Uno di questi attributi sarà la possibilità di essere commentati.

In questo approccio si dispone di una tabella CommentableItems(1), con gli attributi comuni. Poi ci sono alcune sotto-tabelle NewsItems, PhotoItems, ecc. È abbastanza facile impostare le chiavi per queste tabelle per far rispettare la relazione uno a uno richiesta. Ovviamente, Commenti ha una chiave esterna che fa riferimento a CommentableItems.

(1) In realtà mi sarebbe probabilmente spararmi, piuttosto che permettere una tabella chiamata qualcosa di orribile come CommentableItems nel mio schema, ma questo è solo per il gusto di esempio.

+0

Penso Lo chiamerò davvero come "Commentabile", perché non riesco a pensare ad un altro nome più appropriato. "Entity" sarebbe un nome troppo ampio, perché non tutte le entità sono commentabili. –