Progettazione di uno schema scalabile per il database del college [chiuso]

3

Sto cercando di costruire un back-end per il sistema ERP del college. Il sistema sarà basato su LAMP.

Questo è lo scenario:

  • I college hanno 5 rami
  • Ci sono 4-6 classi in ogni ramo.
  • Ci sono 80 studenti in ogni classe.
  • Ogni classe ha quasi 6-7 soggetti.
  • Ci sono circa 250 facoltà.
  • Ognuno di loro insegna una o più materie e prepara un piano di insegnamento per ognuna di esse.
  • Ci sono due semestri in un anno e due test sono condotti in ogni semestre.
  • Le valutazioni continue (CA) sono condotte per soggetto e amp; per base di studenti. Comprende 12 esperimenti e 3 marchi di assegnazione.
  • CA porta al termine calcolo dei marchi di lavoro alla fine del semestre.

Quindi il problema è registrare i dati relativi alla frequenza, alla valutazione continua, ai segni di prova di ogni studente ecc.

Ho creato uno schema di esempio ma il problema è che non è scalabile. A causa di quanto segue:

  • Se una materia è di 40 lezioni, allora richiede quasi 80 * 40 = 3200 registrazioni per la registrazione di presenze di un singolo soggetto per classe; quindi che dire di 6 soggetti in più in ogni semestre.
  • Dai un'occhiata qui

Quindi le mie domande sono:

  • Quali tabelle dovrebbero essere mantenute così come sono [dovrebbe essere creata una sola volta] e quali tabelle devono essere create dinamicamente ea quale intervallo? [vale a dire anno / semestre-saggio / altri suggerimenti]
  • Come rendere il recupero dei dati ottimale?
  • Come ridisegnare lo schema in modo che risulti scalabile.
  • Come posso stimare le dimensioni di ogni tabella nel mio database. Se i campi che rimangono nulli / vuoti occupano spazio [se sono presi in considerazione nei calcoli di dimensioni]

Grazie in anticipo per qualsiasi suggerimento o aiuto.

    
posta geeksal 09.12.2014 - 07:45
fonte

1 risposta

7

Risposta iniziale

Alcuni aspetti preliminari:

  • In pratica trovo che sia utile inserire i campi data per i tempi creati / modificati; rende la vita molto più facile durante il debug dei problemi dei dati. Praticamente qualsiasi tavolo che non sia una tabella di ricerca potrebbe trarne vantaggio. Se una tabella è in scrittura una volta, considera di rinunciare alla colonna del tempo modificata.

  • Assicurati di non memorizzare le password in testo semplice. È oltre lo scopo di questa domanda, ma ho pensato di prendermi il tempo per dirlo.

Detto questo, penso che ti preoccupi prematuramente di cose come la scalabilità finché non avrai effettivamente alcuni dati per il backup dei tuoi problemi. Detto questo, ho un semplice suggerimento.

If a subject is of 40 lectures then it requires almost 80*40=3200 records for recording attendance of a single subject per class; so what about 6 more subjects in each semester.

È vero che stai aggiungendo molti record, ma quei record fino ad ora sembrano essere ... 10 byte ciascuno? Non ho intenzione di cercare le dimensioni dei tipi di dati, ma non stai distruggendo il banco con 10 righe di byte. Ho il sospetto che mentre gli utenti vogliono sempre avere la presenza disponibile, è probabile che concordare un criterio di conservazione possa aiutarti a limitare la crescita e consentire di ridurre i record di presenze degli anni passati.

Tuttavia, hai spazio per ottimizzare. Anziché registrare una presenza per ogni Student in una relazione uno a uno, ti suggerisco di registrare la presenza selezionando il minore tra "partecipato" o "mancato" e registrando solo quello. Ad esempio, se ritieni che la maggior parte degli studenti segua la lezione, selezionerai "mancato", il che significa che la tabella Attendance avrà solo righe per Student s che hanno perso la lezione. Se un Student ha una riga nella tabella Attendance ha perso la lezione, altrimenti era presente. Ovviamente in questo caso, Attendance dovrebbe essere rinominato in qualcosa come Absence o qualcosa del genere.

Dedica più tempo a considerare cosa potresti fare quando i tuoi stakeholder vogliono aggiungere più dati allo schema. Gli esempi includono l'aggiunta di categorie o raggruppamenti, alias o nomi secondari o e-mail secondarie.

Riguardo alla generazione di tabelle dinamiche

Which tables should be kept as they are [i.e should be created only once] and which tables should be created dynamically and at what interval? [i.e year-wise/ semester-wise/ any other suggestions]

Questa è una preoccupazione prematura poiché non sai ancora quali sono i tuoi problemi di prestazioni. Sarei propenso a cercare tavoli con prestazioni scadenti dopo il rilascio e a creare un processo di archiviazione in base alle tue esigenze.

Non raccomando di creare dinamicamente tabelle in quanto dovresti apportare modifiche allo schema del database sull'host live che ha un impatto sull'applicazione, che potrebbe potenzialmente far cadere l'applicazione se commetti un errore di battitura. Per rispondere alla tua domanda, ti consiglio di archiviare i dati a livello di riga.

Se hai bisogno che i vecchi dati siano altamente disponibili ma a cui si accede raramente, puoi farlo emergere usando un modulo separato dell'applicazione, con il suo database separato. Questo database può essere popolato da un processo esterno che sposta le righe (durante una finestra di manutenzione) dal modulo attivo / attivo al modulo di archivio.

Se non è necessario che sia così disponibile, è possibile esportare le righe dal database attivo (durante una finestra di manutenzione) in un archivio compresso correttamente sottoposto a backup e può essere rivisto su richiesta utilizzando gli strumenti di sviluppo.

Il vantaggio di questo approccio è che le operazioni di riga non elimineranno il sito; il caso peggiore è che alcuni dati mancano per un po 'o le prestazioni sono degradate.

Come sviluppatore principale spetta a te determinare quali sono i bisogni e agire di conseguenza. Ancora una volta, ti consiglio di sospendere questo tipo di lavoro finché non avrai un problema concreto.

    
risposta data 09.12.2014 - 10:02
fonte

Leggi altre domande sui tag