สกีมาฐานข้อมูลสำหรับรายการสิ่งที่ต้องทำ


15

ฉันกำลังพยายามสร้างแอพพลิเคชั่นรายการสิ่งที่ต้องทำง่ายๆด้วย PHP, MySQL, Jquery templating และ JSON ... อย่างไรก็ตามโครงสร้างของฉันดูเหมือนจะซับซ้อนกว่าใน JSON

วิธีที่ดีที่สุดที่จะทำคืออะไร?

  1. ตารางใหม่สำหรับแต่ละรายการที่มีรายการ

หรือ

  1. ตารางสำหรับรายการและตารางสำหรับรายการที่เข้าร่วมอย่างใด เพราะฉันได้ลองสิ่งนี้แล้วและดูเหมือนว่ามันจะไม่ถูกใช่มั้ย ตัวอย่างhttp://jsfiddle.net/Lto3xuhe/

คุณจะสนับสนุนรายการกี่รายการ?

สูงสุด 100 ข้อ จำกัด คืออะไร?
CodeSlow

21
วิธีการนับ dba บุคคลทั่วไปนับถึงสิบเป็น "1,2,3,4 ... 10" โปรแกรมเมอร์ AC นับเป็นสิบ "0,1,2,3, ... 9" DBA นับว่า "ศูนย์หนึ่งจำนวนมาก"

คำตอบ:


66

มีเรื่องตลกที่ฉันได้ยินมาครู่หนึ่ง:

ถาม BASIC coder นับเป็น 10 ได้อย่างไร
A 1,2,3,4,5,6,7,8,9,10

ถาม C coder นับเป็น 10 ได้อย่างไร 0,1,2,3,4,5,6,7,8,9

ถาม DBA นับเป็น 10 ได้อย่างไร 0,1 หลาย

ความจริงที่อยู่เบื้องหลังเรื่องตลกนี้ก็คือเมื่อคุณมีสองสิ่ง (หรือมากกว่า) ในสิ่งเดียวกันในโครงสร้างฐานข้อมูล (คอลัมน์หรือตาราง) คุณจะทำผิด

สคีมาที่ดูเหมือนว่า:

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

เป็นเพราะคุณจะใส่หมายเลขโทรศัพท์ที่สามถ้าใครมี

เช่นเดียวกับตารางตัวเอง นอกจากนี้ยังเป็นสิ่งที่ไม่ดีที่จะแก้ไขสคีมาที่รันไทม์ซึ่งดูเหมือนว่า "ตารางใหม่สำหรับแต่ละรายการ" (ที่เกี่ยวข้อง: MVC4: วิธีสร้างโมเดลในขณะใช้งาน )

และวิธีการแก้ปัญหาคือการสร้างรายการสิ่งที่ต้องทำที่ประกอบด้วยสองตาราง คุณมีสองสิ่ง - รายการและรายการ

ดังนั้นให้สร้างโครงสร้างตารางที่สะท้อนถึงสิ่งนี้:

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

รายการมีรหัส (คีย์หลักสำหรับรายการ) และชื่อ งานมี id (คีย์หลัก) listid (foreign key) และคำอธิบายของงาน foreign key เกี่ยวข้องกับคีย์หลักของตารางอื่น

ฉันจะชี้ให้เห็นว่าสิ่งนี้ไม่ได้เริ่มรวมความเป็นไปได้ทั้งหมดในข้อกำหนดต่าง ๆ สำหรับซอฟต์แวร์และโครงสร้างตารางเพื่อรองรับ เสร็จสมบูรณ์วันที่ครบกำหนดทำซ้ำ ฯลฯ ... นี่คือโครงสร้างเพิ่มเติมทั้งหมดที่อาจต้องพิจารณาเมื่อออกแบบตาราง ที่กล่าวว่าหากโครงสร้างของตารางไม่ใช่โครงสร้างที่ทำให้เป็นมาตรฐานอย่างเหมาะสม (หรือตระหนักถึงการแลกเปลี่ยนที่คุณทำเพราะไม่ได้ทำให้เป็นมาตรฐาน) คุณจะมีอาการปวดหัวจำนวนมากในภายหลัง


ตอนนี้สิ่งที่เกี่ยวข้องกับการเขียนสิ่งนี้เป็นฐานข้อมูลเชิงสัมพันธ์ แต่นั่นไม่ใช่ฐานข้อมูลประเภทเดียวเท่านั้น หากคุณพิจารณาว่ารายการเป็นเอกสารฐานข้อมูลสไตล์ nosql ของเอกสารอาจเสนอวิธีการที่ไม่ผิด

ในขณะที่ฉันจะไม่เจาะลึกเกินไปมีบทเรียนมากมายสำหรับการทำรายการสิ่งที่ต้องทำบนโซฟา หนึ่งดังกล่าวที่มากับการค้นหาคือการประยุกต์ใช้งานรายการที่เรียบง่ายใน CouchDB แสดงให้เห็นอีกในวิกิพีเดีย CouchDB นี้เสนอรายการ Schema สำหรับสิ่งที่ต้องทำ

ในแนวทางที่เหมาะสมสำหรับที่นอนแต่ละรายการจะเป็นเอกสาร 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บน Stack 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

ฉันจะไม่พยายามผูก UI หรือการส่งข้อมูลของคุณไปยัง UI โดยตรงกับวิธีที่คุณตั้งใจจะจัดเก็บข้อมูล ด้วยการแยกทั้งสองอย่างออกจากกันและใช้ตรรกะมิดเดิลแวร์บางตัวในการแต่งงานทั้งสองช่วยให้คุณสามารถเปลี่ยนแปลงด้านใดด้านหนึ่งได้อย่างง่ายดาย

จากมุมมองการจัดเก็บข้อมูลคุณอาจใช้ตัวเลือกที่ 2 ซึ่งเป็นไปตามรูปแบบข้อมูลปกติทั่วไปที่มีการแยกส่วนทั่วไปออกเป็นตารางของตัวเองเพื่อหลีกเลี่ยงการซ้ำซ้อนและเพื่อลดการขยายฐานข้อมูล

จากมุมมองของมุมมองคุณเพียงแค่ต้องใช้แบบสอบถามฐานข้อมูลเพื่อเข้าร่วมข้อมูลที่เกี่ยวข้องลงในชุดผลลัพธ์จากนั้นทำซ้ำผลลัพธ์นั้นและสร้างการตอบสนองแบบ json ที่ตรงกับความต้องการของ UI ของคุณ สิ่งที่คุณต้องการทำคือป้อนข้อมูลลงใน JSON เพื่อให้เหมาะกับ UI ที่คุณต้องการที่สุดเท่าที่จะเป็นไปได้บ่อยครั้งที่ไม่จำเป็นต้องใช้ตรรกะของสคริปต์เพิ่มเติมในหน้าเว็บของคุณ


ตรงนี้เป็นสิ่งที่ฉันต้องทำ แต่ไม่รู้จะทำอย่างไร คุณมีเนื้อหาตัวอย่างที่ฉันสามารถดู / ติดตามได้หรือไม่? ขอบคุณ - การสร้าง JSON ใน PHP
CodeSlow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.