Schema del database per un elenco di attività


15

Sto cercando di creare un'applicazione di todo list molto semplice con PHP, MySQL, Jquery templating e JSON ... Tuttavia, il mio schema sembra complicare le cose in JSON.

Qual è il modo migliore per farlo?

  1. Una nuova tabella per ogni elenco, contenente gli elementi.

o

  1. una tabella per gli elenchi e una tabella per gli elementi che sono uniti in qualche modo? Perché ho provato questo e non sembra il modo giusto per farlo? Esempio http://jsfiddle.net/Lto3xuhe/

Quante liste cercherete di supportare?

Massimo 100. Quali sono i limiti?
CodeSlow,

21
Il modo in cui conta un dba. Una persona normale conta fino a dieci come "1,2,3,4 ... 10". Il programmatore AC conta fino a dieci come "0,1,2,3, ... 9". Un dba conta "zero, uno, molti".

Risposte:


66

C'è una battuta che ho sentito poco tempo fa:

D In che modo un programmatore BASIC conta fino a 10?
A 1,2,3,4,5,6,7,8,9,10

D In che modo un codificatore C conta fino a 10?
A 0,1,2,3,4,5,6,7,8,9

D In che modo un DBA conta fino a 10?
A 0,1, molti

La verità dietro questa battuta è che una volta che hai due (o più) della stessa cosa in una struttura di database (colonne o tabelle), stai sbagliando.

Uno schema che assomiglia a:

+----------+
| id       |
| name     |
| phone1   |
| phone2   |
|          |
+----------+

È sbagliato perché dove inserirai un terzo numero di telefono se qualcuno lo possiede?

Lo stesso vale per le tabelle stesse. È anche una cosa negativa modificare lo schema in fase di esecuzione, che la "nuova tabella per ogni elenco" sembra implicare. (Correlato: MVC4: come creare un modello in fase di esecuzione? )

E quindi, la soluzione è creare un elenco di cose da fare composto da due tabelle. Ci sono due cose che hai: elenchi ed elementi.

Quindi, facciamo una struttura di tabella che rifletta questo:

+----------+       +-------------+
| List     |       | Task        |
+----------+       +-------------+
| id (pk)  <---+   | id (pk)     |
| name     |   +---+ listid (fk) |
|          |       | desc        |
|          |       |             |
+----------+       +-------------+

L'elenco ha un ID (la chiave primaria per l'elenco) e un nome. L'attività ha un id (la chiave primaria) un listid (una chiave esterna) e la descrizione dell'attività. La chiave esterna si riferisce alla chiave primaria di un'altra tabella.

Sottolineerò che questo non inizia a comprendere tutte le possibilità in vari requisiti per il software e la struttura della tabella di supportarlo. Completati, data di scadenza, ripetizione, ecc ... sono tutte strutture aggiuntive che probabilmente dovranno essere prese in considerazione durante la progettazione della tabella. Detto questo, se la struttura della tabella non è adeguatamente normalizzata (o realizzando i compromessi che hai fatto perché non è normalizzata), avrai molti mal di testa in seguito.


Ora, tutto ciò che riguarda la scrittura di questo come un database relazionale. Ma questo non è l'unico tipo di database là fuori. Se consideri un elenco come un documento, anche i database nosql in stile documento possono offrire un approccio che non è sbagliato.

Anche se non approfondirò troppo, ci sono numerosi tutorial là fuori per le liste di cose da fare sul divano. Uno di questi che è venuto fuori con una ricerca è una semplice applicazione Elenco attività in CouchDB . Un altro si presenta nella wiki di couchdb: Schema proposto per le liste di cose da fare .

Nell'approccio appropriato per un divano, ogni elenco è un documento JSON memorizzato nel database. Dovresti semplicemente inserire l'elenco in un oggetto JSON e inserirlo nel database. E poi leggi dal database.

Il JSON potrebbe apparire come:

[
 {"task":"get milk","who":"Scott","dueDate":"2013-05-19","done":false},
 {"task":"get broccoli","who":"Elisabeth","dueDate":"2013-05-21","done":false},
 {"task":"get garlic","who":"Trish","dueDate":"2013-05-30","done":false},
 {"task":"get eggs","who":"Josh","dueDate":"2013-05-15","done":true}
]

(a partire dal creazione di una lista della spesa con un file json su Stack Overflow).

O qualcosa di simile a quello. C'è qualche altra registrazione che quel divano ha come parte del documento.

Il fatto è che non è il modo sbagliato di avvicinarsi e un elenco di cose da fare in un database di documenti può essere perfettamente adatto a ciò che si sta tentando di fare con un sovraccarico di concetti per come farlo.


6

L'opzione 2 è un'impostazione principale / dettaglio tradizionale. Questo è probabilmente quello che vuoi qui. Inserisci l'id della lista nella tabella degli elementi e unisciti a quello. Lo schema non dovrebbe influire su JSON. La tua query potrebbe assomigliare a:

select lists.name as list_name, items.name as item_name 
from items 
join lists on (lists.id = items.list_id)

Ottenere questo errore: mysqli_fetch_assoc () si aspetta che il parametro 1 sia mysqli_result, dato booleano?
CodeSlow

6
@CodeSlow: Questa è una domanda di codice specifica e dettagliata, posta in modo più appropriato su stackoverflow.com
FrustratedWithFormsDesigner

3

Non proverei a legare la tua rappresentazione dell'interfaccia utente o la trasmissione dei dati all'interfaccia utente direttamente al modo in cui intendi archiviare i dati. Mantenendo i due separati e utilizzando una logica del middleware per sposare i due, è possibile modificare facilmente entrambi i lati senza influire in modo critico sull'altro.

Dal punto di vista dell'archiviazione dei dati, è consigliabile utilizzare l'opzione 2 che segue il tipico schema di dati normalizzato in cui le parti comuni vengono prese in considerazione nelle proprie tabelle per evitare la ripetizione e minimizzare il gonfiamento del database.

Dal punto di vista della vista, è sufficiente utilizzare una query del database per unire i dati pertinenti in un set di risultati e quindi iterare quel risultato e generare una risposta json applicabile alle esigenze dell'interfaccia utente. Quello che probabilmente vuoi fare è inserire i dati in JSON in modo che si adattino al meglio alle tue esigenze dell'interfaccia utente, eliminando spesso la necessità di una logica di scripting aggiuntiva nelle tue pagine web.


Questo è esattamente ciò che devo fare, ma non ho idea di come procedere. Hai del materiale di esempio che posso vedere / seguire? Grazie - Generazione di JSON in PHP
CodeSlow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.