Quale schema di database dovrei scegliere?

3

Sto pianificando uno schema di database e esito tra due progetti, quale dovrei scegliere?

Ai fini della domanda, supponiamo di voler preparare un database schema per un'applicazione che gestisce le informazioni degli studenti in a Università. Ci sono diversi moduli nell'applicazione:

  • Registro, che si occupa di informazioni generali, come la data di nascita,  numero di assicurazione sanitaria e simili.

  • Libreria, che si occupa delle proprietà utili alla libreria  gestione, come il numero di libri ritirati, quitus o  sanzioni.

  • Esami, che riguardano gli esami presi e i voti.

La biblioteca dei moduli e gli esami vedono il registro dei moduli, ma a parte questo questo, sono indipendenti.

Nello scenario applicativo, c'è un numero molto grande di studenti, i dati vengono scritti una volta, raramente aggiornati e spesso letti. Inoltre, il l'università espande il suo sistema ogni anno, in modo che i moduli vengano aggiunti: Sport, Campus, qualunque cosa. I moduli rimangono abbastanza indipendenti.

Esito tra due layout di database.

Primo layout

Nel primo layout, una tabella MODULE è associata a ciascun modulo e un UID è usato come chiave primaria. Poiché ogni modulo ha bisogno del proprietà sotto controllo del Registro, prepariamo anche le viste del join di REGISTRY e MODULE su UID , in modo che il database lo sappia useremo questo join in modo esteso.

Quando il sistema si espande, aggiungiamo una nuova tabella e una nuova vista da riflettere questa espansione.

Secondo layout

Nel secondo layout, creiamo una tabella con un numero elevato di colonne mantenendo le proprietà dei vari moduli.

Quando il sistema si espande, aggiungiamo colonne alle tabelle.

Confronto

Come si confrontano questi due approcci?

Se, per esempio, qualche aggiornamento del software viene fornito con un bug grave, che richiede downgrade del software ed esecuzione successiva di un secondo aggiornamento, sembra il primo layout essere più robusto Per quanto riguarda la perfomance, il secondo layout risparmia molto unire le operazioni, ma nel primo layout, abbiamo definito le viste per il unire le operazioni, quindi pubblicizzare quali operazioni complesse sono probabili accadere in modo che il sistema di database possa pianificare questo. Sono lontano da a esperto di database, ma ho ragione se penso che se metto tutto rilevante informazioni nelle mani del sistema di database, sarà in grado di portare correttamente l'operazione?

Se non l'avessi visto usato in applicazioni industriali, non lo avrei mai avuto dato 2 pences sul secondo layout. Ma dato che l'ho fatto, mi piacerebbe ottenere altri consigli.

    
posta user40989 22.11.2013 - 16:56
fonte

3 risposte

9

If I did not see it used in industrial applications

Vedere gli altri fare qualcosa in un certo modo non è una motivazione per farlo da solo. A meno che tu non sappia perché quelle applicazioni sono state modellate in quel modo, supponi il peggio: non sapevano cosa stavano facendo e il modello si è evoluto in questa mostruosità nel tempo.

Denormalization ha il suo posto, ma quando viene usato, di solito sono ottimizzazioni molto specifiche che dovrebbero essere scelte solo dopo un'attenta considerazione .

Quindi: fai ciò che devi, normalizza , vai con il primo layout.

    
risposta data 22.11.2013 - 17:17
fonte
3

Primo layout

Il peggior caso assoluto che abbia mai visto per qualcosa di simile al secondo layout che descrivi era il seguente:

Abbiamo avuto stored procedure separate per effettuare ricerche basate su produttore, modello e parte. Ognuna di queste stored procedure è stata ottimizzata per indici specifici.

Poiché è stato ritenuto difficile da mantenere, qualcuno ha deciso di creare una gigantesca procedura di ricerca memorizzata che si diramava su diverse sezioni interne in base a criteri. È stato un grande fallimento.

Il piano di query memorizzato nella memoria per questa stored procedure " nuova ricerca gigantesca " non è mai stato ottimizzato a causa della ramificazione avvenuta all'interno della stored procedure stessa. Quindi, in sostanza, questa nuova procedura memorizzata finiva per eseguire scansioni complete della tabella ogni volta che veniva chiamata e veniva chiamata molto. Il sistema si arrestava spesso o si interrompeva temporaneamente.

Morale della trama ... non prendere scorciatoie.

    
risposta data 22.11.2013 - 17:47
fonte
1

(A rischio di urlare) Primo layout - SICURAMENTE.

il secondo è un modello di Entità-Attributo-Valore che, in tutti i casi tranne una manciata, causa molti più problemi di quanti ne risolvano. Inoltre, dichiari che "I moduli sono indipendenti"; schiacciateli tutti insieme in un E.A.V. modello e sono per sempre intrecciati.

Suggerirei:

Tabella REGISTRY

  • Chiave primaria su USER_ID
  • Indici secondari su nomi e altri campi comunemente cercati (attenzione per il caso di questi valori, molti DBMS riguardano "A"!="a").

Tabella MODULO

  • Chiave primaria su MODULE_ID.
  • Un modulo deve essere in grado di esistere senza nessuno studente, quindi USER_ID non può apparire in questa tabella (ad eccezione, eventualmente, di una chiave esterna del "proprietario" del modulo).

Per gli Studenti registrati su un modulo, avrai bisogno di una tabella "linking":

Tabella MODULE_STUDENT

  • Chiave primaria su USER_ID e MODULE_ID.
  • Indice secondario su MODULE_ID (e USER_ID).

Se utilizzi l'integrità referenziale (e dovresti), aggiungi le chiavi esterne per convalidare i valori contenuti in questa tabella:

  • MODULE_ID - > MODULE.MODULE_ID
  • USER_ID - > REGISTRY.USER_ID

Se necessario, unisciti a REGISTRY, MODULE_STUDENT e / o MODULE per ottenere tutte le informazioni correlate.

Le viste non aiutano le prestazioni del tuo sistema.
Indicizzazione corretta, delle tabelle sottostanti quelle viste, sarà .

(E le viste renderanno [probabilmente] più semplice la codifica dell'applicazione).

    
risposta data 31.01.2014 - 14:26
fonte

Leggi altre domande sui tag