Business Logik an der Datebank benotzt SchemaKeeper

Den Zweck vun dësem Artikel ass d'Beispill vun enger Bibliothéik ze benotzen schema-keeper weisen Tools déi de Prozess vun der Entwécklung vun Datenbanken bannent PHP-Projete mat der PostgreSQL DBMS wesentlech vereinfachen kënnen.

D'Informatioun aus dësem Artikel wäert fir d'éischt nëtzlech sinn fir Entwéckler déi de gréissten Deel vun de PostgreSQL Fäegkeeten maache wëllen, awer mat Probleemer konfrontéiert sinn fir d'Geschäftslogik an der Datebank z'erhalen.

Dësen Artikel wäert d'Virdeeler oder Nodeeler net beschreiwen fir Geschäftslogik an enger Datebank ze späicheren. Et gëtt ugeholl datt d'Wiel scho vum Lieser gemaach gouf.

Déi folgend Froen wäerte berücksichtegt ginn:

  1. A wéi enger Form soll eng Datebankstruktur Dump an engem Versiounskontrollsystem gespäichert ginn (nodréiglech VCS bezeechent)
  2. Wéi verfollegen ech Ännerungen an der Datebank Struktur nodeems Dir en Dump späichert
  3. Wéi Transfermaart Ännerungen an der Datebank Struktur an aner Ëmfeld ouni Konflikter a Ris Migratioun Fichieren
  4. Wéi de Prozess vun parallel Aarbecht op engem Projet vun e puer Entwéckler ze organiséieren
  5. Wéi sécher méi Ännerungen an der Datebankstruktur an e Produktiounsëmfeld z'installéieren

    SchemaKeeper entworf fir mat gespäichert Prozeduren ze schaffen, déi an der Sprooch geschriwwe sinn PL/pgSQL. Testen mat anere Sprooche gouf net duerchgefouert, sou datt d'Benotzung vläicht net sou effektiv ass oder net méiglech ass.

Wéi späichert een eng Datebankstruktur Dump am VCS

Bibliothéik schema-keeper stellt eng Funktioun saveDump, déi d'Struktur vun all Objeten aus der Datebank als separat Textdateien späichert. Den Ausgang ass e Verzeechnes mat der Datebankstruktur, opgedeelt a gruppéiert Dateien déi einfach op VCS bäigefüügt kënne ginn.

Loosst eis d'Konvertéierung vun Objeten aus enger Datebank an Dateien mat e puer Beispiller kucken:

Objet Typ
De Schema
Titelen
Relativ Wee fir Datei

Dësch
ëffentlechen
Benotzerkonten
./public/tables/accounts.txt

Gespäichert Prozedur
ëffentlechen
auth (hash bigint)
./public/functions/auth(int8).sql

Aféierung
Réservatioun
tariffer
./booking/views/tariffs.txt

Den Inhalt vun de Dateien ass eng textuell Representatioun vun der Struktur vun engem spezifesche Datebankobjekt. Zum Beispill, fir gespäichert Prozeduren, wäert den Inhalt vun der Datei déi voll Definitioun vun der gespäichert Prozedur sinn, ugefaange mam Block CREATE OR REPLACE FUNCTION.

Wéi kann aus der Tabell uewen gesi ginn, späichert de Wee op d'Datei Informatioun iwwer den Typ, Schema an Numm vum Objet. Dës Approche mécht et méi einfach duerch den Dump a Code Iwwerpréiwung vun Ännerungen an der Datebank ze navigéieren.

Extensioun .sql fir Dateien mat gespäichert Prozedur Quellcode, dëst gouf ausgewielt sou datt d'IDE automatesch Tools ubitt fir mat der Datebank ze interagéieren wann d'Datei opgemaach gëtt.

Wéi verfollegen ech Ännerungen an der Datebank Struktur nodeems Dir en Dump späichert

Andeems Dir en Dump vun der aktueller Datebankstruktur am VCS späichert, kréie mir d'Méiglechkeet fir ze kontrolléieren ob Ännerungen an der Datebankstruktur gemaach goufen nodeems den Dump erstallt gouf. An der Bibliothéik schema-keeper fir Ännerungen an der Datebankstruktur z'entdecken, gëtt eng Funktioun zur Verfügung gestallt verifyDump, déi Informatioun iwwer d'Ënnerscheeder zréckginn ouni Nebenwirkungen.

Eng alternativ Manéier fir ze kontrolléieren ass d'Funktioun erëm ze ruffen saveDump, déi selwecht Verzeechnes uginn, a kuckt an VCS fir Ännerungen. Well all Objete vun der Datebank an getrennten Dateie gespäichert sinn, wäert VCS nëmmen geännert Objete weisen.
Den Haaptnodeel vun dëser Method ass de Besoin fir Dateien ze iwwerschreiwe fir d'Ännerungen ze gesinn.

Wéi Transfermaart Ännerungen an der Datebank Struktur an aner Ëmfeld ouni Konflikter a Ris Migratioun Fichieren

Dank der Funktioun deployDump De Quellcode vu gespäichert Prozedure kann op genee déiselwecht Manéier wéi de reguläre Applikatiounsquellcode geännert ginn. Dir kënnt nei Zeilen am gespäicherten Prozedurcode addéieren / läschen an direkt Ännerungen op Versiounskontroll drécken, oder gespäichert Prozeduren erstellen / läschen andeems Dir déi entspriechend Dateien am Dump-Verzeichnis erstellt / läschen.

Zum Beispill fir eng nei gespäichert Prozedur an engem Schema ze kreéieren public erstellt just eng nei Datei mat der Extensioun .sql am Verzeechnes public/functions, Plaz de Quellcode vun der gespäichert Prozedur dran, dorënner de Block CREATE OR REPLACE FUNCTION, rufft dann d'Funktioun un deployDump. Änneren an läschen vun enger gespäichert Prozedur geschitt op déiselwecht Manéier. Also geet de Code souwuel an de VCS wéi och an d'Datebank zur selwechter Zäit.

Wann e Feeler am Quellcode vun enger gespäicherter Prozedur erschéngt, oder eng Diskrepanz tëscht den Nimm vun der Datei an der gespäicherter Prozedur, dann deployDump wäert versoen, weist Feeler Text. Mëssverständnis vu gespäichert Prozeduren tëscht dem Dump an der aktueller Datebank ass onméiglech wann Dir benotzt deployDump.

Wann Dir eng nei gespäichert Prozedur erstellt, ass et net néideg de richtege Dateinumm manuell anzeginn. Et ass genuch fir d'Datei d'Extensioun ze hunn .sql. Nom Uruff deployDump de Feelertext enthält de richtegen Numm, dee benotzt ka ginn fir d'Datei ëmbenennen.

deployDump erlaabt Iech d'Parameter vun enger Funktioun oder Retourtyp ouni zousätzlech Handlungen z'änneren, wärend mat der klassescher Approche musst Dir
éischt ausféieren DROP FUNCTION, an nëmmen dann CREATE OR REPLACE FUNCTION.

Leider ginn et e puer Situatiounen wou deployDump kann net automatesch Ännerungen applizéieren. Zum Beispill, wann eng Ausléiserfunktioun, déi vun mindestens engem Ausléiser benotzt gëtt, ewechgeholl gëtt. Esou Situatioune ginn manuell mat Migratiounsdateien geléist.

Wann Dir verantwortlech sidd fir Ännerungen op gespäichert Prozeduren ze migréieren schema-keeper, da musse Migratiounsdateien benotzt ginn fir aner Ännerungen an der Struktur ze transferéieren. Zum Beispill, eng gutt Bibliothéik fir mat Migratiounen ze schaffen ass Doktrin / Migratiounen.

Migratioune musse virum Start applizéiert ginn deployDump. Dëst erlaabt Iech all Ännerungen un der Struktur ze maachen an problematesch Situatiounen ze léisen, sou datt Ännerungen an de gespäicherte Prozeduren duerno ouni Probleemer transferéiert ginn.

D'Aarbecht mat Migratiounen wäert méi am Detail an de folgende Rubriken beschriwwe ginn.

Wéi de Prozess vun parallel Aarbecht op engem Projet vun e puer Entwéckler ze organiséieren

Et ass néideg fir e Skript fir d'komplett Initialiséierung vun der Datebank ze kreéieren, déi vum Entwéckler op senger Aarbechtsmaschinn lancéiert gëtt, d'Struktur vun der lokaler Datebank am Aklang mat dem Dump gespäichert am VCS ze bréngen. Deen einfachste Wee ass d'Initialiséierung vun der lokaler Datebank an 3 Schrëtt opzedeelen:

  1. Importéiert e Fichier mat enger Basisstruktur déi z.B. base.sql
  2. Migratiounen uwenden
  3. Rufft deployDump

base.sql ass de Startpunkt op deem d'Migratiounen applizéiert an ausgefouert ginn deployDump, dat ass base.sql + миграции + deployDump = актуальная структура БД. Dir kënnt esou eng Datei mat dem Utility erstellen pg_dump. Benotzt base.sql exklusiv wann Dir d'Datebank vun Null initialiséiert.

Loosst eis de Skript fir eng komplett Datebankinitialiséierung nennen refresh.sh. De Workflow kéint esou ausgesinn:

  1. Den Entwéckler lancéiert a sengem Ëmfeld refresh.sh a kritt déi aktuell Datebankstruktur
  2. Den Entwéckler fänkt un der Aarbecht un der Hand ze schaffen, ännert d'lokal Datebank fir d'Bedierfnesser vun der neier Funktionalitéit ze treffen (ALTER TABLE ... ADD COLUMN etc)
  3. Nodeems d'Aufgab ofgeschloss ass, rifft den Entwéckler d'Funktioun saveDumpÄnnerungen an der Datebank am VCS ze engagéieren
  4. Entwéckler relancéiert refresh.sh, dann verifyDumpdéi elo eng Lëscht vun Ännerungen weist fir an der Migratioun opzehuelen
  5. Den Entwéckler transferéiert all Strukturännerungen an d'Migratiounsdatei, leeft erëm refresh.sh и verifyDump, a wann d'Migratioun richteg kompiléiert ass, verifyDump wäert keng Differenzen tëscht der lokaler Datebank an dem gespäicherten Dump weisen

De Prozess uewen beschriwwen ass kompatibel mat Gitflow Prinzipien. All Branche am VCS wäert seng eege Versioun vum Dump enthalen, a wann Dir Filialen fusionéiert, ginn d'Dumps fusionéiert. An deene meeschte Fäll brauche keng zousätzlech Handlung no enger Fusioun ze huelen, awer wann Ännerungen a verschiddene Branchen gemaach goufen, zum Beispill op déiselwecht Dësch, kann e Konflikt entstoen.

Loosst eis eng Konfliktsituatioun mat engem Beispill betruechten: et gëtt eng Branche entwéckelen, aus deenen zwou Branchen ofstrecken: Feature1 и Feature2, déi hu keng Konflikter mat entwéckelen, mee hu Konflikter mat all aner. D'Aufgab ass déi zwee Filialen ze fusionéieren entwéckelen. An dësem Fall ass et recommandéiert fir d'éischt eng vun de Branchen ze fusionéieren entwéckelenan dann fusionéieren entwéckelen op déi verbleiwen Branche, Konflikter an der verbleiwen Branche léisen, an dann déi lescht Branche fusionéieren an entwéckelen. Wärend der Konfliktléisungsphase musst Dir vläicht d'Migratiounsdatei an der leschter Branche fixéieren, sou datt et mat dem finalen Dump passt, deen d'Resultater vun de Fusioune enthält.

Wéi sécher méi Ännerungen an der Datebankstruktur an e Produktiounsëmfeld z'installéieren

Duerch d'Präsenz vun engem Dump vun der aktueller Datebankstruktur am VCS gëtt et méiglech d'Produktiounsdatenbank fir genau Konformitéit mat der erfuerderter Struktur ze kontrolléieren. Dëst garantéiert datt all d'Ännerungen, déi d'Entwéckler geduecht hunn, erfollegräich op d'Produktiounsbasis transferéiert goufen.

zënter DDL am PostgreSQL ass transaktionell, et ass recommandéiert fir déi folgend Deployment Uerdnung ze halen, sou datt Dir am Fall vun engem onerwaarte Feeler "schmerzlos" ausféiere kënnt ROLLBACK:

  1. Start Transaktioun
  2. Féiert all Migratiounen an enger Transaktioun
  3. An der selwechter Transaktioun, ausféieren deployDump
  4. Ouni d'Transaktioun ofzeschléissen, ausféieren verifyDump. Wann et keng Feeler sinn, lafen COMMIT. Wann et Feeler sinn, lafen ROLLBACK

Dës Schrëtt kënne ganz einfach an existéierend Approche fir d'Applikatiounsdeployment integréiert ginn, och Null-Downtime.

Konklusioun

Dank de uewe beschriwwene Methoden ass et méiglech maximal Leeschtung aus "PHP + PostgreSQL" Projeten auszedrécken, wärend relativ wéineg Entwécklungsbequemlechkeet am Verglach mat der Ëmsetzung vun der ganzer Geschäftslogik am Haaptapplikatiounscode geaffert gëtt. Ausserdeem, Datenveraarbechtung an PL/pgSQL gesäit dacks méi transparent aus a brauch manner Code wéi déiselwecht Funktionalitéit, déi an PHP geschriwwe gëtt.

Source: will.com

Setzt e Commentaire