SchemaKeeper көмегімен дерекқордағы бизнес логикасы

Бұл мақаланың мақсаты - кітапхананың мысалын пайдалану схема сақтаушы PostgreSQL ДҚБЖ көмегімен PHP жобаларында дерекқорларды әзірлеу процесін айтарлықтай жеңілдететін құралдарды көрсету.

Бұл мақаладағы ақпарат, ең алдымен, PostgreSQL мүмкіндіктерін барынша пайдаланғысы келетін, бірақ дерекқорда орналастырылған бизнес логикасын қолдау мәселелеріне тап болған әзірлеушілерге пайдалы болады.

Бұл мақала дерекқорда бизнес логикасын сақтаудың артықшылықтары мен кемшіліктерін сипаттамайды. Оқырманның таңдауы әлдеқашан жасалған деген болжам бар.

Келесі сұрақтар қарастырылады:

  1. Дерекқор құрылымының демпі нұсқаларды басқару жүйесінде (бұдан әрі - VCS) қандай пішінде сақталуы керек?
  2. Демпті сақтағаннан кейін дерекқор құрылымындағы өзгерістерді қалай бақылауға болады
  3. Мәліметтер қоры құрылымындағы өзгерістерді қайшылықтарсыз және алып көшіру файлдарынсыз басқа орталарға қалай тасымалдауға болады
  4. Бірнеше әзірлеушілердің жобада параллельді жұмыс процесін қалай ұйымдастыруға болады
  5. Өндіріс ортасына дерекқор құрылымындағы көбірек өзгертулерді қалай қауіпсіз орналастыру керек

    SchemaKeeper тілінде жазылған сақталатын процедуралармен жұмыс істеуге арналған PL/pgSQL. Басқа тілдерде тестілеу жүргізілмеген, сондықтан пайдалану тиімді болмауы немесе мүмкін болмауы мүмкін.

VCS жүйесінде дерекқор құрылымының демпін қалай сақтауға болады

Кітапхана схема сақтаушы функциясын қамтамасыз етеді saveDump, ол деректер қорындағы барлық нысандардың құрылымын бөлек мәтіндік файлдар ретінде сақтайды. Шығару - VCS-ке оңай қосуға болатын топталған файлдарға бөлінген дерекқор құрылымын қамтитын каталог.

Бірнеше мысалдар арқылы объектілерді дерекқордан файлдарға түрлендіруді қарастырайық:

Типтік объект
Схема

Файлға қатысты жол

үстел
қоғамдық
шоттар
./public/tables/accounts.txt

Сақталған процедура
қоғамдық
аутентификация(хэш бигинт)
./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-дегі әрбір тармақта өз қоқыс нұсқасы болады, ал тармақтарды біріктіру кезінде үйінділер біріктіріледі. Көп жағдайда біріктіруден кейін ешқандай қосымша әрекетті орындау қажет емес, бірақ өзгертулер әртүрлі тармақтарда, мысалы, бір кестеге енгізілген болса, қайшылық туындауы мүмкін.

Мысал арқылы конфликті жағдайды қарастырайық: тармақ бар даму, одан екі тармақ тармақталған: мүмкіндік 1 и мүмкіндік 2қайшылықтары жоқ даму, бірақ бір-бірімен қайшылықтары бар. Тапсырма екі тармақты біріктіру болып табылады даму. Бұл жағдайда алдымен филиалдардың бірін біріктіру ұсынылады дамусодан кейін біріктіріңіз даму қалған тармаққа, қалған тармақтағы қайшылықтарды шешуге, содан кейін соңғы тармақты біріктіруге даму. Қақтығыстарды шешу кезеңінде соңғы тармақтағы тасымалдау файлын біріктіру нәтижелерін қамтитын соңғы демпке сәйкес келетіндей етіп түзету қажет болуы мүмкін.

Өндіріс ортасына дерекқор құрылымындағы көбірек өзгертулерді қалай қауіпсіз орналастыру керек

VCS-те ағымдағы деректер қоры құрылымының демпінің болуы арқасында өндірістік деректер базасын қажетті құрылымға дәл сәйкестігін тексеру мүмкін болады. Бұл әзірлеушілер ойлаған барлық өзгерістердің өндірістік базаға сәтті ауыстырылғанын қамтамасыз етеді.

содан бері DDL PostgreSQL-де транзакциялық, күтпеген қателік туындаған жағдайда «ауыртпалықсыз» орындау үшін келесі орналастыру тәртібін сақтау ұсынылады. ROLLBACK:

  1. Транзакцияны бастау
  2. Транзакциядағы барлық тасымалдауларды орындаңыз
  3. Сол транзакцияда орындаңыз deployDump
  4. Транзакцияны аяқтамай, орындаңыз verifyDump. Егер қателер болмаса, іске қосыңыз COMMIT. Егер қателер болса, іске қосыңыз ROLLBACK

Бұл қадамдарды қолданбаны орналастырудың бар тәсілдеріне, соның ішінде нөлдік тоқтау уақытына оңай біріктіруге болады.

қорытынды

Жоғарыда сипатталған әдістердің арқасында «PHP + PostgreSQL» жобаларының максималды өнімділігін қысқартуға болады, сонымен бірге негізгі қолданба кодындағы барлық бизнес логикасын енгізумен салыстырғанда салыстырмалы түрде аз әзірлеу ыңғайлылығын жоғалтуға болады. Сонымен қатар, деректерді өңдеу PL/pgSQL жиі мөлдір болып көрінеді және PHP-де жазылған бірдей функцияға қарағанда аз кодты қажет етеді.

Ақпарат көзі: www.habr.com

пікір қалдыру