1.1 บทนำ

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

นี่คืองานที่นักพัฒนามักจะเผชิญเมื่อออกแบบฐานข้อมูล:

  1. ตรวจสอบให้แน่ใจว่าข้อมูลที่จำเป็นทั้งหมดถูกจัดเก็บไว้ในฐานข้อมูล
  2. ทำให้มั่นใจได้ถึงความเป็นไปได้ในการรับข้อมูลตามคำขอที่จำเป็นทั้งหมด
  3. ลดความซ้ำซ้อนและความซ้ำซ้อนของข้อมูล
  4. รับประกันความสมบูรณ์ของฐานข้อมูล
  5. การเพิ่มประสิทธิภาพความเร็วในการเข้าถึงข้อมูล

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

  1. โครงสร้างต้องดีพอ
  2. ต้องมีตรรกะในทุกสิ่งที่คนอื่นสามารถเข้าใจได้
  3. การเพิ่มประสิทธิภาพก่อนเวลาอันควรเป็นรากเหง้าของความชั่วร้ายทั้งหมด

คุณไม่จำเป็นต้องสร้างโครงสร้างฐานข้อมูลที่ดีที่สุดในโลก เธอจะยังเปลี่ยนไป งานของคุณคือทำให้แน่ใจว่าหลังจากการเปลี่ยนแปลงโครงสร้างของฐานข้อมูลของคุณ 20 ครั้ง คุณจะเข้าใจได้ง่าย

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

อย่าปรับฐานข้อมูลให้เหมาะสมจนกว่าจะจำเป็น หากตารางมีเพียงไม่กี่ร้อยแถว เป็นไปได้มากว่า DBMS จะเก็บไว้ในหน่วยความจำและแคชในการค้นหา

ในทางกลับกัน คุณควรจะสามารถเพิ่มความเร็วให้กับงานของคำขอที่สำคัญได้หลายสิบหรือหลายร้อยเท่า และคงจะดีไม่น้อยหากรู้วิธีทำ เขาพูดกันยังไงตอนมัธยมปีแรก? "ลืมทุกสิ่งที่คุณเคยสอนมาในโรงเรียน..."

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

1.2 การออกแบบห้องสมุด

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

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

ตอนนี้สามารถแยกแยะเอนทิตีและความสัมพันธ์ของฐานข้อมูลในอนาคตได้แล้ว:

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

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

เมื่อเลือกวรรณกรรม ผู้ใช้จะดูรายการวรรณกรรมที่มีความสามารถในการกรองผลการค้นหาตามผู้แต่ง ชื่อเรื่อง ปีที่พิมพ์

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

หน่วยงานหลักต่อไปนี้ของสาขาวิชาสามารถแยกแยะได้:

  • ผู้ใช้ (บรรณารักษ์และผู้ดูแลระบบ);
  • ผู้อ่าน;
  • ห้องอ่านหนังสือ;
  • หนังสือ;
  • บัตรออกหนังสือ
  • จองบัตรจอง.

แผนภาพ ER ที่แก้ไขแล้วของฐานข้อมูลจะแสดงในรูป

ตามกรณีการใช้งานที่แสดงในรูปที่ 1 ฐานข้อมูลควรใช้แบบสอบถามต่อไปนี้ (ไม่ใช่รายการที่ครบถ้วนสมบูรณ์):

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

1.3 การสร้างสคีมา

เพื่อสร้างสคีมาข้อมูล ก่อนอื่นคุณต้องเสริมไดอะแกรม ER ด้วยรายละเอียดของเอนทิตี (ปรับแต่ง) บางครั้งในขณะเดียวกันก็เป็นไปได้ที่จะพบข้อผิดพลาดในการสร้างไดอะแกรม ER - ในงานนี้พบว่าหนังสือจำเป็นต้องเชื่อมต่อกับห้องโถงของห้องสมุด "อย่างใด"

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

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

ในกรณีนี้ ในแผนภาพต่อไปนี้:

  • สำหรับลิงก์ ใช้สัญกรณ์ของ Martin (ใช้ "ตีนกา");
  • ตารางจะแสดงเป็นรูปสี่เหลี่ยมผืนผ้า แบ่งออกเป็น 3 ส่วน:
    • ชื่อตาราง;
    • ปุ่มภายใน (ทำเครื่องหมายด้วยเครื่องหมาย);
    • ฟิลด์ที่เหลือในขณะที่ฟิลด์บังคับจะถูกทำเครื่องหมายด้วยเครื่องหมาย

เมื่อพัฒนาโมเดลนี้มีความปรารถนาที่จะเข้าร่วมตารางผู้ดูแลระบบกับตารางบรรณารักษ์ - เพิ่มตารางผู้ใช้อย่างไรก็ตาม:

  • ผู้ดูแลระบบไม่ได้เชื่อมโยงกับห้องใดห้องหนึ่ง (คุณจะต้องกรอกข้อมูลในฟิลด์ที่เกี่ยวข้องด้วยค่า Null)
  • สิ่งนี้อาจทำให้การกระจายสิทธิ์การเข้าถึงซับซ้อนขึ้น - ตอนนี้มีเพียงผู้ดูแลระบบฐานข้อมูล (ซึ่งทำงานผ่านแผง DBMS พิเศษและไม่มีบัญชีในระบบที่กำลังพัฒนา) เท่านั้นที่มีสิทธิ์เข้าถึงตารางผู้ดูแลระบบ อย่างไรก็ตาม เมื่อเข้าร่วมตาราง ข้อความค้นหาของผู้ใช้จะต้องเข้าถึงตารางใหม่

เมื่อสร้างไดอะแกรมนี้ พบข้อบกพร่องในไดอะแกรม ER และแก้ไข - มีการเพิ่มตารางlibrarians_roomsที่รวมบรรณารักษ์และห้องโถง เข้าด้วยกัน สิ่งนี้จำเป็นเนื่องจากบรรณารักษ์หนึ่งคนสามารถทำงานได้หลายห้อง แต่บรรณารักษ์หลายคนสามารถทำงานในห้องเดียวกันได้

เมื่อออกแบบฐานข้อมูล คุณควรจะสามารถให้เหตุผลได้อย่างน้อยเหมือนกับตัวอย่างข้างต้น หากคุณคิดว่าคุณทำสำเร็จแล้ว ไปต่อ: ทฤษฎีที่มากขึ้น