Naar hoofdinhoud gaan

Database

De ChurchApps API maakt gebruik van een database-per-module architectuur. Elk van de zes modules heeft zijn eigen MySQL-database met een onafhankelijke verbindingsgroep, wat duidelijke gegevensgrenzen biedt terwijl alles binnen één implementatie blijft.

Voordat je begint

Architectuuroverzicht​

Api
├── membership_db ← Mensen, groepen, machtigingen
├── attendance_db ← Diensten, sessies, verslagen
├── content_db ← Pagina's, secties, elementen
├── giving_db ← Donaties, fondsen, betalingen
├── messaging_db ← Gesprekken, berichten
└── doing_db ← Taken, plannen, toewijzingen

Belangrijkste ontwerpbeslissingen​

  • Één database per module -- Elke module onderhoudt zijn eigen MySQL-database met een specifieke verbindingsgroep (EnhancedPoolHelper). Dit houdt modules ontkoppeld en stelt onafhankelijke schemaontwikkeling in staat.
  • Opslagpatroon met direct SQL -- Er is geen ORM. Alle gegevenstoegang gaat door opslagklassen die direct SQL gebruiken met DB.query(). Dit geeft volledige controle over queryprestaties en gedrag.
  • Multi-tenant door ontwerp -- Elke query wordt bereikt door churchId. Alle tabellen bevatten een churchId kolom, en de opslaglaag dwingst automatisch tennantencryptie af.

Verbindingsreeksen​

Elke databaseverbinding van de module wordt in .env geconfigureerd met het standaard MySQL-verbindingsreeksformaat:

mysql://user:password@host:port/database

Een lokale ontwikkelingsinstellingen kunnen er als volgt uitzien:

MEMBERSHIP_DB=mysql://root:password@localhost:3306/churchapps_membership
ATTENDANCE_DB=mysql://root:password@localhost:3306/churchapps_attendance
CONTENT_DB=mysql://root:password@localhost:3306/churchapps_content
GIVING_DB=mysql://root:password@localhost:3306/churchapps_giving
MESSAGING_DB=mysql://root:password@localhost:3306/churchapps_messaging
DOING_DB=mysql://root:password@localhost:3306/churchapps_doing
info

In productie worden verbindingsreeksen opgeslagen in AWS SSM Parameterarchief en door de Environment klasse bij het opstarten gelezen.

Schemascripts​

Databaseschemaafscriften bevinden zich in de tools/dbScripts/ map, georganiseerd per module:

tools/dbScripts/
├── membership/
├── attendance/
├── content/
├── giving/
├── messaging/
└── doing/

Deze scripts definiëren tabelcreatie, indexen en alle noodzakelijke zaadgegevens.

Database-initialisatie​

Alle databases initialiseren​

npm run initdb

Dit maakt alle zes databases aan en voert de schemaafscriften voor elk uit.

Één module initialiseren​

npm run initdb:membership
npm run initdb:attendance
npm run initdb:content
npm run initdb:giving
npm run initdb:messaging
npm run initdb:doing
tip

Wanneer u aan een bepaalde module werkt, kunt u alleen de database van die module opnieuw initialiseren zonder de anderen te beïnvloeden.

Gegevenstoegangspatroon​

Opslagplaatsen hebben toegang tot gegevens via de DB.query() methode. Een typische opslagmethode ziet er als volgt uit:

public async loadByChurchId(churchId: string) {
return DB.query("SELECT * FROM people WHERE churchId=?", [churchId]);
}

Opslagplaatsen worden verkregen via RepositoryManager:

const repos = RepositoryManager.getRepositories<MembershipRepositories>("membership");
const people = await repos.person.loadByChurchId(churchId);
waarschuwing

Neem altijd churchId in uw vragen op om multi-tenant isolatie te behouden. Voer nooit query's uit op meerdere tennants tenzij je een specifieke, geautoriseerde reden hebt om dit te doen.

Gerelateerde artikelen​