web-dev-qa-db-fra.com

Schéma de base de données pour une liste de tâches

J'essaie de faire une application de liste de tâches très simple avec PHP, MySQL, les modèles Jquery et JSON ... Cependant, mon schéma semble compliquer les choses en JSON.

Quelle est la meilleure façon de procéder?

  1. Un nouveau tableau pour chaque liste, contenant les éléments.

ou

  1. un tableau pour les listes et un tableau pour les éléments qui sont joints en quelque sorte? Parce que j'ai essayé ça et ça ne semble pas être la bonne façon de le faire? Exemple http://jsfiddle.net/Lto3xuhe/
15
CodeSlow

Il y a une blague que j'ai entendue depuis un moment:

[~ # ~] q [~ # ~] Comment un codeur BASIC compte-t-il jusqu'à 10?
[~ # ~] a [~ # ~] 1,2,3,4,5,6,7,8, 9,10

[~ # ~] q [~ # ~] Comment un codeur C compte-t-il jusqu'à 10?
[~ # ~] a [~ # ~] 0,1,2,3,4,5,6,7, 8,9

[~ # ~] q [~ # ~] Comment un DBA compte-t-il jusqu'à 10?
[~ # ~] a [~ # ~] 0,1, beaucoup

La vérité derrière cette blague est qu'une fois que vous avez deux (ou plus) de la même chose dans une structure de base de données (colonnes ou tables), vous vous trompez.

Un schéma qui ressemble à:

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

Est-ce faux, où allez-vous mettre un troisième numéro de téléphone si quelqu'un l'a?

La même chose s'applique aux tables elles-mêmes. C'est également une mauvaise chose de modifier le schéma au moment de l'exécution, ce que la "nouvelle table pour chaque liste" semble impliquer. (Connexes: MVC4: Comment créer un modèle au moment de l'exécution? )

Et donc, la solution est de créer une liste de tâches composée de deux tables. Il y a deux choses que vous avez - des listes et des articles.

Alors, faisons une structure de table qui reflète ceci:

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

La liste a un identifiant (la clé primaire de la liste) et un nom. La tâche a un id (la clé primaire) un listid (une clé étrangère) et la description de la tâche. La clé étrangère renvoie à la clé primaire d'une autre table.

Je soulignerai que cela ne commence pas à englober toutes les possibilités dans diverses exigences pour le logiciel et la structure de table pour le supporter. Terminé, date d'échéance, répétition, etc ... ce sont toutes des structures supplémentaires qui devront probablement être prises en compte lors de la conception de la table. Cela dit, si la structure de la table n'est pas celle qui est normalisée de manière appropriée (ou réalisant les compromis que vous avez faits parce qu'elle n'est pas normalisée), vous aurez beaucoup de maux de tête plus tard.


Maintenant, tout ce qui concerne l'écriture de cette base de données relationnelle. Mais ce n'est pas le seul type de base de données. Si vous considérez une liste comme un document les bases de données nosql de style document peuvent également offrir une approche qui ne soit pas fausse.

Bien que je ne vais pas m'y plonger trop loin, il existe de nombreux tutoriels pour les listes de tâches dans le canapé. Un tel qui a abouti à une recherche est ne simple application de liste de tâches dans CouchDB . Un autre apparaît dans le wiki couchdb: Schéma proposé pour les listes de tâches .

Dans l'approche appropriée pour un canapé, chaque liste est un document JSON stocké dans la base de données. Vous devez simplement placer la liste dans un objet JSON et la placer dans la base de données. Et puis vous lisez à partir de la base de données.

Le JSON pourrait ressembler à:

[
 {"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}
]

(à partir de création d'une liste de courses avec un fichier json sur Stack Overflow).

Ou quelque chose qui s'approche de ça. Il y a une autre tenue de dossiers que le canapé a dans le document.

Le fait est que ce n'est pas la mauvaise façon d'approcher et qu'une liste de tâches dans une base de données de documents peut être parfaitement adaptée à ce que vous essayez de faire avec moins de surcharge de concept pour comment pour le faire.

67
user40980

L'option 2 est une configuration maître/détail traditionnelle. C'est probablement ce que vous voulez ici. Mettez l'ID de la liste dans le tableau des éléments et rejoignez-le. Le schéma ne doit pas avoir d'impact sur le JSON. Votre requête pourrait ressembler à ceci:

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

Je n'essaierais pas de lier votre représentation d'interface utilisateur ou la transmission de données à l'interface utilisateur directement à la façon dont vous avez l'intention de stocker les données. En gardant les deux séparés et en utilisant une logique middleware pour les marier, vous pouvez facilement modifier l'un ou l'autre côté sans avoir un impact critique sur l'autre de manière critique.

Du point de vue du stockage des données, vous utiliseriez probablement l'option 2 qui suit le modèle de données normalisé typique où les parties communes sont factorisées dans leurs propres tables pour éviter les répétitions et minimiser le gonflement de la base de données.

Du point de vue de la vue, vous devez simplement utiliser une requête de base de données pour joindre les données pertinentes dans un ensemble de résultats, puis itérer ce résultat et générer une réponse json applicable à vos besoins d'interface utilisateur. Ce que vous voudrez probablement faire est d'introduire les données dans JSON afin qu'elles correspondent le mieux possible à vos besoins d'interface utilisateur, éliminant souvent le besoin d'une logique de script supplémentaire dans vos pages Web.

3
Naros