1.1 บทนำ
การออกแบบฐานข้อมูลค่อนข้างคล้ายกับการออกแบบสถาปัตยกรรมของโปรเจ็กต์ Java คุณสามารถใส่ข้อมูลทั้งหมดลงในตารางสองสามตาราง หรือคุณสามารถสร้างโครงสร้างข้อมูลที่สวยงามจากสคีมาและตารางหลายสิบตาราง
นี่คืองานที่นักพัฒนามักจะเผชิญเมื่อออกแบบฐานข้อมูล:
- ตรวจสอบให้แน่ใจว่าข้อมูลที่จำเป็นทั้งหมดถูกจัดเก็บไว้ในฐานข้อมูล
- ทำให้มั่นใจได้ถึงความเป็นไปได้ในการรับข้อมูลตามคำขอที่จำเป็นทั้งหมด
- ลดความซ้ำซ้อนและความซ้ำซ้อนของข้อมูล
- รับประกันความสมบูรณ์ของฐานข้อมูล
- การเพิ่มประสิทธิภาพความเร็วในการเข้าถึงข้อมูล
สิ่งสำคัญที่ต้องจำไว้คือ คุณไม่สามารถสร้างโครงสร้างฐานข้อมูลในอุดมคติได้ เพราะ เช่นเดียวกับรหัสของคุณ ก็จะเปลี่ยนแปลงตลอดเวลาเช่นกัน มีสามสิ่งที่คุณควรคำนึงถึงเมื่อออกแบบโครงสร้างฐานข้อมูลของคุณ:
- โครงสร้างต้องดีพอ
- ต้องมีตรรกะในทุกสิ่งที่คนอื่นสามารถเข้าใจได้
- การเพิ่มประสิทธิภาพก่อนเวลาอันควรเป็นรากเหง้าของความชั่วร้ายทั้งหมด
คุณไม่จำเป็นต้องสร้างโครงสร้างฐานข้อมูลที่ดีที่สุดในโลก เธอจะยังเปลี่ยนไป งานของคุณคือทำให้แน่ใจว่าหลังจากการเปลี่ยนแปลงโครงสร้างของฐานข้อมูลของคุณ 20 ครั้ง คุณจะเข้าใจได้ง่าย
เป็นไปได้มากว่าในปีแรก ๆ ของการทำงานของคุณจะไม่มีใครไว้วางใจให้คุณออกแบบฐานตั้งแต่เริ่มต้น คุณจะทำการเปลี่ยนแปลงกับสคีมาที่มีอยู่ คุณต้องพยายามทำความเข้าใจตามหลักการที่จัดไว้และปฏิบัติตามหลักการ เหล่านั้น ด้วยกฎบัตรของพวกเขา พวกเขาจะไม่ปีนเข้าไปในอารามของคนอื่น
อย่าปรับฐานข้อมูลให้เหมาะสมจนกว่าจะจำเป็น หากตารางมีเพียงไม่กี่ร้อยแถว เป็นไปได้มากว่า DBMS จะเก็บไว้ในหน่วยความจำและแคชในการค้นหา
ในทางกลับกัน คุณควรจะสามารถเพิ่มความเร็วให้กับงานของคำขอที่สำคัญได้หลายสิบหรือหลายร้อยเท่า และคงจะดีไม่น้อยหากรู้วิธีทำ เขาพูดกันยังไงตอนมัธยมปีแรก? "ลืมทุกสิ่งที่คุณเคยสอนมาในโรงเรียน..."
หากคุณรู้ว่าการทำให้ฐานข้อมูลเป็นมาตรฐานคืออะไร ฉันจะรีบทำให้คุณพอใจ ในงานของคุณ คุณมักจะจัดการกับการทำให้เป็นปกติ . ไม่มีอะไรสำคัญสำหรับเขตรักษาพันธุ์ของโครงการมากไปกว่าความเร็วของฐานข้อมูล และถ้าเพื่อเพิ่มความเร็วในการเลือกข้อมูลจากฐานข้อมูลคุณต้องรวม 200 (!) ตารางเป็นหนึ่งเดียว (ด้วยความซ้ำซ้อนที่น่ากลัว) คุณจะต้องทำสิ่งนี้
1.2 การออกแบบห้องสมุด
เรามาเจาะลึกหัวข้อนี้กันสักหน่อยแล้วคิดเกี่ยวกับการออกแบบฐานข้อมูลโดยใช้สิ่งที่เรียบง่ายเหมือนห้องสมุดหนังสือทั่วไป
งานหลักของห้องสมุดใด ๆ คือการประมวลผลของกองทุนหนังสือ เป็นการง่ายที่จะจำแนกผู้ใช้ระบบสามกลุ่มหลัก: ผู้อ่าน บรรณารักษ์ ผู้ดูแลระบบ กิจกรรมของแต่ละรายการแสดงในแผนภาพกรณีการใช้งาน
![](https://cdn.codegym.cc/images/article/ce739b07-800a-4e3c-a436-b40d3c54ea1d/512.jpeg)
ตอนนี้สามารถแยกแยะเอนทิตีและความสัมพันธ์ของฐานข้อมูลในอนาคตได้แล้ว:
![](https://cdn.codegym.cc/images/article/b7373320-28d3-4fd8-9b62-a75c6102299f/1024.jpeg)
ด้วยวิธีนี้ยังไม่ชัดเจนว่าจะเชื่อมโยงผู้อ่านกับหนังสือได้อย่างไร (ผู้อ่านไม่มีความกระตือรือร้นในความสัมพันธ์ "การออก / การรับ" หากหนังสือมีหลายเล่มก็สามารถออกให้กับผู้อ่านหลายคนได้ หากเข้าใจหนังสือเป็นสำเนาเดียว เมื่อบันทึกไว้ในตารางหนังสือของผู้อ่านปัจจุบัน จะไม่สามารถรับข้อมูลว่าใคร (และกี่ครั้ง) ที่หยิบหนังสือเล่มนี้ไปก่อนหน้านี้
วิธีแก้ปัญหาอาจเป็นการแนะนำนิติบุคคลเพิ่มเติม - บัตรสำหรับออกหนังสือ เมื่อหนังสือออกให้กับผู้อ่าน การ์ดจะถูกสร้างขึ้นและเมื่อหนังสือถูกส่งมอบ จะมีการทำเครื่องหมายที่เกี่ยวข้องไว้บนหนังสือ ด้วยความช่วยเหลือของการ์ดเหล่านี้ หนี้ของผู้ใช้แต่ละคนจะถูกกำหนดและคำนวณสถิติเกี่ยวกับการใช้หนังสือ เมื่อผู้อ่านจองวรรณกรรม บัตรจะเริ่มทำงานด้วย หากผู้อ่านไม่ได้รับหนังสือที่จองไว้ภายในระยะเวลาหนึ่ง การ์ดจะถูกทำลาย มีการจำกัดจำนวนหนังสือที่ผู้อ่านสามารถจองได้
เมื่อเลือกวรรณกรรม ผู้ใช้จะดูรายการวรรณกรรมที่มีความสามารถในการกรองผลการค้นหาตามผู้แต่ง ชื่อเรื่อง ปีที่พิมพ์
เป็นไปได้ที่จะคำนวณสถิติสำหรับหนังสือทุกเล่มในห้องสมุด ในขณะที่จำนวนเล่มที่ออกของหนังสือในช่วงเวลาที่กำหนด คุณยังสามารถกำหนดจำนวนขั้นต่ำของอินสแตนซ์หนังสือที่จะทำการคำนวณ จากสถิติเหล่านี้ หนังสือที่ไม่ได้ใช้จะถูกตัดออกจากห้องสมุด
หน่วยงานหลักต่อไปนี้ของสาขาวิชาสามารถแยกแยะได้:
- ผู้ใช้ (บรรณารักษ์และผู้ดูแลระบบ);
- ผู้อ่าน;
- ห้องอ่านหนังสือ;
- หนังสือ;
- บัตรออกหนังสือ
- จองบัตรจอง.
แผนภาพ ER ที่แก้ไขแล้วของฐานข้อมูลจะแสดงในรูป
![](https://cdn.codegym.cc/images/article/af26b62d-dd9e-4713-be71-3f4fc10c5379/1024.jpeg)
ตามกรณีการใช้งานที่แสดงในรูปที่ 1 ฐานข้อมูลควรใช้แบบสอบถามต่อไปนี้ (ไม่ใช่รายการที่ครบถ้วนสมบูรณ์):
- แสดงหนังสือที่ตรงตามเงื่อนไขที่กำหนด
- แสดงผู้ใช้ที่มีบัตรสำหรับออกหนังสือที่ไม่ได้ปิดตรงเวลา (บรรณารักษ์กำลังมองหาลูกหนี้)
- แสดงหนังสือทั้งหมดที่ตรงกับบัตรยืมหนังสือของผู้ใช้ที่กำหนดซึ่งไม่ได้ปิดทันเวลา (ผู้ใช้มาที่ห้องสมุดเพื่อหาหนังสือเล่มใหม่ - คุณต้องดูว่าเขาเป็นลูกหนี้หรือไม่และแจ้งให้เขาทราบ)
- ลบบัตรการจองทั้งหมดที่สร้างขึ้นนานกว่า N วินาทีที่แล้ว
- แสดงหนังสือทั้งหมดที่สอดคล้องกับบัตรจองหนังสือที่ไม่ได้ปิดของผู้ใช้ที่ระบุ (ผู้อ่านสั่งหนังสือและมาที่ห้องสมุดสำหรับพวกเขา - บรรณารักษ์จำเป็นต้องได้รับรายชื่อนี้เพื่อมอบให้)
1.3 การสร้างสคีมา
เพื่อสร้างสคีมาข้อมูล ก่อนอื่นคุณต้องเสริมไดอะแกรม ER ด้วยรายละเอียดของเอนทิตี (ปรับแต่ง) บางครั้งในขณะเดียวกันก็เป็นไปได้ที่จะพบข้อผิดพลาดในการสร้างไดอะแกรม ER - ในงานนี้พบว่าหนังสือจำเป็นต้องเชื่อมต่อกับห้องโถงของห้องสมุด "อย่างใด"
ซึ่งสามารถทำได้โดยการวาง "หมายเลขห้องโถง" ที่จำเป็นในหนังสือ อย่างไรก็ตาม ด้วยวิธีนี้ หนังสือเล่มเดียวกันจะต้องได้รับการอธิบายในฐานข้อมูลหลายครั้ง (หากเกิดขึ้นในห้องโถงที่แตกต่างกัน) แนวทางที่ถูกต้องกว่าคือการแนะนำเอนทิตีเพิ่มเติม "ตำแหน่งหนังสือ" รูปภาพแสดงไดอะแกรม ER พร้อมเอนทิตีและอุปกรณ์ประกอบที่เพิ่มเข้ามา
![](https://cdn.codegym.cc/images/article/e0d1296a-18db-464c-88ac-c6f6a33c661b/1024.jpeg)
ไดอะแกรม ER ด้านบนสะท้อนถึงตารางหลัก ความสัมพันธ์ และแอตทริบิวต์ คุณสามารถสร้างแบบจำลองฐานข้อมูลได้ ไม่มีมาตรฐานสำหรับไดอะแกรม ER แต่มีสัญลักษณ์จำนวนหนึ่ง (Chen, IDEFIX, Martin ฯลฯ) แต่ไม่พบทั้งมาตรฐานและสัญลักษณ์สำหรับแบบจำลองโดเมน อย่างไรก็ตาม ในระหว่างการสร้างไดอะแกรมดังกล่าว จำเป็นต้องเน้นฟิลด์สำคัญ (ภายนอกและภายใน) ซึ่งบางครั้งอาจเป็นดัชนีและประเภทข้อมูล
ในกรณีนี้ ในแผนภาพต่อไปนี้:
- สำหรับลิงก์ ใช้สัญกรณ์ของ Martin (ใช้ "ตีนกา");
- ตารางจะแสดงเป็นรูปสี่เหลี่ยมผืนผ้า แบ่งออกเป็น 3 ส่วน:
- ชื่อตาราง;
- ปุ่มภายใน (ทำเครื่องหมายด้วยเครื่องหมาย);
- ฟิลด์ที่เหลือในขณะที่ฟิลด์บังคับจะถูกทำเครื่องหมายด้วยเครื่องหมาย
เมื่อพัฒนาโมเดลนี้มีความปรารถนาที่จะเข้าร่วมตารางผู้ดูแลระบบกับตารางบรรณารักษ์ - เพิ่มตารางผู้ใช้อย่างไรก็ตาม:
- ผู้ดูแลระบบไม่ได้เชื่อมโยงกับห้องใดห้องหนึ่ง (คุณจะต้องกรอกข้อมูลในฟิลด์ที่เกี่ยวข้องด้วยค่า Null)
- สิ่งนี้อาจทำให้การกระจายสิทธิ์การเข้าถึงซับซ้อนขึ้น - ตอนนี้มีเพียงผู้ดูแลระบบฐานข้อมูล (ซึ่งทำงานผ่านแผง DBMS พิเศษและไม่มีบัญชีในระบบที่กำลังพัฒนา) เท่านั้นที่มีสิทธิ์เข้าถึงตารางผู้ดูแลระบบ อย่างไรก็ตาม เมื่อเข้าร่วมตาราง ข้อความค้นหาของผู้ใช้จะต้องเข้าถึงตารางใหม่
เมื่อสร้างไดอะแกรมนี้ พบข้อบกพร่องในไดอะแกรม ER และแก้ไข - มีการเพิ่มตารางlibrarians_rooms
ที่รวมบรรณารักษ์และห้องโถง เข้าด้วยกัน สิ่งนี้จำเป็นเนื่องจากบรรณารักษ์หนึ่งคนสามารถทำงานได้หลายห้อง แต่บรรณารักษ์หลายคนสามารถทำงานในห้องเดียวกันได้
เมื่อออกแบบฐานข้อมูล คุณควรจะสามารถให้เหตุผลได้อย่างน้อยเหมือนกับตัวอย่างข้างต้น หากคุณคิดว่าคุณทำสำเร็จแล้ว ไปต่อ: ทฤษฎีที่มากขึ้น