2010-11-03 4 views
33

Ho un database che memorizzerà i profili delle persone. Questi individui hanno circa 50 possibili campi.Cosa c'è di meglio - molti tavolini o un grande tavolo?

Alcune sono cose comuni come, nome, cognome, email, numero di telefono.

Altri sono cose come hobby, abilità, interessi

Alcuni sono altezza, peso, colore della pelle.

Ciascuno di questi gruppi viene utilizzato dal sistema in momenti diversi. In termini di possibilità di negoziare attraverso il database, preferirei avere 7 tabelle ciascuna di circa 8 campi. Qual è la pratica migliore da fare?

MODIFICA: I dati verranno utilizzati in un motore di ricerca, per la ricerca di corrispondenze profilo. Questo influenza ciò che sto facendo?

risposta

30

È difficile da dire e si basa su ciò che richiede l'applicazione. Direi di guardare in Database Normalization come ti mostrerà come normalizzare il database e in che dovrebbe far luce su ciò che vorresti separare nelle loro tabelle ecc.

+6

+1 per la normalizzazione –

+0

I dati verranno utilizzati in un motore di ricerca, per trovare le corrispondenze del profilo. Questo influenza ciò che sto facendo? – Ash

+0

se si sta recuperando da un RDBMS, si prega di normalizzare.Influirà su ciò che stai facendo in modo positivo – Randy

3

Non c'è una risposta corretta a questa domanda perché dipende in gran parte da quando e come userete i vostri dati, con quale frequenza cambierà e quale sarà il volume di utilizzo sul database.

Quello che farei personalmente sarebbe organizzare i dati in entità logiche e creare tabelle basate su tali entità. Questo è almeno dove vorrei iniziare.

+0

Non mi preoccuperei del volume di utilizzo tanto quanto la qualità dei dati. –

2

molte piccole tabelle, ad esempio la normalizzazione è la migliore qui. fornisce flessibilità, riduce la ridondanza e una migliore organizzazione del database.

6

Da quello che hai descritto, lo spezzerei in più tavoli. Non vorrei dividere su un numero arbitrario di colonne, ma proviamo a pensare a raccolte logiche di colonne che costituiscono un'entità o corrispondono ai pattern di accesso che userete per colpire i dati

+0

sì, quella cifra è solo un esempio, i dati saranno raggruppati semanticamente. – Ash

2

C'è organizzazione del database non corretta al 100%, ce n'è solo una che sia abbastanza buona per i tuoi scopi. Se in futuro non prevedi di superare le capacità di un singolo server di database valido, normalizza i dati e utilizza molti vincoli, ad esempio chiavi esterne, eliminazioni a cascata e tali da rendere il tuo database un piacere. D'altra parte, se si guardano i database di molte applicazioni che hanno miliardi di richieste, si scoprirà che rinunciano a molte di queste sottigliezze in nome della performance e della scalabilità.

+4

Sei la prima persona che sento che dice "Cascading Deletes è una gioia lavorare con" –

4

IMO, è più importante preoccuparsi della qualità dei dati memorizzati rispetto al numero di tabelle necessarie.

Ad esempio, è necessario tenere traccia delle modifiche? Se John era 5'2 "nel gennaio 2007 ed è 5'11" nell'ottobre 2010, vuoi sapere? Se è così, dovrai separare la persona dall'altezza in due tavoli.

E gli hobby: hanno solo 3 hobby? Possono avere più/meno? È qualcosa che vorresti interrogare in futuro? Se è così, hai bisogno di una tabella separata.

Si dovrebbe leggere sulla progettazione del database e sulla normalizzazione (ci sono diversi thread eccellenti su questo sito stesso).

https://stackoverflow.com/questions/tagged/normalization

5

A meno che ogni persona ha lo stesso numero di hobby (IE ognuno ha 2 hobby quotate), va normalizzato.

I campi che sono sempre 1 a 1 con la persona devono essere nella stessa tabella. Età per esempio. Nessuna persona avrà due età diverse.

4

Consiglierei qualche tabella. Oltre la normalizzazione è difficile da gestire e si finirebbe per scrivere query complesse che finisce con prestazioni lente.

Normalizza solo quando assolutamente necessario e pensa in termini logici. Con le scarse informazioni che hai fornito in precedenza, vorrei andare per tre tabelle:

Tabella 1: PersonalDetails Tabella 2: Attività Tabella 3: Varie

Ci sono altre tecniche per accelerare le prestazioni come il clustering ecc., che è possibile utilizzare in base alle proprie esigenze.

22

Sono al campo Normalize.

Ecco alcuni suggerimenti per iniziare:

Inizia con un processo di assegnare un certo identificatore univoco arbitrario ad ogni "persona" . Chiama questo il PersonId o qualcosa del genere. Questo identificatore è chiamato una chiave surrogata. L'unico scopo di una chiave surrogata è di garantire una relazione 1 a 1 tra esso e una persona reale nel mondo reale. Utilizzare la chiave surrogata quando si associa il valore di qualche altro attributo a una "persona" nel proprio database .

Man mano che si sviluppa il layout del database, è possibile trovare chiavi surrogate necessarie (o almeno utili) per alcuni altri attributi.

Guarda tutti gli attributi che desideri gestire. Poni la seguente domanda: Qualunque persona ha un solo valore per questo attributo?

Ad esempio, ogni persona ha esattamente una "Data di nascita". Ma come possono "Hobby" avere? Probabilmente zero a molti. Gli attributi a valore singolo (ad esempio data di nascita, altezza, peso, ecc.) Sono candidati per entrare in una tabella comune con PersonId come chiave. Il numero di attributi in ciascuna tabella non dovrebbe essere preoccupante a questo punto.

Gli attributi multivalore come Hobby necessitano di un trattamento leggermente diverso. Potresti voler creare tabelle separate per ogni attributo multivalore. Usando Hobby come esempio potresti creare la seguente tabella PersonHobby(PersonId, Hobby). Una riga in questa tabella potrebbe sembrare qualcosa come: (123, "Stamp Collecting"). In questo modo è possibile registrare il numero di hobby necessario per ogni persona, uno per riga. Fai lo stesso per "Interesse", "Abilità" ecc.

se ci sono un certo numero di attributi multivalore dove la combinazione di PersonId + Hobby determinano niente altro (es. Non avete nulla di interessante per registrare su questa persona a fare questo "hobby" o "Interesse" o "Abilità") potresti raggrupparli in una tabella Valore attributo con una struttura come PersonAV(PersonId, AttributeName, Value). Qui una riga potrebbe essere come: (123, "Hobby", "Stamp Collecting").

Se seguire questa strada, è anche una buona idea per sostituire il AttributeName nella tabella PersonAV per una chiave surrogata e creare un altro tavolo di mettere in relazione questo chiave per la sua descrizione. Qualcosa come: Attribute(AttributeId, AttributeName). Una riga in questa tabella sarà simile a (1, "Hobby") e una riga PersonAV corrispondente potrebbe essere (123, 1, "Stamp Collecting"). Questo è comunemente fatto in modo che se hai mai bisogno di sapere quale AttributeNames sono validi nel tuo database/applicazione hai un posto dove cercarli. Pensate a come si potrebbe convalidare se "interesse" è un valore valido per AttributeName o no - se non si è registrata una certa persona che ha che AttributeName poi c'è alcuna traccia di quel AttributeName sul database - come fai a sapere se dovrebbe esistere o no? Bene, guarda nel tavolo Attribute!

Alcuni attributi possono avere più relazioni e anche questo influenzerà il modo in cui le tabelle vengono normalizzate. Non ho visto nessuna di queste dipendenze nel tuo esempio, quindi considera quanto segue: Supponiamo di avere un magazzino pieno di parti, il PartId determina il suo WeightClass, StockCount e ShipCost. Questo suggerisce una tabella qualcosa come: Part(PartId, WeightClass, StockCount, ShipCost). Tuttavia, se esiste una relazione tra gli attributi non chiave , questi devono essere scomposti. Ad esempio, supponiamo che WeightClass direttamente determini ShipCost. Ciò implica che solo WeightClass è sufficiente per determinare ShipCost e ShipCost deve essere preso in considerazione dalla tabella Part.

La normalizzazione è un'arte piuttosto sottile. È necessario identificare le dipendenze funzionali esistenti tra tutti gli attributi nel modello di dati per eseguirlo correttamente. Solo venire con le dipendenze funzionali prende un bel po 'di pensiero e considerazione - ma è è fondamentale per ottenere il corretto design del database.

Vi invito a dedicare del tempo a alla normalizzazione dello studio un po 'di più prima di costruire il vostro database. Alcuni giorni trascorsi qui, , si ripagheranno più che sulla strada. Prova a fare alcune ricerche su Google/Wikipedia per "Dipendenza funzionale", "Normalizzazione" e "Progettazione database". Leggi, studia, impara, poi costruisci bene.

I suggerimenti che ho fatto riguardo alla normalizzazione della progettazione del database sono solo un suggerimento sulla direzione che potrebbe essere necessario prendere. Senza avere una conoscenza approfondita di tutti i dati che stai cercando di gestire nella tua applicazione, qualsiasi consiglio dato qui dovrebbe essere preso con un "granello di sale".