2010-11-12 8 views
5

Supponiamo che tu abbia più "cose" che possono avere ciascuno uno o più commenti allegati. Prodotto e ordine, ad esempio. Come dovrebbero le tabelle essere strutturati ....Database Design for Multi-use Table

  1. prodotto, Ordine, commento, ProductComment {ProductID, CommentID}, {OrderComment IDOrdine, CommentID}
  2. prodotto, Ordine, ProductComment {ProductID, Testo}, OrderComment {OrderID, Testo}
  3. prodotto, ordine, Commento {ProductID, IDOrdine, Testo}

Utilizzo di SQL Server 2008, tra l'altro.

Pensieri, opinioni?

+0

Dai un'occhiata a ** [domanda/risposta simile] (http://stackoverflow.com/questions/4050784/defining-multiple-foreign-keys-in-one-table-to-many-tables/4051523 # 4051523) **. –

risposta

1

Sicuramente utilizzare una sola tabella commento, quindi non c'è bisogno di duplicare Informazioni sui commenti (ad es. Timestamp, flagged_for_moderation, ecc.). Avere due campi nel commento è bello perché rende chiaro che si tratta di un collegamento uno a molti. Probabilmente mi sposterò a ciò su più tabelle di collegamento, anche se apprezzo il fatto che nella tabella di collegamento sono presenti solo righe quando c'è un collegamento, mentre la metà dei valori è NULL. Forse in un database molto grande con più cose che possono essere commentate, potresti andare per le tabelle di collegamento.

+0

Concordato sull'aspetto della duplicazione. Mi piacciono le tabelle di collegamento, tranne che non mi piace il passaggio in più per arrivare alla tabella dei commenti. –

+0

Sì, la tabella di collegamento rende le tue domande più complicate. L'utilizzo di più colonne significa anche che se ottieni tutti i commenti, puoi dire quale tipo di commento sono senza fare alcun JOIN, e se utilizzi gli ID in URL (o altri riferimenti), potresti semplicemente collegare direttamente all'elemento che viene commentato. – theazureshadow

+0

Un altro motivo per cui mi piace la tabella di collegamento è che è possibile aggiungere campi aggiuntivi secondo necessità. Forse la tabella ProductComment contiene anche alcuni campi strettamente correlati a quella combinazione di Product \ Comment. –

2

Penso che i tavoli Order/Product debbano rimanere così come sono.

La tabella Comments può essere

CommentID 
EntityID 
EntityType 
Comment 

Dove EntityType vi dirà a quale tabella il EntityID appartiene (ProductID/OrderID)

+0

Grazie. Il motivo per cui non ho elencato questa opzione è perché questo rompe le chiavi esterne. Non voglio veramente controllare EntityType per determinare quale tabella cercare per recuperare l'entità. –

+0

Questo ha la limitazione che non è possibile utilizzare le chiavi esterne esplicite in un database che li supporta (ad es.InnoDB), il che significa che non è possibile utilizzare funzionalità come 'CASCADE'. Apprezzo che riduca il numero di tavoli necessari, e in molti casi va bene, ma non ne vale la pena universalmente. – theazureshadow

+0

@Josh Bello, bastonatemi :) – theazureshadow

0

Se non ti piace il, entityType metodo di entityID, perché non è possibile utilizzare i vincoli di chiave, si potrebbe prendere una strategia mista, qualcosa come

COMMENT(commentID, comment, productID, orderID, ....) 

con ... 's come un colonna aggiuntiva per ogni tabella commentabile.

+0

questo forse potrebbe funzionare, ma la risposta di astander è come normalmente è fatto. – SingleNegationElimination

+0

Questa è la mia opzione # 3. Non sono sicuro se mi piace comunque .... Mi sto appoggiando all'opzione 1. –

+0

@TokenMacGuy Penso che la risposta di astander sia peggiore delle 3 opzioni che ho elencato. –

0

Se vai con le tabelle di collegamento e hai più di 2 o 3 "tipi" che possono essere collegati al commento, inizia a pensare a un codice generato per creare tutto l'SQL che ti serve. Avrai presto un 101 tabelle di collegamento e un sacco di SQL di definizione della tabella da mantenere.

Se si utilizzano GUID per tutti gli ID e non si preoccupa di non avere le chiavi esterne definite nel database, esistono altre opzioni, ma non credo che lo stile dello schema del database sia disponibile.

Questo è uno dei casi d'uso che mi fa pensare che il modello relazionale sia un dolore al collo!

0

Sono un fan dell'aggiunta delle colonne ID entità e tipo di entità per aggiungere flessibilità aggiuntiva senza avere il join aggiuntivo.

+0

Grazie per il suggerimento, ma trovo che questo sia un modo piuttosto sporco e non OO di strutturare un database. Stai perdendo la logica DB per convalidare che l'entità esiste effettivamente. Naturalmente è possibile farlo in codice, ma da un punto di vista DB non è una soluzione molto pulita. –

+0

@Josh M - Dovrai considerare lo scambio spaziale. Non tutto può essere perfetto. Questo è un modo molto OO di fare le cose - l'Entità è polimorfica in quanto rappresenta molti tipi diversi in una tabella. – skaz