2012-07-20 24 views
6

Invece di avere una chiave primaria composta (questa tabella mantiene la relazione tra le due tabelle che rappresenta due entità [due tabelle]), il progetto si propone di avere la colonna identity come chiave primaria e il vincolo di dati univoci viene applicato su due colonne che rappresentano i dati dalla chiave primaria delle entità.Vantaggi e svantaggi di avere la chiave primaria composita ...

Per me avere una colonna di identità per ogni tabella di relazioni sta infrangendo le regole di normalizzazione.

  • Quali sono gli standard di settore?
  • Quali sono le considerazioni da fare prima di prendere la decisione di progettazione su questo?
  • Quale approccio è giusto?

Grazie,
Smith

+2

Semplice articolo sui tasti compositi: http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx – RThomas

+0

non c'è bisogno di una colonna di identità, la chiave primaria è fondamentalmente un insieme di colonne (1 o più) che definiscono in modo univoco i tuoi dati. Aggiungendo una colonna Identity, stai aggiungendo un indice extra e facendo l'indice che probabilmente utilizzerai di più (quello con le 2 colonne importanti) come non cluster, più gli aggiornamenti/inserti saranno un po 'più lenti, ecc. Ecc. Fondamentalmente, nessuna necessità. – Rodolfo

+0

@RThomas - In questo weblog, stanno utilizzando una relazione Clienti-> Prodotti che non dovrebbe avere una chiave composta poiché indica i dati transazionali. Lì * può * essere più relazioni create in momenti diversi, quella tabella ha bisogno di un PKey Identità Unica. ad esempio, ordinando bottiglie di vino, sotto la stessa SKU - a cui fa riferimento un singolo ProductID - (non ideale, ma possibile). Tuttavia, se ogni bottiglia ha il proprio ID, allora "limite di ordine" è discutibile poiché è necessario creare un record di transazione separato per ciascun articolo. O hai sbagliato la struttura, o stai tracciando i dati in modo errato. – hajikelist

risposta

5

Ci sono un sacco di tavoli in cui si consiglia di avere una colonna di identità come chiave primaria. Tuttavia, nel caso di una tabella delle relazioni M: M che descrivi, la migliore pratica è NON usare una nuova colonna Identity per la chiave primaria.

Il link di RThomas nel suo commento fornisce gli ottimi motivi per cui la procedura migliore è NON aggiungere una colonna di identità. Ecco lo that link.

Gli svantaggi superano i professionisti in quasi tutti i casi, ma dal momento che hai chiesto pro e contro ho messo un paio di professionisti improbabili in pure.

Contro

  • aggiunge complessità

  • può portare a duplicare i rapporti meno che non si impone l'univocità sul rapporto (che una chiave primaria farebbe per impostazione predefinita).

  • Probabilmente più lento: db deve mantenere due indici anziché uno.

Pro

tutti i pro sono piuttosto abbozzato

  • Se si ha una situazione in cui avete bisogno di usare la chiave primaria della tabella relazione come iscriverti per una tabella separata (ad esempio una tabella di controllo?) l'unione sarebbe probabilmente più veloce. (Come notato però - l'aggiunta e la rimozione di record sarà probabilmente più lenta. Inoltre, se la tabella delle relazioni è una relazione tra tabelle che utilizzano ID univoci, l'aumento di velocità dall'utilizzo di una colonna Identity nel join vs two sarà minimo.)

  • L'applicazione, per semplicità, può assumere che ogni tabella con cui lavora abbia un ID univoco come sua chiave primaria. (Questo è scarso design nell'app ma potresti non avere il controllo su di esso.) Si potrebbe immaginare uno scenario in cui è meglio introdurre una complessità extra nel DB rispetto alla complessità extra in tale app.

+0

La risposta è di usare entrambi - avere sempre un'identità che è unica su ogni tabella [questo ha più di benefici/detrazioni basati sulle prestazioni - i programmatori devono lavorare con queste strutture ed è importante avere una metodologia coerente per l'interazione con i dati *], ma usa le chiavi composite dove ha senso farlo! E soprattutto, sii coerente con l'architettura del tuo database. – hajikelist

2

Contro:

  • chiavi primarie composite devono essere importati in tutte le tabelle di riferimento. Ciò significa indici più grandi e più codice da scrivere (ad esempio i join, gli aggiornamenti). Se si utilizza sistematicamente le chiavi composite primarie, può diventare molto macchinoso.
  • Non è possibile aggiornare una parte della chiave primaria. Per esempio. se si utilizza university_id, student_id come chiave primaria in una tabella di studenti universitari e uno studente cambia università, è necessario eliminare e ricreare il record.

Pro:

  • chiavi primarie composite permettono di far rispettare una sorta di vincolo comune in modo potente e ampiamente positivo. Supponiamo di avere un tavolo UNIVERSITY, un tavolo STUDENTE, un tavolo CORSO, e una tabella STUDENT_COURSE (che lo studente segue quale corso). Se è un vincolo che tu sia sempre uno studente dell'università A per seguire un corso di università A, allora quel vincolo sarà automaticamente convalidato se university_id è una parte delle chiavi composite di entrambi STUDENT e CORSO.
2

È necessario creare tutte le colonne in ogni tabella, ovunque sia utilizzata come chiave esterna. Questo è il più grande svantaggio.

Problemi correlati