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 Сакталган процедуралардын баштапкы коду кадимки тиркеменин баштапкы коду сыяктуу эле редакцияланышы мүмкүн. Сакталган процедура кодуна жаңы саптарды кошуп/жок кыла аласыз жана версияны башкарууга өзгөртүүлөрдү дароо түртсөңүз болот, же таштанды каталогунда тиешелүү файлдарды түзүү/өчүрүү менен сакталган процедураларды түзө аласыз/жок кыла аласыз.

Мисалы, схемада жаңы сакталган процедураны түзүү 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деги ар бир бутак таштандынын өзүнүн версиясын камтыйт жана бутактарды бириктиргенде, таштандылар бириктирилет. Көпчүлүк учурларда, бириктирилгенден кийин эч кандай кошумча иш-аракеттерди жасоонун кереги жок, бирок ар кандай бутактарда, мисалы, бир эле таблицага өзгөртүүлөр киргизилсе, чыр-чатак чыгышы мүмкүн.

Келгиле, конфликттик кырдаалды мисал менен карап көрөлү: бутак бар иштеп чыгуу, анын эки бутактары: feature1 и feature2менен эч кандай карама-каршылыгы жок иштеп чыгуу, бирок бири-бири менен чыр-чатактар ​​бар. Милдет эки бутакты бириктирүү болуп саналат иштеп чыгуу. Бул учурда, алгач бутактарынын бирин бириктирүү сунушталат иштеп чыгууанан бириктирүү иштеп чыгуу калган бутагына, калган бутактагы конфликттерди чечип, андан соң акыркы бутакты бириктирет иштеп чыгуу. Чыр-чатакты чечүү баскычында, сиз акыркы бутактагы көчүрүү файлын бириктирүү натыйжаларын камтыган акыркы таштандыга дал келгидей кылып оңдоого туура келиши мүмкүн.

Өндүрүш чөйрөсүнө маалымат базасынын түзүмүндө көбүрөөк өзгөртүүлөрдү кантип коопсуз жайылтуу керек

VCSде учурдагы маалымат базасынын түзүмүнүн таштандысынын болушунун аркасында өндүрүш базасынын талап кылынган структурага так шайкештигин текшерүү мүмкүн болот. Бул иштеп чыгуучулар ойлогон бардык өзгөрүүлөр өндүрүштүк базага ийгиликтүү өткөрүлүп берилгендигин камсыздайт.

бери DDL PostgreSQLде транзакциялык, күтүлбөгөн ката болгондо, сиз "оорутпай" аткара алышыңыз үчүн, төмөнкү жайгаштыруу тартибин сактоо сунушталат. ROLLBACK:

  1. Транзакцияны баштоо
  2. Транзакциядагы бардык көчүрүүлөрдү аткарыңыз
  3. Ошол эле транзакцияда, аткарыңыз deployDump
  4. Транзакцияны бүтүрбөй туруп, аткарыңыз verifyDump. Эгер каталар жок болсо, иштетиңиз COMMIT. Эгер каталар болсо, иштетиңиз ROLLBACK

Бул кадамдарды тиркемени жайылтууга болгон ыкмаларга, анын ичинде нөлдүк токтоп калууга оңой интеграциялоого болот.

жыйынтыктоо

Жогоруда сүрөттөлгөн ыкмалардын аркасында "PHP + PostgreSQL" долбоорлорунун максималдуу иштешин кыскартууга болот, ошол эле учурда негизги тиркеме кодундагы бардык бизнес логикасын ишке ашырууга салыштырмалуу салыштырмалуу азыраак өнүгүү ыңгайлуулугун жоготсо болот. Мындан тышкары, маалыматтарды иштетүү PL/pgSQL көбүнчө ачык көрүнөт жана PHPде жазылган ошол эле функцияга караганда азыраак кодду талап кылат.

Source: www.habr.com

Комментарий кошуу