SchemaKeeper ilə verilənlər bazasında biznes məntiqi

Bu məqalənin məqsədi kitabxana nümunəsindən istifadə etməkdir sxem qoruyucusu PostgreSQL DBMS-dən istifadə edərək PHP layihələri daxilində verilənlər bazalarının yaradılması prosesini əhəmiyyətli dərəcədə sadələşdirə bilən alətləri göstərin.

Bu məqalədəki məlumatlar, ilk növbədə, PostgreSQL imkanlarından maksimum yararlanmaq istəyən, lakin verilənlər bazasında yerləşdirilən biznes məntiqini saxlamaqla bağlı problemlərlə üzləşən tərtibatçılar üçün faydalı olacaq.

Bu məqalədə biznes məntiqini verilənlər bazasında saxlamağın üstünlükləri və ya çatışmazlıqları təsvir olunmayacaq. Ehtimal olunur ki, seçim artıq oxucu tərəfindən edilib.

Aşağıdakı suallara baxılacaq:

  1. Versiya idarəetmə sistemində (bundan sonra VCS adlandırılacaq) verilənlər bazası strukturu tullantıları hansı formada saxlanılmalıdır?
  2. Dump saxladıqdan sonra verilənlər bazası strukturunda dəyişiklikləri necə izləmək olar
  3. Verilənlər bazası strukturunda dəyişiklikləri münaqişələr və nəhəng miqrasiya faylları olmadan digər mühitlərə necə ötürmək olar
  4. Bir neçə tərtibatçı tərəfindən bir layihə üzərində paralel iş prosesini necə təşkil etmək olar
  5. Verilənlər bazası strukturunda daha çox dəyişiklikləri istehsal mühitinə təhlükəsiz şəkildə necə yerləşdirmək olar

    SchemaKeeper dildə yazılmış saxlanılan prosedurlarla işləmək üçün nəzərdə tutulmuşdur PL/pgSQL. Digər dillərlə sınaq keçirilməmişdir, ona görə də istifadə o qədər təsirli olmaya bilər və ya mümkün olmaya bilər.

VCS-də verilənlər bazası strukturu zibilini necə saxlamaq olar

kitabxana sxem qoruyucusu funksiyasını təmin edir saveDump, verilənlər bazasından bütün obyektlərin strukturunu ayrıca mətn faylları kimi saxlayır. Çıxış VCS-ə asanlıqla əlavə edilə bilən qruplaşdırılmış fayllara bölünmüş verilənlər bazası strukturunu ehtiva edən bir kataloqdur.

Bir neçə nümunədən istifadə edərək verilənlər bazasından obyektlərin fayllara çevrilməsinə baxaq:

Obyekt növü
Sxem
Ad
Fayl üçün nisbi yol

masa
ictimai
hesabları
./public/tables/accounts.txt

Saxlanılan prosedur
ictimai
auth(hash bigint)
./public/functions/auth(int8).sql

Giriş
bilet satışı
tarifləri
./booking/views/tariffs.txt

Faylların məzmunu konkret verilənlər bazası obyektinin strukturunun mətn təsviridir. Məsələn, saxlanılan prosedurlar üçün faylın məzmunu blokdan başlayaraq saxlanılan prosedurun tam tərifi olacaqdır. CREATE OR REPLACE FUNCTION.

Yuxarıdakı cədvəldən göründüyü kimi, fayla gedən yol obyektin növü, sxemi və adı haqqında məlumatları saxlayır. Bu yanaşma verilənlər bazasındakı dəyişikliklərin dump və kodun nəzərdən keçirilməsində naviqasiyanı asanlaşdırır.

artırma .sql saxlanılan prosedur mənbə kodu olan fayllar üçün bu seçilmişdir ki, IDE fayl açıldıqda verilənlər bazası ilə qarşılıqlı əlaqə üçün alətləri avtomatik təmin etsin.

Dump saxladıqdan sonra verilənlər bazası strukturunda dəyişiklikləri necə izləmək olar

Mövcud verilənlər bazası strukturunun zibilini VCS-də saxlamaqla biz zibil yaradıldıqdan sonra verilənlər bazası strukturunda dəyişikliklər edilib-edilmədiyini yoxlamaq imkanı əldə edirik. Kitabxanada sxem qoruyucusu verilənlər bazası strukturunda dəyişiklikləri aşkar etmək üçün funksiya təmin edilir verifyDump, yan təsirlər olmadan fərqlər haqqında məlumat qaytarır.

Yoxlamağın alternativ yolu funksiyanı yenidən çağırmaqdır saveDump, eyni kataloqu göstərin və dəyişikliklər üçün VCS-də yoxlayın. Verilənlər bazasındakı bütün obyektlər ayrı-ayrı fayllarda saxlandığından, VCS yalnız dəyişdirilmiş obyektləri göstərəcək.
Bu metodun əsas çatışmazlığı dəyişiklikləri görmək üçün faylların üzərinə yazmaq ehtiyacıdır.

Verilənlər bazası strukturunda dəyişiklikləri münaqişələr və nəhəng miqrasiya faylları olmadan digər mühitlərə necə ötürmək olar

Funksiya sayəsində deployDump Saxlanılan prosedurların mənbə kodu adi proqram mənbə kodu ilə eyni şəkildə redaktə edilə bilər. Saxlanılan prosedur koduna yeni sətirlər əlavə edə/silə və dərhal versiyaya nəzarətə dəyişikliklər edə və ya dump qovluğunda müvafiq faylları yarada/silməklə saxlanılan prosedurları yarada/silə bilərsiniz.

Məsələn, sxemdə yeni saxlanılan prosedur yaratmaq public sadəcə uzantısı olan yeni bir fayl yaradın .sql kataloqda public/functions, blok daxil olmaqla, saxlanılan prosedurun mənbə kodunu yerləşdirin CREATE OR REPLACE FUNCTION, sonra funksiyanı çağırın deployDump. Saxlanılan prosedurun dəyişdirilməsi və silinməsi eyni şəkildə baş verir. Beləliklə, kod eyni anda həm VCS-ə, həm də verilənlər bazasına daxil olur.

Hər hansı saxlanılan prosedurun mənbə kodunda xəta və ya faylın adları ilə saxlanılan prosedur arasında uyğunsuzluq yaranarsa, o zaman deployDump xəta mətnini göstərərək uğursuz olacaq. İstifadə edərkən dump və cari verilənlər bazası arasında saxlanılan prosedurların uyğunsuzluğu mümkün deyil deployDump.

Yeni saxlanılan prosedur yaratarkən, düzgün fayl adını əl ilə daxil etməyə ehtiyac yoxdur. Faylın uzantısının olması kifayətdir .sql. Zəngdən sonra deployDump səhv mətnində faylın adını dəyişmək üçün istifadə edilə bilən düzgün ad olacaq.

deployDump əlavə hərəkətlər etmədən funksiyanın parametrlərini və ya qaytarma növünü dəyişdirməyə imkan verir, klassik yanaşma ilə isə siz
əvvəlcə icra edin DROP FUNCTION, və yalnız bundan sonra CREATE OR REPLACE FUNCTION.

Təəssüf ki, bəzi vəziyyətlər var deployDump dəyişiklikləri avtomatik tətbiq etmək mümkün deyil. Məsələn, ən azı bir tetikleyici tərəfindən istifadə edilən bir tətik funksiyası silinirsə. Bu cür hallar miqrasiya fayllarından istifadə etməklə əl ilə həll edilir.

Dəyişikliklərin saxlanılan prosedurlara köçürülməsinə cavabdehsinizsə sxem qoruyucusu, sonra strukturdakı digər dəyişiklikləri ötürmək üçün miqrasiya fayllarından istifadə edilməlidir. Məsələn, miqrasiya ilə işləmək üçün yaxşı bir kitabxana doktrina/miqrasiya.

Miqrasiya işə başlamazdan əvvəl tətbiq edilməlidir deployDump. Bu, strukturda bütün dəyişiklikləri etməyə və problemli vəziyyətləri həll etməyə imkan verir ki, saxlanılan prosedurlardakı dəyişikliklər sonradan problemsiz köçürülsün.

Miqrasiya ilə işləmək sonrakı bölmələrdə daha ətraflı təsvir olunacaq.

Bir neçə tərtibatçı tərəfindən bir layihə üzərində paralel iş prosesini necə təşkil etmək olar

Verilənlər bazasının tam işə salınması üçün skript yaratmaq lazımdır ki, onu tərtibatçı öz iş maşınında işə salacaq, yerli verilənlər bazasının strukturunu VCS-də saxlanan zibilliyə uyğunlaşdıracaq. Ən asan yol yerli verilənlər bazasının işə salınmasını 3 addıma bölməkdir:

  1. adlanacaq əsas strukturu olan faylı idxal edin, məsələn. base.sql
  2. Miqrasiyaların tətbiqi
  3. Çağırış deployDump

base.sql miqrasiyaların tətbiq olunduğu və icra edildiyi başlanğıc nöqtəsidir deployDumpKi, base.sql + миграции + deployDump = актуальная структура БД. Köməkçi proqramdan istifadə edərək belə bir fayl yarada bilərsiniz pg_dump. İstifadə olunub base.sql eksklüziv olaraq verilənlər bazasını sıfırdan işə saldıqda.

Tam verilənlər bazası işə salınması üçün skripti çağıraq refresh.sh. İş prosesi belə görünə bilər:

  1. Tərtibatçı öz mühitində işə başlayır refresh.sh və cari verilənlər bazası strukturunu əldə edir
  2. Tərtibatçı, yeni funksionallığın ehtiyaclarını ödəmək üçün yerli verilənlər bazasını dəyişdirərək, tapşırığı yerinə yetirməyə başlayır (ALTER TABLE ... ADD COLUMN və s.)
  3. Tapşırığı yerinə yetirdikdən sonra tərtibatçı funksiyanı çağırır saveDumpVCS-də verilənlər bazasında edilən dəyişiklikləri həyata keçirmək
  4. Tərtibatçının yenidən işə salınması refresh.shsonra verifyDumpindi miqrasiyaya daxil ediləcək dəyişikliklərin siyahısını göstərir
  5. Tərtibatçı bütün struktur dəyişikliklərini miqrasiya faylına köçürür, yenidən işləyir refresh.sh и verifyDump, və köçürmə düzgün tərtib edilibsə, verifyDump yerli verilənlər bazası ilə saxlanan zibil arasında heç bir fərq göstərməyəcək

Yuxarıda təsvir edilən proses gitflow prinsipləri ilə uyğun gəlir. VCS-dəki hər bir filialda zibilin öz versiyası olacaq və filialları birləşdirərkən zibillər birləşdiriləcək. Əksər hallarda birləşmədən sonra heç bir əlavə tədbir görülməyə ehtiyac yoxdur, lakin müxtəlif filiallarda, məsələn, eyni cədvəldə dəyişikliklər edilibsə, münaqişə yarana bilər.

Nümunədən istifadə edərək münaqişə vəziyyətini nəzərdən keçirək: bir filial var Inkişaf etdirmək, iki filialdan ayrılır: xüsusiyyət1 и xüsusiyyət2ilə heç bir ziddiyyəti olmayan Inkişaf etdirmək, lakin bir-biri ilə ziddiyyətləri var. Vəzifə hər iki filialı birləşdirməkdir Inkişaf etdirmək. Bu vəziyyətdə əvvəlcə filiallardan birini birləşdirmək tövsiyə olunur Inkişaf etdirməkvə sonra birləşdirin Inkişaf etdirmək qalan filiala, qalan filialdakı münaqişələri həll edir və sonra sonuncu filialı birləşdirir Inkişaf etdirmək. Münaqişənin həlli mərhələsində siz axırıncı filialda miqrasiya faylını düzəltməli ola bilərsiniz ki, o, birləşmələrin nəticələrini ehtiva edən son tullantıya uyğun olsun.

Verilənlər bazası strukturunda daha çox dəyişiklikləri istehsal mühitinə təhlükəsiz şəkildə necə yerləşdirmək olar

VCS-də mövcud verilənlər bazası strukturunun zibilinin olması sayəsində istehsal məlumat bazasının tələb olunan struktura dəqiq uyğunluğunu yoxlamaq mümkün olur. Bu, tərtibatçıların nəzərdə tutduğu bütün dəyişikliklərin uğurla istehsal bazasına köçürülməsini təmin edir.

Kimi DDL PostgreSQL-də əməliyyat, aşağıdakı yerləşdirmə qaydasına riayət etmək tövsiyə olunur ki, gözlənilməz bir səhv baş verərsə, "ağrısız" icra edə biləsiniz. ROLLBACK:

  1. Əməliyyata başlayın
  2. Əməliyyatda bütün köçürmələri həyata keçirin
  3. Eyni əməliyyatda icra edin deployDump
  4. Əməliyyatı tamamlamadan icra edin verifyDump. Heç bir səhv yoxdursa, işə salın COMMIT. Səhvlər varsa, işə salın ROLLBACK

Bu addımlar asanlıqla tətbiqin yerləşdirilməsi üçün mövcud yanaşmalara, o cümlədən sıfır dayanma vaxtı daxil edilə bilər.

Nəticə

Yuxarıda təsvir edilən üsullar sayəsində əsas proqram kodunda bütün biznes məntiqini həyata keçirməklə müqayisədə nisbətən az inkişaf rahatlığını qurban verərək, “PHP + PostgreSQL” layihələrindən maksimum performansı sıxışdırmaq mümkündür. Üstəlik, məlumatların işlənməsi PL/pgSQL tez-tez daha şəffaf görünür və PHP-də yazılmış eyni funksionallıqdan daha az kod tələb edir.

Mənbə: www.habr.com

Добавить комментарий