Схема бази даних для списку ToDo


15

Я намагаюся зробити дуже просту програму для списку todo з PHP, MySQL, Jquery templating та JSON ... Однак моя схема, схоже, ускладнює речі в JSON.

Який найкращий спосіб це зробити?

  1. Нова таблиця для кожного списку, що містить елементи.

або

  1. таблиця для списків і таблиця для предметів, які якимось чином з'єднані? Тому що я спробував це, і це не здається правильним способом зробити це? Приклад http://jsfiddle.net/Lto3xuhe/

Скільки списків ви будете шукати для підтримки?

Максимум 100. Які межі?
CodeSlow

21
Те, як вважає dba. Нормальна людина вважає до десяти як "1,2,3,4 ... 10". Програміст змінного струму рахує до десяти як "0,1,2,3, ... 9". ДБА вважає "нуль, один, багато".

Відповіді:


66

Я почув деякий час жарт:

Q Як базовий кодер рахує 10? 1,2,3,4,5,6,7,8,9,10

Q Як C-кодер рахується до 10?
А 0,1,2,3,4,5,6,7,8,9

Q Як рахується DBA до 10?
А 0,1, багато

Правда цього жарту полягає в тому, що раз у вас є дві (або більше) однієї і тієї ж речі в структурі бази даних (стовпці або таблиці), ви робите це неправильно.

Схема, яка виглядає так:

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

Це неправильно, тому що куди ви поставите третій номер телефону, якщо хтось має його?

Те саме стосується самих таблиць. Також погана річ - це зміна схеми під час виконання, на що, мабуть, має на увазі "нова таблиця для кожного списку". (Пов'язано: MVC4: Як створити модель під час виконання? )

Таким чином, рішення полягає у створенні списку todo, який складається з двох таблиць. У вас є дві речі - списки та предмети.

Отже, давайте складемо структуру таблиці, яка відображає це:

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

У списку є ідентифікатор (первинний ключ для списку) та ім’я. У завданні є ідентифікатор (первинний ключ), листd (зовнішній ключ) та опис завдання. Зовнішній ключ відноситься до первинного ключа іншої таблиці.

Я зазначу, що це не починає охоплювати всі можливості різних вимог до програмного забезпечення та структури таблиці для його підтримки. Завершено, термін, повторення тощо ... це все додаткові структури, які, ймовірно, потрібно враховувати при розробці таблиці. Однак, якщо структура таблиці не буде належним чином нормалізована (або реалізуються компроміси, які ви зробили, тому що вона не нормалізується), пізніше у вас буде багато головних болів.


Тепер все, що стосується написання цього як реляційної бази даних. Але це не єдиний тип баз даних там. Якщо ви вважаєте список документом, то в базі даних noql, стилізованих до документа, також може бути запропонований підхід, який не є помилковим.

Поки я не збираюсь занадто довго заглиблюватися в нього, там є численні підручники для списків тодо на дивані. Одним із таких, які придумали пошук, є проста програма із списком завдань у CouchDB . Ще один показ у вікі couchdb: Пропонована схема списків справ .

У підході, придатному для дивана, кожен список є документом JSON, що зберігається в базі даних. Ви просто помістіть список в об'єкт JSON і помістіть його в базу даних. А потім ви читаєте з бази даних.

JSON може виглядати так:

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

(зі створення списку покупок із файлом json у стеку Overflow).

Або щось наближається до цього. Існує деякий інший облік, що цей диван є частиною документа.

Вся справа в тому, що його невірний спосіб наблизитись, і список тодо в базі даних документів може бути ідеально підходить до того, що ви намагаєтеся зробити з меншими накладними витратами на концепцію, як це зробити.


6

Варіант 2 - це традиційна настройка майстра / деталей. Це, мабуть, те, що ви хочете тут. Помістіть ідентифікатор списку в таблицю елементів і приєднайтеся до цього. Схема не повинна впливати на JSON. Ваш запит може виглядати приблизно так:

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

Отримання помилки: mysqli_fetch_assoc () очікує, що параметр 1 буде mysqli_result, задано булеве значення?
CodeSlow

6
@CodeSlow: Це специфічне детальне запитання щодо коду, більш доречне запитання на stackoverflow.com
FrustratedWithFormsDesigner

3

Я б не намагався безпосередньо пов'язати ваше представлення з інтерфейсом або передачу даних в інтерфейс безпосередньо з тим, як ви збираєтесь зберігати дані. Зберігаючи два окремих і використовуючи певну логіку програмного забезпечення для одруження, ви можете легко змінити будь-яку сторону, не впливаючи на іншу критично.

З точки зору зберігання даних, ви, ймовірно, будете використовувати варіант 2, який дотримується типової нормованої моделі даних, коли загальні частини передаються у власні таблиці, щоб уникнути повторення та мінімізувати розширення бази даних.

З точки зору перегляду, вам просто потрібно використовувати запит до бази даних, щоб приєднати відповідні дані до набору результатів, а потім повторити цей результат і генерувати відповідь json, застосовну до ваших потреб користувальницького інтерфейсу. Можливо, ви хочете зробити це ввести дані в JSON, щоб вони максимально відповідали вашим потребам інтерфейсу, часто усуваючи необхідність додаткової логіки сценаріїв на ваших веб-сторінках.


Це саме те, що мені потрібно зробити, але не маю уявлення, як це робити. Чи є у вас який-небудь прикладний матеріал, який я можу переглянути / слідкувати? Спасибі - Створення JSON у PHP
CodeSlow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.