Logika bisnis dina pangkalan data nganggo SchemaKeeper

Tujuan tina artikel ieu nyaéta ngagunakeun conto perpustakaan schema-panjaga nunjukkeun alat anu tiasa nyederhanakeun prosés ngembangkeun database dina proyék PHP nganggo PostgreSQL DBMS.

Inpormasi tina tulisan ieu, mimitina, bakal mangpaat pikeun pamekar anu hoyong ngamangpaatkeun kamampuan PostgreSQL, tapi disanghareupan masalah ngajaga logika bisnis disimpen dina pangkalan data.

Artikel ieu moal ngajelaskeun kaunggulan atawa kalemahan tina nyimpen logika bisnis dina database a. Hal ieu dianggap yén pilihan geus dijieun ku nu maca.

Patarosan di handap ieu bakal dianggap:

  1. Dina bentuk naon dump struktur database kedah disimpen dina sistem kontrol versi (saterusna disebut VCS)
  2. Kumaha lagu parobahan dina struktur database sanggeus nyimpen dump a
  3. Kumaha cara nransper parobahan dina struktur database ka lingkungan anu sanés tanpa konflik sareng file migrasi raksasa
  4. Kumaha ngatur prosés gawé paralel dina proyék ku sababaraha pamekar
  5. Kumaha cara aman nyebarkeun langkung seueur parobahan dina struktur database ka lingkungan produksi

    SchemaKeeper dirancang pikeun gawé bareng prosedur disimpen ditulis dina basa PL/pgSQL. Uji coba sareng basa sanés teu acan dilaksanakeun, janten panggunaan tiasa henteu efektif atanapi henteu mungkin.

Kumaha nyimpen hiji dump struktur database di VCS

taman pustaka schema-panjaga nyadiakeun fungsi saveDump, anu nyimpen struktur sadaya objék tina pangkalan data salaku file téks anu misah. Kaluaran mangrupikeun diréktori anu ngandung struktur pangkalan data, dibagi kana file anu dikelompokeun anu tiasa gampang ditambah kana VCS.

Hayu urang tingali ngarobih objék tina pangkalan data kana file nganggo sababaraha conto:

Jenis objék
Skéma
nami
Jalur relatif ka file

meja
masarakat
akun
./public/tables/accounts.txt

Prosedur disimpen
masarakat
auth (hash bigint)
./public/functions/auth(int8).sql

gagasan
booking
tariffs
./booking/views/tariffs.txt

Eusi file mangrupikeun répréséntasi tékstual tina struktur objék database anu khusus. Salaku conto, pikeun prosedur anu disimpen, eusi file bakal janten definisi lengkep ngeunaan prosedur anu disimpen, dimimitian ku blok CREATE OR REPLACE FUNCTION.

Sapertos tiasa ditingali tina tabel di luhur, jalur ka file nyimpen inpormasi ngeunaan jinis, skéma sareng nami obyék. Pendekatan ieu ngagampangkeun pikeun nganapigasi kana dump sareng ulasan kode ngeunaan parobahan dina pangkalan data.

ngahadean .sql pikeun file kalawan kode sumber prosedur disimpen, ieu dipilih ku kituna IDE otomatis nyadiakeun parabot pikeun interacting jeung database nalika file dibuka.

Kumaha lagu parobahan dina struktur database sanggeus nyimpen dump a

Ku nyimpen hiji dump struktur database ayeuna di VCS, urang meunang kasempetan pikeun pariksa naha parobahan dijieun kana struktur database sanggeus dump dijieun. Di perpustakaan schema-panjaga pikeun ngadeteksi parobahan dina struktur database, fungsi disadiakeun verifyDump, nu mulih informasi ngeunaan béda tanpa efek samping.

Cara alternatif pikeun mariksa nyaéta nelepon deui fungsina saveDump, nangtukeun diréktori sarua, sarta pariksa dina VCS pikeun parobahan. Kusabab sadaya obyék tina pangkalan data disimpen dina file anu misah, VCS ngan ukur nunjukkeun obyék anu dirobih.
Karugian utama metode ieu nyaéta kabutuhan nimpa file supados ningali parobihan.

Kumaha cara nransper parobahan dina struktur database ka lingkungan anu sanés tanpa konflik sareng file migrasi raksasa

Hatur nuhun kana fungsi deployDump Kodeu sumber tina prosedur anu disimpen tiasa diédit dina cara anu sami sareng kode sumber aplikasi biasa. Anjeun tiasa nambihan / mupus garis anyar dina kode prosedur anu disimpen sareng langsung nyorong parobihan kana kontrol versi, atanapi ngadamel / ngahapus prosedur anu disimpen ku cara nyiptakeun / ngahapus file anu aya dina diréktori dump.

Contona, pikeun nyieun prosedur disimpen anyar dina schema a public ngan nyieun file anyar jeung extension .sql dina diréktori public/functions, nempatkeun kodeu sumber tina prosedur disimpen di dinya, kaasup blok CREATE OR REPLACE FUNCTION, teras nelepon fungsi deployDump. Ngaropéa sareng mupus prosedur anu disimpen lumangsung dina cara anu sami. Ku kituna, kode mana kana duanana VCS jeung database dina waktos anu sareng.

Upami kasalahan muncul dina kode sumber tina prosedur anu disimpen, atanapi aya bédana antara nami file sareng prosedur anu disimpen, teras deployDump bakal gagal, mintonkeun téks kasalahan. Mmatch tina prosedur disimpen antara dump jeung database ayeuna teu mungkin lamun ngagunakeun deployDump.

Nalika nyiptakeun prosedur anu disimpen énggal, henteu kedah sacara manual ngalebetkeun nami file anu leres. Ieu cukup pikeun file gaduh ekstensi .sql. Sanggeus nelepon deployDump téks kasalahan bakal ngandung ngaran bener, nu bisa dipaké pikeun ngaganti ngaran file.

deployDump ngidinan Anjeun pikeun ngarobah parameter tina hiji fungsi atawa tipe balik tanpa lampah tambahan, bari jeung pendekatan klasik anjeun bakal kudu
laksanakeun heula DROP FUNCTION, sarta ngan lajeng CREATE OR REPLACE FUNCTION.

Hanjakal, aya sababaraha kaayaan dimana deployDump teu bisa otomatis nerapkeun parobahan. Contona, upami fungsi pemicu nu dipaké ku sahanteuna hiji pemicu dihapus. Kaayaan sapertos kitu direngsekeun sacara manual nganggo file migrasi.

Upami anjeun tanggung jawab migrasi parobahan kana prosedur anu disimpen schema-panjaga, teras file migrasi kedah dianggo pikeun mindahkeun parobahan anu sanés dina struktur. Salaku conto, perpustakaan anu saé pikeun damel sareng migrasi nyaéta doktrin / migrasi.

Migrasi kedah diterapkeun sateuacan peluncuran deployDump. Hal ieu ngamungkinkeun anjeun ngadamel sagala parobihan kana struktur sareng ngabéréskeun kaayaan masalah supados parobihan dina prosedur anu disimpen teras-terasan ditransfer tanpa masalah.

Gawe sareng migrasi bakal dijelaskeun langkung rinci dina bagian di handap ieu.

Kumaha ngatur prosés gawé paralel dina proyék ku sababaraha pamekar

Perlu nyieun naskah pikeun initialization lengkep database, nu bakal dibuka ku pamekar dina mesin karyana, bringing struktur database lokal luyu jeung dump disimpen dina VCS. Cara panggampangna nyaéta ngabagi inisialisasi pangkalan data lokal kana 3 léngkah:

  1. Impor file kalawan struktur dasar nu bakal disebut e.g. base.sql
  2. Nerapkeun Migrasi
  3. nelpon deployDump

base.sql nyaéta titik awal di luhur mana migrasi diterapkeun sareng dieksekusi deployDump, Nyaeta base.sql + миграции + deployDump = актуальная структура БД. Anjeun tiasa nyiptakeun file sapertos kitu nganggo utilitas pg_dump. Dipaké base.sql éksklusif nalika initializing database ti scratch.

Hayu urang nelepon naskah pikeun initialization database lengkep refresh.sh. Alur kerja tiasa sapertos kieu:

  1. pamekar ngajalankeun di lingkunganana refresh.sh tur meunangkeun struktur database ayeuna
  2. Pamekar ngamimitian ngerjakeun tugas anu dipikabutuh, ngarobih pangkalan data lokal pikeun nyumponan kabutuhan fungsionalitas énggal (ALTER TABLE ... ADD COLUMN jsb)
  3. Saatos ngalengkepan tugas, pamekar nelepon fungsi saveDumppikeun ngalakukeun parobahan anu dilakukeun kana pangkalan data dina VCS
  4. Pamekar ulang refresh.shsaterusna verifyDumpnu ayeuna nembongkeun daptar parobahan kaasup dina migrasi
  5. Pamekar mindahkeun sadaya parobahan struktur kana file migrasi, jalan deui refresh.sh и verifyDump, sareng, upami migrasi disusun leres, verifyDump bakal nembongkeun euweuh béda antara database lokal jeung dump disimpen

Prosés anu dijelaskeun di luhur cocog sareng prinsip gitflow. Unggal cabang dina VCS bakal ngandung versi sorangan tina dump, sarta lamun merging cabang, dumps bakal dihijikeun. Dina kalolobaan kasus, euweuh aksi tambahan kudu dilaksanakeun sanggeus ngahiji, tapi lamun parobahan dijieun dina cabang béda, contona dina tabel sarua, konflik bisa timbul.

Hayu urang nganggap kaayaan konflik ngagunakeun conto: aya cabang ngawangun, ti mana dua cabangna: tampok1 и tampok2, nu teu boga konflik kalawan ngawangun, tapi gaduh konflik saling. Tugasna nyaéta ngahijikeun dua cabang kana ngawangun. Pikeun hal ieu, disarankeun pikeun ngahijikeun heula salah sahiji cabang kana ngawangunterus ngahiji ngawangun ka cabang sésana, resolving konflik dina cabang sésana, lajeng merging cabang panungtungan kana ngawangun. Salila fase resolusi konflik, Anjeun bisa jadi kudu ngalereskeun file migrasi dina cabang panungtungan meh cocog dump final, nu ngawengku hasil merges.

Kumaha cara aman nyebarkeun langkung seueur parobahan dina struktur database ka lingkungan produksi

Hatur nuhun kana ayana dump tina struktur database ayeuna di VCS, janten mungkin pikeun pariksa database produksi pikeun minuhan pasti jeung struktur diperlukeun. Ieu mastikeun yén sadaya parobihan anu ditujukeun ku pamekar parantos suksés ditransfer ka pangkalan produksi.

ti mimiti DDL dina PostgreSQL nyaeta transaksional, Disarankeun pikeun taat kana urutan panyebaran di handap ieu, ku kituna, upami aya kasalahan anu teu disangka-sangka, anjeun tiasa "henteu nyeri" ngaéksekusi. ROLLBACK:

  1. Mimitian transaksi
  2. Laksanakeun sadaya migrasi dina transaksi
  3. Dina urus sarua, laksana deployDump
  4. Tanpa ngalengkepan transaksi, laksanakeun verifyDump. Upami teu aya kasalahan, jalankeun COMMIT. Upami aya kasalahan, jalankeun ROLLBACK

Léngkah-léngkah ieu tiasa gampang diintegrasikeun kana pendekatan anu aya pikeun panyebaran aplikasi, kalebet nol-downtime.

kacindekan

Hatur nuhun kana métode ditétélakeun di luhur, kasebut nyaéta dimungkinkeun pikeun squeeze kinerja maksimum kaluar tina "PHP + PostgreSQL" proyék, bari kurban rélatif saeutik genah ngembangkeun dibandingkeun ngalaksanakeun sagala logika bisnis dina kode aplikasi utama. Leuwih ti éta, ngolah data dina PL/pgSQL mindeng kasampak leuwih transparan sarta merlukeun kode kirang ti fungsionalitas sarua ditulis dina PHP.

sumber: www.habr.com

Tambahkeun komentar