Esquema do banco de dados para uma lista de tarefas

15

Estou tentando criar um aplicativo de lista de tarefas muito simples com PHP, MySQL, modelagem de Jquery e JSON ... No entanto, meu esquema parece complicar as coisas no JSON.

Qual é a melhor maneira de fazer isso?

  1. Uma nova tabela para cada lista, contendo os itens.

ou

  1. uma tabela para listas e uma tabela para itens que são unidos de alguma forma? Porque eu tentei isso e não parece o caminho certo para fazê-lo? Exemplo http://jsfiddle.net/Lto3xuhe/
CodeSlow
fonte
Quantas listas você procura apoiar?
Máximo de 100. Quais são os limites?
CodeSlow
21
A maneira como um dba conta. Uma pessoa normal conta até dez como "1,2,3,4 ... 10". O programador de CA conta até dez como "0,1,2,3, ... 9". Um dba conta "zero, um, muitos".

Respostas:

66

Há uma piada que ouvi há algum tempo:

P Como um codificador BASIC conta até 10?
A 1,2,3,4,5,6,7,8,9,10

P Como um codificador C conta até 10?
A 0,1,2,3,4,5,6,7,8,9

P Como um DBA conta até 10?
A 0,1, muitos

A verdade por trás dessa piada é que, quando você tem duas (ou mais) da mesma coisa em uma estrutura de banco de dados (colunas ou tabelas), está fazendo algo errado.

Um esquema que se parece com:

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

Está errado, porque onde você colocará um terceiro número de telefone, se alguém o tiver?

O mesmo se aplica às próprias tabelas. Também é uma coisa ruim modificar o esquema no tempo de execução, o que a "nova tabela para cada lista" parece implicar. (Relacionado: MVC4: Como criar modelo em tempo de execução? )

E, assim, a solução é criar uma lista de tarefas composta por duas tabelas. Há duas coisas que você tem - listas e itens.

Então, vamos criar uma estrutura de tabela que reflete isso:

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

A lista possui um ID (a chave primária da lista) e um nome. A tarefa possui um ID (a chave primária), um listid (uma chave estrangeira) e a descrição da tarefa. A chave estrangeira está relacionada à chave primária de outra tabela.

Vou salientar que isso não começa a abranger todas as possibilidades em vários requisitos para o software e a estrutura da tabela para suportá-lo. Conclusão, data de vencimento, repetição, etc ... essas são todas as estruturas adicionais que provavelmente precisarão ser consideradas ao projetar a tabela. Dito isto, se a estrutura da tabela não é aquela que está adequadamente normalizada (ou percebendo as compensações que você fez porque não está normalizada), você terá muitas dores de cabeça mais tarde.


Agora, tudo isso se refere a escrever isso como um banco de dados relacional. Mas esse não é o único tipo de banco de dados disponível. Se você considera uma lista um documento, os bancos de dados nosql com estilo de documento também podem oferecer uma abordagem que não está errada.

Enquanto eu não vou me aprofundar muito nisso, existem inúmeros tutoriais por aí para listas de tarefas no sofá. Um desses que surgiu com uma pesquisa é um aplicativo simples da lista de tarefas no CouchDB . Outro aparece no wiki do couchdb: Esquema proposto para listas de tarefas .

Na abordagem apropriada para um sofá, cada lista é um documento JSON armazenado no banco de dados. Você apenas colocaria a lista em um objeto JSON e a colocaria no banco de dados. E então você lê do banco de dados.

O JSON pode se parecer com:

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

(da criação de uma lista de compras com um arquivo json no Stack Overflow).

Ou algo se aproximando disso. Existem outros registros que o sofá possui como parte do documento.

O problema é que não é a maneira errada de abordar e uma lista de tarefas em um banco de dados de documentos pode ser perfeitamente adequada ao que você está tentando fazer com menos sobrecarga de conceito de como fazê-lo.

Comunidade
fonte
6

A opção 2 é uma configuração tradicional de mestre / detalhes. Provavelmente é isso que você quer aqui. Coloque o ID da lista na tabela de itens e junte-se a ele. O esquema não deve afetar o JSON. Sua consulta pode ser algo como:

select lists.name as list_name, items.name as item_name 
from items 
join lists on (lists.id = items.list_id)
GrandmasterB
fonte
Obtendo este erro: mysqli_fetch_assoc () espera que o parâmetro 1 seja mysqli_result, dado booleano?
CodeSlow
6
@CodeSlow: Isso é um específico, pergunta o código detalhado, pediu mais apropriadamente em stackoverflow.com
FrustratedWithFormsDesigner
3

Eu não tentaria vincular sua representação da interface do usuário ou transmissão de dados à interface do usuário diretamente com a forma como você pretende armazenar os dados. Ao manter os dois separados e ao usar alguma lógica de middleware para se casar, os dois permitem alterar facilmente um dos lados sem afetar o outro de maneira crítica.

De uma perspectiva de armazenamento de dados, você provavelmente usaria a opção 2, que segue o padrão normalizado de dados normalizados, onde partes comuns são fatoradas em suas próprias tabelas para evitar repetições e minimizar o inchaço do banco de dados.

Do ponto de vista da visão, você simplesmente precisa usar uma consulta ao banco de dados para associar os dados pertinentes a um conjunto de resultados, iterar esse resultado e gerar uma resposta json aplicável às suas necessidades de interface do usuário. O que você provavelmente deseja fazer é alimentar os dados no JSON para que eles atendam às suas necessidades de interface do usuário da melhor maneira possível, frequentemente eliminando a necessidade de lógica de script adicional em suas páginas da web.

Naros
fonte
É exatamente isso que preciso fazer, mas não faço ideia de como fazê-lo. Você tem algum exemplo de material que eu possa dar uma olhada / seguir? Obrigado - Gerando JSON em PHP
CodeSlow