2010-10-02 16 views
5

Supponiamo che io abbia Tutors che prende online webclasses e crei learning packs. Entrambi online webclasses e learning packs possono essere valutati da students e infine un punteggio di tutor's è la media semplice di tutte le valutazioni sul suo classes e packs.Mysql - Una domanda di progettazione di database semplice

Questa è l'architettura tavolo della nostra attuale Ratings tavolo -

CREATE TABLE IF NOT EXISTS `Ratings` (
    `id_rating` int(10) unsigned NOT NULL auto_increment, 
    `id_teacher` int(10) unsigned default NULL COMMENT 'the teacher who created the class/pack', 
    `id_lp` int(10) unsigned default NULL COMMENT 'the id of the learning pack', 
    `id_wc` int(10) NOT NULL default '0' COMMENT 'the id of the webclass', 
    `id_user` int(10) unsigned NOT NULL default '0' COMMENT 'the user who has rated', 
    `rate` int(10) unsigned NOT NULL default '0', 
    `cdate` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `udate` timestamp NULL default NULL, 
    PRIMARY KEY (`id_rating`), 
    KEY `Ratings_FKIndex1` (`id_user`), 
    KEY `id_lp` (`id_lp`), 
    KEY `id_wc` (`id_wc`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Attualmente, sia di classe e imballare feedback vengono inseriti nella stessa tabella (id_wc e id_lp sono iscritti conseguenza - uno è entrato e l'altro è NULL per ogni record di valutazione).

Quindi, la mia domanda è -
È questa architettura corretto o è meglio mantenere class e pack feedback separano? Perché o perché no? Ho bisogno esattamente dello stesso numero di campi di tabella Rating per la valutazione class e pack.

Immagino che se le classificazioni di classe e confezione dovessero essere trovate separatamente, le tabelle separate ridurranno il numero di record da cercare. Ma, dal momento che nel nostro caso sono necessarie solo le valutazioni del tutor (coinvolge sia la classe che i pacchetti), è per questo che tutti i punteggi sono messi insieme.

+0

Usa mySQL workbench è persino creato dagli sviluppatori mysql. –

risposta

0

Se pensi che ti ritroverai con più entità che richiedono una valutazione, allora devi creare qualcosa di più generico (e non molto db-filosofia-friendly).

ratings 
------- 
id 
voterClass 
voterId 
subjectClass 
subjectId 
vote 
date(s) 

Utilizzando questo disegno si dimentica FK e integrità referenziale. Ma è molto flessibile, e usando gli indici giusti è molto scalabile. Inoltre, quando le entità (soggetti) vengono cancellate, i voti rimangono. Questo design ti evita di duplicare campi e tabelle.

3

Un modello un po 'più dettagliato.

  • Un insegnante in un'università può prendere lezioni anche.
  • Una classe può avere più di un insegnante.
  • Ci possono essere diverse classi sullo stesso argomento, insegnate da diversi insegnanti.
  • Solo gli studenti che partecipano alle lezioni possono votare (votare) la classe.
  • I pacchetti di apprendimento sono su un argomento (matematica, biologia).
  • Un pacchetto di apprendimento può avere più autori.
  • Tecnicamente uno studente può anche creare un pacchetto didattico.
  • Solo i membri che utilizzano un pacchetto di apprendimento possono valutare un pacchetto.
  • Sebbene gli autori possano votare per i pacchetti e gli insegnanti possano votare per le loro classi, tali voti vengono ignorati.

alt text

Se interessati solo nella tabella voti, è possibile utilizzare:

alt text

Oppure, combinare i due modelli in qualcosa di simile:

alt text

+0

grazie per aver risposto con queste belle foto, ma puoi spiegare un po 'come è meglio questa architettura? Mi interessa solo la tabella delle classifiche e solo fino al sistema che ho descritto (solo quelle entità - tutor, classi e pacchetti). –

0

Utilizzare mySQL workbench. È multipiattaforma e funziona alla grande.

MySQL workbench visurally see what you are doing with your database. http://diariolinux.com/wp-content/uploads/2008/08/wb51linuxpreview2a.png

MySQL Workbench soddisfa anche tutti i criteri per la general-purpose-remote-data-backup-and-download-including-innodb-support domanda su StackOverflow

BTW: Usa <ctrl>+<G> di trasmettere engineer una base di dati.

+0

@ JamesM-SiteGen- In realtà ho chiesto un suggerimento/idea di progettazione del database qui. Lo strumento che hai suggerito può essere utile in generale, ma non riesco a vedere come risponde direttamente alla mia domanda. Se potessi elaborare un po '? Potresti prendere in considerazione l'idea di porre questa come soluzione alla domanda http://stackoverflow.com/questions/4710954/general-purpose-remote-data-backup-and-download-including-innodb-support. –

+0

Certo che è fatto .. –