Progettazione di un database per un'applicazione di voto

2

Sto lavorando a una piccola applicazione web per il voto. Simile a Strawpoll, ma solo gli utenti autenticati possono fare sondaggi, mentre a tutti è consentito votare.

Utente:

  • id
  • email / password_hash / nome / ... altri dati ...

Sondaggio:

  • id
  • user_id REFERENCES User.id - indica quale utente ha creato il sondaggio
  • titolo

PollOptions:

  • id
  • testo
  • poll_id REFERENZE Poll.id - rileva quale polling appartiene alle opzioni
  • conteggio - Numero di voti per questa opzione

Voti:

  • id (opzionale?)
  • poll_id REFERENZE Poll.id: indica su quale sondaggio è stato votato
  • user_id REFERENCES User.id - indica l'utente che ha votato
  • ip_address - Se la persona che ha votato non è registrata, ip_address verrà riempito per impedirgli di votare più volte.

Voglio che il proprietario del sondaggio sia in grado di eliminare i sondaggi e cambiare il sondaggio (aggiungere più opzioni, rimuovere opzioni, ...) Il mio progetto è abbastanza buono? In caso contrario, cosa dovrei cambiare?

    
posta Marko Stojanovic 19.08.2016 - 16:56
fonte

1 risposta

2
  • I nomi delle entità devono essere singolari, POLL_OPTION, non POLL_OPTIONS.
  • VOTE dovrebbe fare riferimento a POLL_OPTION, non a POLL
  • FK da VOTE a USER non deve essere obbligatorio (consentire null) per consentire agli utenti non registrati di votare.
  • COUNT è un campo calcolato, non è necessario o deve essere aggiornato post-polling contando le righe in VOTA per ogni opzione.
  • Tieni presente che quando elimini un POLL devi farlo a cascata o l'eliminazione fallirà se i sondaggi hanno già opzioni e le opzioni hanno già voti.
  • PK di POLL_OPTION deve essere (POLL_OPTION_ID, POLL_ID), in questo modo dovrà essere anche FK da VOTE a POLL_OPTION (POLL_OPTION_ID, POLL_ID). Ciò ti consentirà di impostare (USER_ID, POLL_ID) il PK di VOTO. In questo modo la stessa persona non sarà in grado di votare due volte nello stesso POLL. Se ti trovi in surrogati, aggiungi VOTE_ID, rendi il PK ma aggiungi anche un indice univoco su (USER_ID, POLL_ID) per ottenere lo stesso vincolo.

UPDATE:

PoichéOPhadichiaratochemantenerechihavotatoperqualeopzioneètenutanascosta,eccoun'altrasoluzione:

  • VOTEhaPKinPOLLcomedesignoriginalediOP.ÈconsentitosolounvotoperpersonatramitePKe/oindiceunivocosuEMAIL_ADDR.
  • Maun'altraentitàchiamataBALLOT,noncorrelataconUSER,terràunarigaperognivoto.Irisultatidelsondaggioverrannocontatidallerighediquestatabella.SepiùutentidovesseroaggiornareilCOUNTnellastessariganellostessomomento,siavrannoproblemidiblocco.
  • Unavoltacompletatoilsondaggio,puoicalcolareitotalicontandoivotieaggiornareilCOUNTsuPOLL_OPTIONS.Quindipuoicancellareivotiotenerliperlaverifica.

    
risposta data 19.08.2016 - 17:26
fonte

Leggi altre domande sui tag