Mantiqa karsaziyê di databasê de bi karanîna SchemaKeeper

Armanca vê gotarê ew e ku nimûneya pirtûkxaneyê bikar bîne schema-keeper Amûrên ku dikarin bi karanîna PostgreSQL DBMS-a PostgreSQL-ê di nav projeyên PHP-ê de pêvajoyek pêşvebirina databasan bi girîngî hêsan bikin nîşan bidin.

Agahdariya ji vê gotarê, berî her tiştî, dê ji pêşdebirên ku dixwazin herî zêde ji kapasîteyên PostgreSQL bikar bînin, bikêr be, lê bi pirsgirêkên domandina mantiqa karsaziyê ya ku di databasê de hatî bicîh kirin re rû bi rû ne.

Статья не будет описывать преимущества или недостатки хранения бизнес-логики в базе данных. Предполагается, что выбор уже сделан читателем.

Pirsên jêrîn dê bêne hesibandin:

  1. В каком виде хранить дамп структуры БД в системе контроля версий (далее по тексту — VCS)
  2. Meriv çawa guheztinên di strukturên databasê de piştî hilanînê bişopîne
  3. Meriv çawa guheztinên di strukturên databasê de bêyî nakokî û pelên koçberiyê yên mezin vediguhezîne hawîrdorên din
  4. Meriv çawa pêvajoya xebata paralel li ser projeyek ji hêla çend pêşdebiran ve organîze dike
  5. Meriv çawa bi ewlehî bêtir guhertinên di avahiya databasê de li hawîrdorek hilberînê bicîh dike

    SchemaKeeper заточен под работу с хранимыми процедурами, написанными на языке PL/pgSQL. Testkirina bi zimanên din nehatiye kirin, ji ber vê yekê dibe ku karanîna wê ne bi bandor be an jî ne gengaz be.

Meriv çawa di VCS de avahiyek databasê hilîne

Pirtûkxaneyê schema-keeper fonksiyonek peyda dike saveDump, ku strukturên hemî tiştan ji databasê wekî pelên nivîsê yên cihê diparêze. Hilber pelrêçek e ku avahiya databasê vedihewîne, li pelên komkirî yên ku bi hêsanî dikarin li VCS-ê werin zêdekirin dabeş dibe.

Werin em li veguheztina tiştan ji databasek nav pelan bi karanîna çend mînakan binêrin:

Tîpa objeyê
Scheme
Sernav
Rêça têkildar a pelê

table
alenî
bikarhênerên
./public/tables/accounts.txt

Pêvajoya hilanîn
alenî
auth (hash bigint)
./public/functions/auth(int8).sql

Pîrozbahiyê
veqetandinê
tarafên
./booking/views/tariffs.txt

Naveroka pelan temsîla tekstî ya avahiya objektek databasa taybetî ye. Mînakî, ji bo prosedurên hilanîn, naveroka pelê dê bibe pênaseya tevahî ya prosedûra hilanîn, bi blokê dest pê dike. CREATE OR REPLACE FUNCTION.

Как видно из таблицы выше, путь к файлу хранит в себе информацию о типе, схеме и названию объекта. Такой подход облегчает навигацию по дампу и code review изменений в БД.

dirêjkirinê .sql для файлов с исходным кодом хранимых процедур выбрано для того, чтобы IDE автоматически предоставляли инструменты по взаимодействию с БД при открытии файла.

Meriv çawa guheztinên di strukturên databasê de piştî hilanînê bişopîne

Bi tomarkirina avêtina strukturên databasa heyî di VCS de, em fersendê digirin ku em kontrol bikin ka piştî ku dump hate afirandin guheztin di avahiya databasê de hatine çêkirin an na. Di pirtûkxaneyê de schema-keeper ji bo tespîtkirina guhertinên di avahiya databasê de, fonksiyonek tê peyda kirin verifyDump, ku agahdariya li ser cûdahiyan bêyî bandorên alî vedigerîne.

Rêyek alternatîf a kontrolkirinê ev e ku hûn fonksiyonê dîsa bang bikin saveDump, heman pelrêça diyar dike, û ji bo guhertinên VCS-ê kontrol bikin. Ji ber ku hemî tiştên ji databasê di pelên cûda de têne tomar kirin, VCS dê tenê tiştên guhertî nîşan bide.
Kêmasiya sereke ya vê rêbazê pêdivî ye ku pelan ji nû ve binivîsin da ku guhartinan bibînin.

Meriv çawa guheztinên di strukturên databasê de bêyî nakokî û pelên koçberiyê yên mezin vediguhezîne hawîrdorên din

Bi saya fonksiyonê deployDump Koda çavkaniyê ya prosedurên hilanîn dikare bi heman rengî wekî koda çavkaniya serîlêdana birêkûpêk were guherandin. Hûn dikarin di koda prosedûra hilanîn de rêzikên nû lê zêde bikin/ jêbikin û tavilê guheztinan bişopînin kontrola guhertoyê, an jî bi çêkirina/hilweşandina pelên têkildar di pelrêça avêtinê de prosedurên hilanîn biafirînin/ jêbirin.

Например, для создания новой хранимой процедуры в схеме public tenê bi pêvek pelek nû biafirîne .sql di pelrêça public/functions, koda çavkaniyê ya prosedûra hilanîn, di nav de blokê de cîh bikin CREATE OR REPLACE FUNCTION, paşê fonksiyonê bang bikin deployDump. Guhertin û jêbirina pêvajoyek hilanîn bi heman rengî pêk tê. Bi vî rengî, kod di heman demê de di nav VCS û databasê de diçe.

Ger di koda çavkaniyê ya her prosedurek hilanîn de xeletiyek xuya bibe, an nakokî di navbera navên pelê û prosedûra hilanîn de, wê hingê deployDump dê têk biçe, nivîsa çewtiyê nîşan bide. Dema ku tê bikar anîn, hevahengiya prosedurên hilanîn ên di navbera avêtin û databasa heyî de ne gengaz e deployDump.

При создании новой хранимой процедуры нет необходимости вручную вводить правильное название файла. Достаточно, чтобы у файла было расширение .sql. Piştî bangê deployDump di nivîsa xeletiyê de dê navê rast hebe, ku dikare ji bo guhertina navê pelê were bikar anîn.

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

Mixabin, hin rewş hene ku li wir deployDump не в состоянии автоматически применить изменения. Например, если удаляется триггерная функция, которая используется хотя бы одним триггером. Такие ситуации решаются вручную с помощью файлов миграций.

Ger hûn berpirsiyar in ji bo koçkirina guheztinên prosedurên hilanîn schema-keeper, wê hingê divê pelên koçberiyê ji bo veguheztina guhertinên din ên di strukturê de werin bikar anîn. Mînakî, pirtûkxaneyek baş a ji bo xebata bi koçberan re ye doktrîn / koçberî.

Berî destpêkirinê divê koçberî bêne sepandin deployDump. Ev dihêle hûn hemî guheztinan di strukturê de bikin û rewşên pirsgirêk çareser bikin da ku guhertinên di prosedurên hilanîn de paşê bêyî pirsgirêk werin veguheztin.

Karkirina bi koçberan re dê di beşên jêrîn de bi hûrgulî were vegotin.

Meriv çawa pêvajoya xebata paralel li ser projeyek ji hêla çend pêşdebiran ve organîze dike

Необходимо создать скрипт полной инициализации БД, который будет запускаться разработчиком на своей рабочей машине, приводя структуру локальной БД в соответствие с сохраненным в VCS дампом. Проще всего разделить инициализацию локальной БД на 3 шага:

  1. Dosyayek bi avahiyek bingehîn ku dê jê re were gotin wek mînak. base.sql
  2. Применение миграций
  3. Rallenge deployDump

base.sql xala destpêkê ye ku li ser serê wê koçberî têne sepandin û pêkanîn deployDumpew e base.sql + миграции + deployDump = актуальная структура БД. Сформировать такой файл можно с помощью утилиты pg_dump. Bikaranîn base.sql bi taybetî dema destpêkirina databasê ji sifirê.

Ka em ji skrîptê re ji bo destpêkirina databasa bêkêmasî bang bikin refresh.sh. Rêzeya xebatê dikare bi vî rengî xuya bike:

  1. Pêşdebir di hawîrdora xwe de dest pê dike refresh.sh û avahiya databasa heyî distîne
  2. Разработчик начинает работу над поставленной задачей, модифицируя локальную БД под нужды нового функционала (ALTER TABLE ... ADD COLUMN hwd)
  3. Piştî qedandina peywirê, pêşdebir gazî fonksiyonê dike saveDumpji bo guherandinên ku di databasa di VCS de hatine çêkirin pêk bînin
  4. Разработчик повторно запускает refresh.shhingê verifyDumpku naha navnîşek guheztinan nîşan dide ku di nav koçberiyê de tê de hebe
  5. Pêşvebir hemî guhertinên strukturê vediguhezîne pelê koçberiyê, dîsa dimeşîne refresh.sh и verifyDump, û, heke koçberî rast were berhev kirin, verifyDump dê ti cûdahiyên di navbera databasa herêmî û dakêşana tomarkirî de nîşan nede

Pêvajoya ku li jor hatî destnîşan kirin bi prensîbên gitflow re hevaheng e. Her şaxek di VCS-ê de dê guhertoya xweya çolê hebe, û dema ku şaxên hev bikin, dê dûvik werin yek kirin. Di pir rewşan de, piştî hevgirtinê ne hewce ye ku tedbîrek zêde were girtin, lê heke di şaxên cihêreng de, mînakî, li heman maseyê, guhertin hatin çêkirin, dibe ku nakokî derkeve.

Werin em bi mînakek rewşek nakokî bifikirin: şaxek heye pêşvebirin, ku du şax jê diqetin: taybetmendiya1 и taybetmendiya2, ku tu nakokiyên wan tune pêşvebirin, lê bi hev re nakokî hene. Erk ew e ku herdu şax di nav hev de bibin yek pêşvebirin. Ji bo vê rewşê, tê pêşniyar kirin ku pêşî yek ji şaxan têxin nav hev pêşvebirinû paşê li hev bikin pêşvebirin ji şaxê mayî re, nakokiyên di şaxê mayî de çareser dike, û dûv re şaxa paşîn di nav hev de dike pêşvebirin. Di qonaxa çareseriya nakokî de, dibe ku hûn neçar bin ku pelê koçberiyê di şaxê paşîn de rast bikin da ku ew bi qutiya dawîn, ya ku encamên hevgirtinê tê de vedihewîne, rast bike.

Meriv çawa bi ewlehî bêtir guhertinên di avahiya databasê de li hawîrdorek hilberînê bicîh dike

Благодаря наличию в VCS дампа актуальной структуры БД появляется возможность проверить production-базу на точное соответствие требуемой структуре. Это гарантирует, что на production-базу успешно перенеслись все изменения, которые задумывали разработчики.

ji ber ku DDL di PostgreSQL de ye muamele, рекомендуется придерживаться следующего порядка деплоя, чтобы, в случае непредвиденной ошибки, «безболезненно» выполнить ROLLBACK:

  1. Danûstendinê dest pê bikin
  2. Hemî koçberan di danûstendinê de pêk bînin
  3. Di heman danûstandinê de, bicîh bikin deployDump
  4. Bêyî ku danûstendinê biqedînin, pêk bînin verifyDump. Heke xeletî tune, birevin COMMIT. Ger xeletî hene, birevin ROLLBACK

Van gavan dikarin bi hêsanî di nav nêzîkatiyên heyî yên ji bo bicîhkirina serîlêdanê de, tevî zero-downtime, bêne yek kirin.

encamê

Bi saya rêbazên ku li jor hatine destnîşan kirin, gengaz e ku meriv performansa herî zêde ji projeyên "PHP + PostgreSQL" derxîne, di heman demê de fedakariya rehetiya pêşkeftinê ya nisbeten hindik li gorî pêkanîna hemî mantiqa karsaziyê di koda serîlêdana sereke de dike. Wekî din, pêvajoyek daneyê di nav de PL/pgSQL pir caran zelaltir xuya dike û ji heman fonksiyonê ku di PHP-ê de hatî nivîsandin kêmtir kod hewce dike.

Source: www.habr.com

Add a comment