Lược đồ cơ sở dữ liệu cho danh sách ToDo


15

Tôi đang cố gắng tạo một ứng dụng danh sách việc cần làm rất đơn giản với PHP, MySQL, Jquery templating và JSON ... Tuy nhiên, lược đồ của tôi dường như làm phức tạp mọi thứ trong JSON.

Cách tốt nhất để làm điều đó là gì?

  1. Một bảng mới cho mỗi danh sách, chứa các mục.

hoặc là

  1. một bảng cho danh sách, và một bảng cho các mục được tham gia bằng cách nào đó? Bởi vì tôi đã thử điều này và nó dường như không phải là cách đúng đắn để làm điều đó? Ví dụ http://jsfiddle.net/Lto3xuhe/

Có bao nhiêu danh sách bạn sẽ tìm kiếm để hỗ trợ?

Tối đa 100. các giới hạn là gì?
CodeSlow

21
Cách một dba tính. Một người bình thường được tính đến mười là "1,2,3,4 ... 10". Lập trình viên AC tính đến mười là "0,1,2,3, ... 9". Một dba tính "không, một, nhiều."

Câu trả lời:


66

Có một trò đùa tôi nghe được một lúc:

Q Làm thế nào để một lập trình viên BASIC đếm đến 10?
Một 1,2,3,4,5,6,7,8,9,10

Q Làm thế nào để một lập trình viên C đếm đến 10?
A 0,1,2,3,4,5,6,7,8,9

Q Làm thế nào để một DBA đếm đến 10?
A 0,1, nhiều

Sự thật đằng sau trò đùa này là một khi bạn có hai (hoặc nhiều hơn) cùng một thứ trong cấu trúc cơ sở dữ liệu (cột hoặc bảng), bạn đã làm sai.

Một lược đồ trông giống như:

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

Có sai không vì bạn sẽ đặt số điện thoại thứ ba ở đâu nếu ai đó có nó?

Điều tương tự cũng áp dụng cho các bảng. Đây cũng là một điều xấu khi sửa đổi lược đồ trong thời gian chạy, mà "bảng mới cho mỗi danh sách" dường như ngụ ý. (Liên quan: MVC4: Làm thế nào để tạo mô hình trong thời gian chạy? )

Và do đó, giải pháp là tạo một danh sách việc cần làm bao gồm hai bảng. Có hai thứ bạn có - danh sách và vật phẩm.

Vì vậy, hãy tạo một cấu trúc bảng phản ánh điều này:

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

Danh sách này có id (khóa chính cho danh sách) và tên. Tác vụ có id (khóa chính) listid (khóa ngoại) và mô tả nhiệm vụ. Khóa ngoại liên quan đến khóa chính của bảng khác.

Tôi sẽ chỉ ra rằng điều này không bắt đầu bao gồm tất cả các khả năng trong các yêu cầu khác nhau đối với phần mềm và cấu trúc bảng để hỗ trợ nó. Đã hoàn thành, ngày đáo hạn, lặp lại, v.v ... đây là tất cả các cấu trúc bổ sung có thể sẽ cần được xem xét khi thiết kế bảng. Điều đó nói rằng, nếu cấu trúc bảng không phải là cấu trúc được chuẩn hóa một cách thích hợp (hoặc nhận ra sự đánh đổi mà bạn đã thực hiện vì nó không được chuẩn hóa), bạn sẽ gặp nhiều vấn đề đau đầu sau đó.


Bây giờ, tất cả những gì liên quan đến việc viết này như là một cơ sở dữ liệu quan hệ. Nhưng đó không phải là loại cơ sở dữ liệu duy nhất ngoài kia. Nếu bạn coi một danh sách là một tài liệu, cơ sở dữ liệu nosql theo kiểu tài liệu cũng có thể đưa ra một cách tiếp cận không sai.

Trong khi tôi sẽ không đi sâu vào nó quá xa, có rất nhiều hướng dẫn ngoài kia cho các danh sách việc cần làm trong đi văng. Một ứng dụng được tìm thấy là một ứng dụng Danh sách tác vụ đơn giản trong CouchDB . Một cái khác xuất hiện trong wiki couchdb: Lược đồ đề xuất cho danh sách việc cần làm .

Theo cách tiếp cận phù hợp cho một chiếc ghế dài, mỗi danh sách là một tài liệu JSON được lưu trữ trong cơ sở dữ liệu. Bạn chỉ cần đặt danh sách trong một đối tượng JSON và đặt nó vào cơ sở dữ liệu. Và sau đó bạn đọc từ cơ sở dữ liệu.

JSON có thể trông giống như:

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

(từ việc tạo danh sách mua sắm với tệp json trên Stack Overflow).

Hoặc một cái gì đó tiếp cận điều đó. Có một số lưu giữ hồ sơ khác mà chiếc ghế dài là một phần của tài liệu.

Vấn đề là, đây không phải là cách tiếp cận sai và danh sách việc cần làm trong cơ sở dữ liệu tài liệu có thể hoàn toàn phù hợp với những gì bạn đang cố gắng thực hiện với ít chi phí khái niệm về cách thực hiện.


6

Tùy chọn 2 là một thiết lập tổng thể / chi tiết truyền thống. Đó có lẽ là những gì bạn muốn ở đây. Đặt id danh sách trong bảng mục và tham gia vào đó. Lược đồ không nên tác động đến JSON. Truy vấn của bạn có thể trông giống như:

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

Gặp lỗi này: mysqli_fetch_assoc () dự kiến ​​tham số 1 sẽ là mysqli_result, boolean đưa ra?
CodeSlow

6
@CodeSlow: Đó là một câu hỏi mã cụ thể, chi tiết, được hỏi một cách thích hợp hơn trên stackoverflow.com
FrustratedWithFormsDesigner

3

Tôi sẽ không cố gắng liên kết trực tiếp giao diện người dùng hoặc truyền dữ liệu của bạn với giao diện người dùng theo cách bạn dự định lưu trữ dữ liệu. Bằng cách giữ hai người tách biệt và sử dụng một số logic phần mềm trung gian để kết hôn, cả hai cho phép bạn dễ dàng thay đổi một trong hai bên mà không có thể tác động đến bên kia theo một cách quan trọng.

Từ góc độ lưu trữ dữ liệu, bạn có thể sử dụng tùy chọn 2 theo mẫu dữ liệu chuẩn hóa điển hình trong đó các phần chung được đưa vào bảng riêng của chúng để tránh lặp lại và giảm thiểu phình to cơ sở dữ liệu.

Từ góc độ xem, bạn chỉ cần sử dụng truy vấn cơ sở dữ liệu để nối dữ liệu thích hợp vào tập kết quả và sau đó lặp lại kết quả đó và tạo phản hồi json áp dụng cho nhu cầu UI của bạn. Những gì bạn có thể muốn làm là cung cấp dữ liệu vào JSON sao cho phù hợp với nhu cầu UI của bạn nhất có thể, thường loại bỏ nhu cầu logic logic bổ sung trong các trang web của bạn.


Đây chính xác là những gì tôi cần làm, nhưng không biết làm thế nào để làm điều đó. Bạn có tài liệu ví dụ nào tôi có thể xem / theo dõi không? Cảm ơn - Tạo JSON trong PHP
CodeSlow
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.