Sto creando una tabella di database e non ho assegnato una chiave primaria logica. Quindi, sto pensando di lasciarlo senza una chiave primaria, ma mi sento un po 'in colpa per questo. Dovrei?
Ogni tabella dovrebbe avere una chiave primaria?
Sto creando una tabella di database e non ho assegnato una chiave primaria logica. Quindi, sto pensando di lasciarlo senza una chiave primaria, ma mi sento un po 'in colpa per questo. Dovrei?
Ogni tabella dovrebbe avere una chiave primaria?
Risposte:
Risposta breve: sì .
Risposta lunga:
In MySQL, il motore di archiviazione InnoDB crea sempre una chiave primaria se non la hai specificata esplicitamente, creando così una colonna aggiuntiva a cui non hai accesso.
Si noti che una chiave primaria può essere composita.
Se si dispone di una tabella di collegamenti molti-a-molti, si crea la chiave primaria su tutti i campi coinvolti nel collegamento. In questo modo ti assicuri di non avere due o più record che descrivono un link.
Oltre ai problemi di coerenza logica, la maggior parte dei motori RDBMS trarrà vantaggio dall'inclusione di questi campi in un indice univoco.
E poiché qualsiasi chiave primaria comporta la creazione di un indice univoco, è necessario dichiararlo e ottenere coerenza e prestazioni logiche.
Vedi questo articolo nel mio blog per sapere perché dovresti sempre creare un indice univoco su dati univoci:
PS Ci sono alcuni casi davvero speciali in cui non hai bisogno di una chiave primaria.
Per lo più essi includono le tabelle di registro che non hanno alcun indici per motivi di prestazioni.
Sempre meglio avere una chiave primaria. In questo modo soddisfa il primo modulo normale e consente di continuare lungo il percorso di normalizzazione del database .
Come affermato da altri, ci sono alcuni motivi per non avere una chiave primaria, ma la maggior parte non verrà danneggiata se esiste una chiave primaria
Praticamente ogni volta che ho creato una tabella senza una chiave primaria, pensando che non ne avrei avuto bisogno, ho finito per tornare indietro e aggiungerne una. Ora creo anche le mie tabelle di join con un campo identità generato automaticamente che utilizzo come chiave primaria.
Fatta eccezione per alcuni casi molto rari (forse una tabella di relazione molti-a-molti, o una tabella che usi temporaneamente per il caricamento di grandi quantità di dati), vorrei dire:
Se non ha una chiave primaria, non è una tabella!
Marc
Avrai mai bisogno di unirti a questo tavolo con altri tavoli? Hai bisogno di un modo per identificare in modo univoco un record? Se la risposta è sì, è necessaria una chiave primaria. Supponiamo che i tuoi dati siano qualcosa di simile a una tabella dei clienti che ha i nomi delle persone che sono clienti. Potrebbe non esserci una chiave naturale perché hai bisogno di indirizzi, e-mail, numeri di telefono, ecc. Per determinare se questa Sally Smith è diversa da quella di Sally Smith e memorizzerai tali informazioni in tabelle correlate poiché la persona può avere telefoni multipli, additivi , e-mail, ecc. Supponiamo che Sally Smith sposi John Jones e diventi Sally Jones. Se non hai una chiave artificiale sul tavolo, quando aggiorni il nome, hai appena cambiato 7 Sally Smiths in Sally Jones anche se solo uno di loro si è sposato e ha cambiato il suo nome.
Dici di non avere una chiave naturale, quindi non hai nemmeno combinazioni di campi da rendere uniche, questo rende fondamentale la chiave artificiale.
Ho trovato ogni volta che non ho una chiave naturale, una chiave artificiale è un must assoluto per mantenere l'integrità dei dati. Se hai una chiave naturale, puoi usarla come campo chiave. Ma personalmente, a meno che la chiave naturale non sia un campo, preferisco comunque una chiave artificiale e un indice univoco sulla chiave naturale. Te ne pentirai più tardi se non ne inserirai uno.
È buona norma avere un PK su ogni tavolo, ma non è DEVE. Molto probabilmente avrai bisogno di un indice univoco e / o di un indice cluster (che sia PK o meno) a seconda delle tue necessità.
Consulta le sezioni Chiavi primarie e indici cluster nella documentazione online (per SQL Server)
"I vincoli PRIMARY KEY identificano la colonna o l'insieme di colonne che hanno valori che identificano in modo univoco una riga in una tabella. Nessuna riga in una tabella può avere lo stesso valore della chiave primaria. Non è possibile inserire NULL per nessuna colonna in una chiave primaria. consiglia di utilizzare una piccola colonna intera come chiave primaria. Ogni tabella dovrebbe avere una chiave primaria. Una colonna o combinazione di colonne che si qualificano come valore della chiave primaria viene definita chiave candidata. "
Ma dai un'occhiata anche a: http://www.aisintl.com/case/primary_and_foreign_key.html
Non sono d'accordo con la risposta suggerita. La risposta breve è: NO .
Lo scopo della chiave primaria è identificare in modo univoco una riga sulla tabella per formare una relazione con un'altra tabella. Tradizionalmente, viene utilizzato un valore intero auto-incrementato per questo scopo, ma ci sono variazioni a questo.
Esistono casi, ad esempio la registrazione di dati di serie temporali, in cui l'esistenza di tale chiave non è semplicemente necessaria e richiede solo memoria. Rendere unica una riga è semplicemente ... non necessario!
Un piccolo esempio: Tabella A: LogData
Columns: DateAndTime, UserId, AttribA, AttribB, AttribC etc...
Nessuna chiave primaria necessaria.
Tabella B: utente
Columns: Id, FirstName, LastName etc.
Chiave primaria (ID) necessaria per essere utilizzata come "chiave esterna" nella tabella LogData.
So che per utilizzare determinate funzionalità di gridview in .NET, è necessario disporre di una chiave primaria per consentire a gridview di sapere quale riga deve essere aggiornata / eliminata. La pratica generale dovrebbe essere quella di avere una chiave primaria o un cluster di chiavi primarie. Personalmente preferisco il primo.
Per renderlo a prova di futuro dovresti davvero. Se vuoi replicarlo, ne avrai bisogno. Se vuoi unirti ad un altro tavolo, la tua vita (e quella dei poveri sciocchi che dovranno mantenerlo l'anno prossimo) sarà molto più facile.
Sono nel ruolo di mantenimento dell'applicazione creata dal team di sviluppo offshore. Ora sto riscontrando tutti i tipi di problemi nell'applicazione perché lo schema del database originale non conteneva TASTI PRIMARI su alcune tabelle. Quindi, per favore, non lasciare che altre persone soffrano a causa del tuo design scadente. È sempre una buona idea avere le chiavi primarie sui tavoli.
Ho sempre una chiave primaria, anche se all'inizio non ho ancora in mente uno scopo. Ci sono state alcune volte in cui alla fine ho bisogno di un PK in un tavolo che non ne ha uno ed è sempre più difficile inserirlo in un secondo momento. Penso che ci sia più di un vantaggio nel includerne sempre uno.
In breve, no. Tuttavia, è necessario tenere presente che determinate operazioni CRUD di accesso client lo richiedono. Per le prove future, tendo sempre a utilizzare le chiavi primarie.
Se si utilizza l'ibernazione, non è possibile creare un'entità senza una chiave primaria. Questi problemi possono creare problemi se si lavora con un database esistente creato con semplici script sql / ddl e non è stata aggiunta alcuna chiave primaria