วัตถุประสงค์ของบทความนี้คือการใช้ตัวอย่างของห้องสมุด
ประการแรกข้อมูลจากบทความนี้จะเป็นประโยชน์สำหรับนักพัฒนาที่ต้องการใช้ประโยชน์สูงสุดจากความสามารถของ PostgreSQL แต่ประสบปัญหาในการรักษาตรรกะทางธุรกิจไว้ในฐานข้อมูล
บทความนี้จะไม่อธิบายข้อดีหรือข้อเสียของการจัดเก็บตรรกะทางธุรกิจในฐานข้อมูล สันนิษฐานว่าผู้อ่านได้เลือกแล้ว
คำถามต่อไปนี้จะได้รับการพิจารณา:
- ดัมพ์โครงสร้างฐานข้อมูลควรจัดเก็บในรูปแบบใดในระบบควบคุมเวอร์ชัน (ต่อไปนี้จะเรียกว่า VCS)
- วิธีติดตามการเปลี่ยนแปลงในโครงสร้างฐานข้อมูลหลังจากบันทึกดัมพ์
- วิธีถ่ายโอนการเปลี่ยนแปลงในโครงสร้างฐานข้อมูลไปยังสภาพแวดล้อมอื่นโดยไม่มีข้อขัดแย้งและไฟล์การโยกย้ายขนาดยักษ์
- วิธีจัดระเบียบกระบวนการทำงานแบบขนานในโครงการโดยนักพัฒนาหลายคน
- วิธีปรับใช้การเปลี่ยนแปลงเพิ่มเติมในโครงสร้างฐานข้อมูลกับสภาพแวดล้อมการใช้งานจริงอย่างปลอดภัย
SchemaKeeper ออกแบบมาเพื่อทำงานกับขั้นตอนการจัดเก็บที่เขียนด้วยภาษา
PL/pgSQL . ยังไม่มีการทดสอบกับภาษาอื่น ดังนั้น การใช้งานอาจไม่ได้ผลเท่าที่ควรหรืออาจไม่สามารถทำได้
วิธีจัดเก็บดัมพ์โครงสร้างฐานข้อมูลใน VCS
ห้องสมุด saveDump
ซึ่งจะบันทึกโครงสร้างของออบเจ็กต์ทั้งหมดจากฐานข้อมูลเป็นไฟล์ข้อความแยกกัน ผลลัพธ์คือไดเร็กทอรีที่มีโครงสร้างฐานข้อมูล ซึ่งแบ่งออกเป็นไฟล์ที่จัดกลุ่มซึ่งสามารถเพิ่มลงใน VCS ได้อย่างง่ายดาย
ลองดูที่การแปลงวัตถุจากฐานข้อมูลเป็นไฟล์โดยใช้หลายตัวอย่าง:
ประเภทวัตถุ
โครงการนี้
ชื่อ
เส้นทางสัมพันธ์กับไฟล์
ตาราง
สาธารณะ
บัญชี
./public/tables/accounts.txt
ขั้นตอนการเก็บ
สาธารณะ
รับรองความถูกต้อง (แฮชใหญ่)
./public/functions/auth(int8).sql
ความคิด
การจอง
อัตราภาษีศุลกากร
./booking/views/tariffs.txt
เนื้อหาของไฟล์เป็นตัวแทนข้อความของโครงสร้างของวัตถุฐานข้อมูลเฉพาะ ตัวอย่างเช่น สำหรับขั้นตอนการจัดเก็บ เนื้อหาของไฟล์จะเป็นคำจำกัดความที่สมบูรณ์ของขั้นตอนการจัดเก็บ โดยเริ่มจากบล็อก CREATE OR REPLACE FUNCTION
.
ดังที่เห็นได้จากตารางด้านบน เส้นทางไปยังไฟล์จะเก็บข้อมูลเกี่ยวกับประเภท สคีมา และชื่อของออบเจ็กต์ แนวทางนี้ทำให้ง่ายต่อการนำทางผ่านดัมพ์และการตรวจทานโค้ดของการเปลี่ยนแปลงในฐานข้อมูล
นามสกุล
.sql
สำหรับไฟล์ที่มีซอร์สโค้ดของ Stored Procedure จะถูกเลือกเพื่อให้ IDE มีเครื่องมือสำหรับการโต้ตอบกับฐานข้อมูลโดยอัตโนมัติเมื่อเปิดไฟล์
วิธีติดตามการเปลี่ยนแปลงในโครงสร้างฐานข้อมูลหลังจากบันทึกดัมพ์
ด้วยการบันทึกดัมพ์ของโครงสร้างฐานข้อมูลปัจจุบันใน VCS เราจะได้รับโอกาสในการตรวจสอบว่ามีการเปลี่ยนแปลงโครงสร้างฐานข้อมูลหรือไม่หลังจากสร้างดัมพ์แล้ว ในห้องสมุด verifyDump
ซึ่งส่งคืนข้อมูลเกี่ยวกับความแตกต่างโดยไม่มีผลข้างเคียง
อีกวิธีหนึ่งในการตรวจสอบคือการเรียกใช้ฟังก์ชันอีกครั้ง saveDump
ระบุไดเร็กทอรีเดียวกัน และตรวจสอบใน VCS เพื่อดูการเปลี่ยนแปลง เนื่องจากวัตถุทั้งหมดจากฐานข้อมูลถูกบันทึกเป็นไฟล์แยกกัน VCS จะแสดงเฉพาะวัตถุที่เปลี่ยนแปลงเท่านั้น
ข้อเสียเปรียบหลักของวิธีนี้คือจำเป็นต้องเขียนทับไฟล์เพื่อดูการเปลี่ยนแปลง
วิธีถ่ายโอนการเปลี่ยนแปลงในโครงสร้างฐานข้อมูลไปยังสภาพแวดล้อมอื่นโดยไม่มีข้อขัดแย้งและไฟล์การโยกย้ายขนาดยักษ์
ขอบคุณฟังก์ชัน deployDump
ซอร์สโค้ดของขั้นตอนการจัดเก็บสามารถแก้ไขได้ในลักษณะเดียวกับซอร์สโค้ดของแอปพลิเคชันปกติทุกประการ คุณสามารถเพิ่ม/ลบบรรทัดใหม่ในโค้ดขั้นตอนการจัดเก็บและผลักดันการเปลี่ยนแปลงไปยังการควบคุมเวอร์ชันได้ทันที หรือสร้าง/ลบขั้นตอนการจัดเก็บโดยการสร้าง/ลบไฟล์ที่เกี่ยวข้องในไดเร็กทอรีดัมพ์
ตัวอย่างเช่น เมื่อต้องการสร้างขั้นตอนการจัดเก็บใหม่ในสคีมา public
เพียงสร้างไฟล์ใหม่ที่มีนามสกุล .sql
ในไดเรกทอรี public/functions
ให้วางซอร์สโค้ดของโพรซีเดอร์ที่เก็บไว้ไว้ในนั้น รวมถึงบล็อกด้วย CREATE OR REPLACE FUNCTION
แล้วเรียกใช้ฟังก์ชัน deployDump
. การแก้ไขและการลบขั้นตอนการจัดเก็บเกิดขึ้นในลักษณะเดียวกัน ดังนั้นโค้ดจะเข้าสู่ทั้ง VCS และฐานข้อมูลในเวลาเดียวกัน
หากมีข้อผิดพลาดปรากฏในซอร์สโค้ดของขั้นตอนการจัดเก็บใด ๆ หรือความแตกต่างระหว่างชื่อไฟล์และขั้นตอนการจัดเก็บ deployDump
จะล้มเหลวโดยแสดงข้อความแสดงข้อผิดพลาด กระบวนการจัดเก็บที่ไม่ตรงกันระหว่างดัมพ์และฐานข้อมูลปัจจุบันเป็นไปไม่ได้เมื่อใช้งาน deployDump
.
เมื่อสร้างขั้นตอนการจัดเก็บใหม่ ไม่จำเป็นต้องป้อนชื่อไฟล์ที่ถูกต้องด้วยตนเอง ไฟล์ต้องมีนามสกุลก็พอแล้ว
.sql
. หลังจากการโทรdeployDump
ข้อความแสดงข้อผิดพลาดจะมีชื่อที่ถูกต้องซึ่งสามารถใช้เพื่อเปลี่ยนชื่อไฟล์ได้
deployDump
ช่วยให้คุณสามารถเปลี่ยนพารามิเตอร์ของฟังก์ชันหรือประเภทการส่งคืนได้โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม ในขณะที่คุณต้องดำเนินการด้วยวิธีคลาสสิก
ดำเนินการก่อน DROP FUNCTION
และจากนั้นเท่านั้น CREATE OR REPLACE FUNCTION
.
น่าเสียดายที่มีบางสถานการณ์ที่ deployDump
ไม่สามารถใช้การเปลี่ยนแปลงโดยอัตโนมัติได้ ตัวอย่างเช่น หากฟังก์ชันทริกเกอร์ที่ใช้โดยทริกเกอร์อย่างน้อย XNUMX รายการถูกลบออก สถานการณ์ดังกล่าวได้รับการแก้ไขด้วยตนเองโดยใช้ไฟล์การโยกย้าย
หากคุณมีหน้าที่รับผิดชอบในการโยกย้ายการเปลี่ยนแปลงไปยังขั้นตอนการจัดเก็บ
ต้องใช้การย้ายข้อมูลก่อนการเปิดตัว deployDump
. สิ่งนี้ช่วยให้คุณสามารถทำการเปลี่ยนแปลงโครงสร้างทั้งหมดและแก้ไขสถานการณ์ที่มีปัญหา เพื่อให้การเปลี่ยนแปลงในกระบวนงานที่เก็บไว้ถูกถ่ายโอนในภายหลังโดยไม่มีปัญหา
การทำงานกับการย้ายข้อมูลจะมีการอธิบายรายละเอียดเพิ่มเติมในส่วนต่อไปนี้
วิธีจัดระเบียบกระบวนการทำงานแบบขนานในโครงการโดยนักพัฒนาหลายคน
จำเป็นต้องสร้างสคริปต์สำหรับการเริ่มต้นฐานข้อมูลโดยสมบูรณ์ ซึ่งนักพัฒนาจะเปิดตัวบนเครื่องทำงานของเขา โดยนำโครงสร้างของฐานข้อมูลท้องถิ่นให้สอดคล้องกับดัมพ์ที่บันทึกไว้ใน VCS วิธีที่ง่ายที่สุดคือการแบ่งการเริ่มต้นฐานข้อมูลท้องถิ่นออกเป็น 3 ขั้นตอน:
- นำเข้าไฟล์ที่มีโครงสร้างพื้นฐานที่จะเรียกว่าเช่น
base.sql
- การใช้การย้ายข้อมูล
- โทรศัพท์
deployDump
base.sql
เป็นจุดเริ่มต้นนอกเหนือจากการใช้และดำเนินการย้ายข้อมูลdeployDump
นั่นคือbase.sql + миграции + deployDump = актуальная структура БД
. คุณสามารถสร้างไฟล์ดังกล่าวได้โดยใช้ยูทิลิตี้pg_dump
. ใช้แล้วbase.sql
เฉพาะเมื่อเริ่มต้นฐานข้อมูลตั้งแต่เริ่มต้น
มาเรียกสคริปต์เพื่อเตรียมใช้งานฐานข้อมูลให้สมบูรณ์ refresh.sh
. ขั้นตอนการทำงานอาจมีลักษณะดังนี้:
- นักพัฒนาเปิดตัวในสภาพแวดล้อมของเขา
refresh.sh
และรับโครงสร้างฐานข้อมูลปัจจุบัน - นักพัฒนาเริ่มทำงานกับงานที่มีอยู่ โดยแก้ไขฐานข้อมูลในเครื่องเพื่อตอบสนองความต้องการของฟังก์ชันใหม่ (
ALTER TABLE ... ADD COLUMN
ฯลฯ) - หลังจากเสร็จสิ้นภารกิจ นักพัฒนาจะเรียกใช้ฟังก์ชันนี้
saveDump
เพื่อยืนยันการเปลี่ยนแปลงฐานข้อมูลใน VCS - นักพัฒนาเปิดตัวอีกครั้ง
refresh.sh
แล้วก็verifyDump
ซึ่งตอนนี้แสดงรายการการเปลี่ยนแปลงที่จะรวมไว้ในการย้ายข้อมูล - นักพัฒนาถ่ายโอนการเปลี่ยนแปลงโครงสร้างทั้งหมดไปยังไฟล์การโยกย้าย และรันอีกครั้ง
refresh.sh
иverifyDump
และหากการรวบรวมการโยกย้ายถูกต้องverifyDump
จะไม่แสดงความแตกต่างระหว่างฐานข้อมูลในเครื่องและดัมพ์ที่บันทึกไว้
กระบวนการที่อธิบายไว้ข้างต้นเข้ากันได้กับหลักการ gitflow แต่ละสาขาใน VCS จะมีเวอร์ชันของดัมพ์ของตัวเอง และเมื่อรวมสาขา ดัมพ์จะถูกรวมเข้าด้วยกัน ในกรณีส่วนใหญ่ ไม่จำเป็นต้องดำเนินการเพิ่มเติมหลังจากการผสาน แต่หากมีการเปลี่ยนแปลงในสาขาที่แตกต่างกัน เช่น ในตารางเดียวกัน อาจเกิดข้อขัดแย้งได้
ลองพิจารณาสถานการณ์ความขัดแย้งโดยใช้ตัวอย่าง: มีสาขาอยู่ พัฒนาซึ่งมี XNUMX สาขา ดังนี้ feature1 и feature2ซึ่งไม่มีความขัดแย้งกับ พัฒนาแต่มีความขัดแย้งกัน ภารกิจคือการรวมทั้งสองสาขาเข้าด้วยกัน พัฒนา. ในกรณีนี้ ขอแนะนำให้รวมสาขาใดสาขาหนึ่งเข้าด้วยกันก่อน พัฒนาแล้วจึงผสาน พัฒนา ไปสู่สาขาที่เหลือ แก้ไขปัญหาความขัดแย้งในสาขาที่เหลือ แล้วรวมสาขาสุดท้ายเข้าด้วยกัน พัฒนา. ในระหว่างขั้นตอนการแก้ไขข้อขัดแย้ง คุณอาจต้องแก้ไขไฟล์การโยกย้ายในสาขาสุดท้ายเพื่อให้ตรงกับการถ่ายโอนข้อมูลขั้นสุดท้าย ซึ่งรวมถึงผลลัพธ์ของการผสาน
วิธีปรับใช้การเปลี่ยนแปลงเพิ่มเติมในโครงสร้างฐานข้อมูลกับสภาพแวดล้อมการใช้งานจริงอย่างปลอดภัย
ด้วยการมีดัมพ์ของโครงสร้างฐานข้อมูลปัจจุบันใน VCS ทำให้สามารถตรวจสอบฐานข้อมูลการผลิตว่าสอดคล้องกับโครงสร้างที่ต้องการอย่างแน่นอน เพื่อให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดที่นักพัฒนาตั้งใจไว้จะถูกโอนไปยังฐานการผลิตได้สำเร็จ
ในขณะที่ ROLLBACK
:
- เริ่มการทำธุรกรรม
- ดำเนินการย้ายข้อมูลทั้งหมดในธุรกรรม
- ในธุรกรรมเดียวกัน ให้ดำเนินการ
deployDump
- ดำเนินการโดยไม่ต้องทำธุรกรรมให้เสร็จสิ้น
verifyDump
. หากไม่มีข้อผิดพลาดให้เรียกใช้COMMIT
. หากมีข้อผิดพลาดให้เรียกใช้ROLLBACK
ขั้นตอนเหล่านี้สามารถรวมเข้ากับแนวทางการใช้งานแอปพลิเคชันที่มีอยู่ได้อย่างง่ายดาย รวมถึงการหยุดทำงานเป็นศูนย์
ข้อสรุป
ด้วยวิธีการที่อธิบายไว้ข้างต้น คุณสามารถบีบประสิทธิภาพสูงสุดออกจากโปรเจ็กต์ “PHP + PostgreSQL” ได้ ในขณะที่สูญเสียความสะดวกในการพัฒนาค่อนข้างน้อยเมื่อเทียบกับการใช้ตรรกะทางธุรกิจทั้งหมดในโค้ดแอปพลิเคชันหลัก อีกทั้งการประมวลผลข้อมูลใน
ที่มา: will.com