SchemaKeeper ашиглан мэдээллийн сан дахь бизнесийн логик

Энэ нийтлэлийн зорилго нь номын сангийн жишээг ашиглах явдал юм схем хадгалагч PostgreSQL DBMS ашиглан PHP төслийн хүрээнд мэдээллийн сан боловсруулах үйл явцыг ихээхэн хөнгөвчлөх хэрэгслүүдийг харуулах.

Энэ нийтлэлийн мэдээлэл нь юуны түрүүнд PostgreSQL-ийн чадавхийг дээд зэргээр ашиглахыг хүсдэг боловч мэдээллийн санд байршуулсан бизнесийн логикийг хадгалахад асуудалтай тулгардаг хөгжүүлэгчдэд хэрэгтэй болно.

Энэ нийтлэлд бизнесийн логикийг мэдээллийн санд хадгалахын давуу болон сул талуудыг тайлбарлахгүй. Сонголтыг уншигч аль хэдийн хийсэн гэж таамаглаж байна.

Дараах асуултуудыг авч үзнэ.

  1. Мэдээллийн сангийн бүтцийн дампыг хувилбарын хяналтын системд (цаашид VCS гэх) ямар хэлбэрээр хадгалах ёстой вэ?
  2. Дампыг хадгалсны дараа мэдээллийн сангийн бүтцэд гарсан өөрчлөлтийг хэрхэн хянах вэ
  3. Өгөгдлийн сангийн бүтцэд гарсан өөрчлөлтийг зөрчилгүй, том шилжилтийн файлгүйгээр бусад орчинд хэрхэн шилжүүлэх вэ
  4. Хэд хэдэн хөгжүүлэгчид төсөл дээр зэрэгцэн ажиллах үйл явцыг хэрхэн зохион байгуулах вэ
  5. Мэдээллийн сангийн бүтцэд гарсан нэмэлт өөрчлөлтүүдийг үйлдвэрлэлийн орчинд хэрхэн аюулгүйгээр нэвтрүүлэх вэ

    SchemaKeeper хэл дээр бичигдсэн хадгалагдсан процедуртай ажиллахад зориулагдсан PL/pgSQL. Бусад хэл дээр туршилт хийгээгүй тул ашиглах нь тийм ч үр дүнтэй биш эсвэл боломжгүй байж магадгүй юм.

Өгөгдлийн сангийн бүтцийн дампыг VCS дээр хэрхэн хадгалах вэ

номын сан схем хадгалагч функцийг хангадаг saveDump, энэ нь мэдээллийн сангаас бүх объектын бүтцийг тусдаа текст файл болгон хадгалдаг. Гаралт нь VCS-д амархан нэмж болох бүлэг файлуудад хуваагдсан мэдээллийн сангийн бүтцийг агуулсан лавлах юм.

Өгөгдлийн сангаас объектуудыг файл болгон хөрвүүлэх хэд хэдэн жишээг авч үзье.

Тип объект
Энэ схем
Гарчиг
Файлд хүрэх харьцангуй зам

хүснэгт
олон нийтийн
данс
./public/tables/accounts.txt

Хадгалагдсан журам
олон нийтийн
auth(хэш bigint)
./public/functions/auth(int8).sql

Танилцуулга
захиалгаа өгөх
тариф
./booking/views/tariffs.txt

Файлуудын агуулга нь тодорхой мэдээллийн сангийн объектын бүтцийн текст дүрслэл юм. Жишээлбэл, хадгалагдсан процедурын хувьд файлын агуулга нь блокоос эхлээд хадгалагдсан процедурын бүрэн тодорхойлолт байх болно. CREATE OR REPLACE FUNCTION.

Дээрх хүснэгтээс харахад файлд хүрэх зам нь объектын төрөл, схем, нэрний талаархи мэдээллийг хадгалдаг. Энэ арга нь өгөгдлийн сан дахь өөрчлөлтүүдийн хогийн цэг болон кодын хянан үзэхэд хялбар болгодог.

өргөтгөл .sql Хадгалсан процедурын эх кодтой файлуудын хувьд үүнийг IDE нь файлыг нээх үед мэдээллийн сантай харилцах хэрэгслийг автоматаар хангахаар сонгосон.

Дампыг хадгалсны дараа мэдээллийн сангийн бүтцэд гарсан өөрчлөлтийг хэрхэн хянах вэ

VCS-д одоогийн өгөгдлийн сангийн бүтцийн дампыг хадгалснаар бид дамп үүсгэсний дараа өгөгдлийн сангийн бүтцэд өөрчлөлт орсон эсэхийг шалгах боломжийг олж авдаг. Номын санд схем хадгалагч Өгөгдлийн сангийн бүтцэд гарсан өөрчлөлтийг илрүүлэх функцийг өгсөн verifyDump, энэ нь гаж нөлөөгүйгээр ялгааны талаарх мэдээллийг буцаана.

Шалгах өөр арга бол функцийг дахин дуудах явдал юм saveDump, ижил лавлахыг зааж, өөрчлөлтийг VCS-ээс шалгана уу. Өгөгдлийн сангийн бүх объектууд тусдаа файлд хадгалагддаг тул VCS зөвхөн өөрчлөгдсөн объектуудыг харуулах болно.
Энэ аргын гол сул тал бол өөрчлөлтийг харахын тулд файлуудыг дарж бичих хэрэгцээ юм.

Өгөгдлийн сангийн бүтцэд гарсан өөрчлөлтийг зөрчилгүй, том шилжилтийн файлгүйгээр бусад орчинд хэрхэн шилжүүлэх вэ

Функцийн ачаар deployDump Хадгалагдсан процедурын эх кодыг ердийн програмын эх кодтой яг ижил аргаар засварлаж болно. Та хадгалагдсан процедурын кодонд шинэ мөр нэмэх/устгах ба хувилбарын удирдлагад нэн даруй өөрчлөлт оруулах, эсвэл dump директорт харгалзах файлуудыг үүсгэх/устгах замаар хадгалагдсан процедурыг үүсгэх/устгах боломжтой.

Жишээлбэл, схемд шинэ хадгалагдсан процедур үүсгэх public зүгээр л өргөтгөлтэй шинэ файл үүсгэ .sql лавлах дотор public/functions, блокыг оруулаад хадгалагдсан процедурын эх кодыг байрлуул CREATE OR REPLACE FUNCTION, дараа нь функцийг дууд deployDump. Хадгалагдсан процедурыг өөрчлөх, устгах нь ижил аргаар явагддаг. Тиймээс код нь VCS болон мэдээллийн санд нэгэн зэрэг ордог.

Хэрэв ямар нэгэн хадгалагдсан процедурын эх кодонд алдаа гарсан эсвэл файлын нэр болон хадгалагдсан процедурын хооронд зөрүү гарсан бол deployDump алдааны текстийг харуулах амжилтгүй болно. Ашиглах үед өгөгдлийн сан болон одоогийн мэдээллийн сан хоёрын хооронд хадгалагдсан процедурын үл нийцэх байдал боломжгүй юм deployDump.

Шинэ хадгалагдсан процедур үүсгэх үед файлын нэрийг гараар оруулах шаардлагагүй болно. Файл өргөтгөлтэй байхад хангалттай .sql. Дуудлагын дараа deployDump алдааны текст нь файлын нэрийг өөрчлөхөд ашиглаж болох зөв нэрийг агуулсан байх болно.

deployDump Энэ нь нэмэлт үйлдэлгүйгээр функц эсвэл буцах төрлийн параметрүүдийг өөрчлөх боломжийг олгодог бол сонгодог аргын хувьд та үүнийг хийх хэрэгтэй болно.
эхлээд гүйцэтгэнэ DROP FUNCTION, зөвхөн дараа нь CREATE OR REPLACE FUNCTION.

Харамсалтай нь зарим нөхцөл байдал бий deployDump өөрчлөлтүүдийг автоматаар хэрэгжүүлэх боломжгүй. Жишээлбэл, дор хаяж нэг триггер ашигладаг гох функцийг устгавал. Ийм нөхцөл байдлыг шилжүүлэх файлуудыг ашиглан гараар шийддэг.

Хэрэв та хадгалагдсан процедурт өөрчлөлт оруулах үүрэгтэй бол схем хадгалагч, дараа нь бүтцийн бусад өөрчлөлтийг шилжүүлэхийн тулд шилжүүлэх файлуудыг ашиглах ёстой. Жишээлбэл, шилжилт хөдөлгөөнтэй ажиллахад тохиромжтой номын сан сургаал/шилжилт.

Шилжүүлэлтийг эхлүүлэхээс өмнө хэрэгжүүлэх ёстой deployDump. Энэ нь бүтцэд бүх өөрчлөлтийг хийж, асуудалтай нөхцөл байдлыг шийдвэрлэх боломжийг олгодог бөгөөд ингэснээр хадгалагдсан процедурын өөрчлөлтийг дараа нь асуудалгүйгээр шилжүүлэх болно.

Шилжилт хөдөлгөөнтэй ажиллах талаар дараах хэсгүүдэд илүү дэлгэрэнгүй тайлбарлах болно.

Хэд хэдэн хөгжүүлэгчид төсөл дээр зэрэгцэн ажиллах үйл явцыг хэрхэн зохион байгуулах вэ

Өгөгдлийн санг бүрэн эхлүүлэхийн тулд скриптийг бий болгох шаардлагатай бөгөөд үүнийг хөгжүүлэгч өөрийн ажлын машин дээрээ ажиллуулж, локал мэдээллийн сангийн бүтцийг VCS-д хадгалагдсан овоолгын дагуу авчрах болно. Хамгийн хялбар арга бол локал мэдээллийн санг эхлүүлэх ажлыг 3 алхам болгон хуваах явдал юм.

  1. гэх мэт үндсэн бүтэцтэй файлыг импортлох. base.sql
  2. Шилжилт хөдөлгөөн хийх
  3. Сорилт deployDump

base.sql нь шилжилт хөдөлгөөнийг хэрэгжүүлж, гүйцэтгэх эхлэлийн цэг юм deployDump, тэр нь base.sql + миграции + deployDump = актуальная структура БД. Та хэрэгслийг ашиглан ийм файл үүсгэж болно pg_dump. Ашигласан base.sql зөвхөн мэдээллийн санг эхнээс нь эхлүүлэх үед.

Өгөгдлийн санг бүрэн эхлүүлэхийн тулд скриптийг дуудъя refresh.sh. Ажлын урсгал дараах байдлаар харагдаж болно.

  1. Хөгжүүлэгч өөрийн орчинд ажилладаг refresh.sh ба одоогийн мэдээллийн сангийн бүтцийг авдаг
  2. Хөгжүүлэгч нь шинэ функцын хэрэгцээнд нийцүүлэн локал мэдээллийн санг өөрчилсөн ажил дээрээ ажиллаж эхэлдэг (ALTER TABLE ... ADD COLUMN гэх мэт)
  3. Даалгаврыг гүйцэтгэсний дараа хөгжүүлэгч уг функцийг дууддаг saveDumpVCS дэх мэдээллийн санд өөрчлөлт оруулах
  4. Хөгжүүлэгчийг дахин эхлүүлэх refresh.shдараа нь verifyDumpЭнэ нь одоо шилжих хөдөлгөөнд оруулах өөрчлөлтүүдийн жагсаалтыг харуулж байна
  5. Хөгжүүлэгч бүтцийн өөрчлөлтийг бүхэлд нь шилжүүлэх файл руу шилжүүлж, дахин ажиллуулна refresh.sh и verifyDump, мөн хэрэв шилжилт хөдөлгөөнийг зөв эмхэтгэсэн бол, verifyDump локал мэдээллийн сан болон хадгалсан овоолгын хооронд ямар ч ялгаа харагдахгүй

Дээр дурдсан процесс нь gitflow зарчимтай нийцдэг. VCS-ийн салбар бүр нь овоолгын өөрийн хувилбарыг агуулсан байх ба салбаруудыг нэгтгэх үед хогийн цэгүүдийг нэгтгэнэ. Ихэнх тохиолдолд, нэгтгэсний дараа нэмэлт арга хэмжээ авах шаардлагагүй, гэхдээ өөр өөр салбаруудад, жишээлбэл, нэг хүснэгтэд өөрчлөлт оруулсан бол зөрчил үүсч болно.

Мөргөлдөөний нөхцөл байдлыг жишээгээр авч үзье: салбар байна боловсруулах, үүнээс хоёр салбар салбар: функц1 и функц2, ямар ч зөрчилгүй боловсруулах, гэхдээ хоорондоо зөрчилддөг. Даалгавар бол хоёр салбарыг нэгтгэх явдал юм боловсруулах. Энэ тохиолдолд эхлээд салбаруудын аль нэгийг нь нэгтгэхийг зөвлөж байна боловсруулахдараа нь нэгтгэнэ боловсруулах үлдсэн салбар руу, үлдсэн салбар дахь зөрчилдөөнийг шийдэж, дараа нь сүүлчийн салбарыг нэгтгэнэ боловсруулах. Зөрчилдөөнийг шийдвэрлэх үе шатанд та сүүлийн салбар дахь шилжилтийн файлыг нэгтгэх үр дүнг багтаасан эцсийн хогийн цэгтэй тааруулах хэрэгтэй болж магадгүй.

Мэдээллийн сангийн бүтцэд гарсан нэмэлт өөрчлөлтүүдийг үйлдвэрлэлийн орчинд хэрхэн аюулгүйгээр нэвтрүүлэх вэ

VCS-д одоогийн мэдээллийн сангийн бүтцийн овоолго байгаа тул үйлдвэрлэлийн мэдээллийн санг шаардлагатай бүтэцтэй яг таарч байгаа эсэхийг шалгах боломжтой болсон. Энэ нь хөгжүүлэгчдийн төлөвлөж байсан бүх өөрчлөлтийг үйлдвэрлэлийн баазад амжилттай шилжүүлсэн болохыг баталгаажуулдаг.

Оноос хойш DDL PostgreSQL дээр байна гүйлгээний, дараах байршуулах дарааллыг дагаж мөрдөхийг зөвлөж байна, ингэснээр гэнэтийн алдаа гарсан тохиолдолд та "өвдөлтгүй" гүйцэтгэх боломжтой болно. ROLLBACK:

  1. Гүйлгээг эхлүүлэх
  2. Гүйлгээнд бүх шилжүүлгийг гүйцэтгэнэ
  3. Ижил гүйлгээнд гүйцэтгэх deployDump
  4. Гүйлгээг дуусгахгүйгээр гүйцэтгэнэ verifyDump. Хэрэв алдаа байхгүй бол ажиллуулна уу COMMIT. Хэрэв алдаа гарвал ажиллуулна уу ROLLBACK

Эдгээр алхмуудыг одоо байгаа аппликейшн байршуулах арга барилд хялбархан нэгтгэж болно, үүнд тэг зогсолт орно.

дүгнэлт

Дээр дурдсан аргуудын ачаар "PHP + PostgreSQL" төслүүдийн хамгийн их гүйцэтгэлийг шахаж, үндсэн програмын кодонд бизнесийн бүх логикийг хэрэгжүүлэхтэй харьцуулахад харьцангуй бага хөгжүүлэлтийн тав тухыг алдагдуулах боломжтой. Үүнээс гадна өгөгдөл боловсруулах нь PL/pgSQL Энэ нь ихэвчлэн илүү ил тод харагддаг бөгөөд PHP дээр бичигдсэн ижил функцээс бага код шаарддаг.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх