abbiamo una struttura di progetto come la seguente
Il modulo"module-shared" dipende dal modulo "module-database" e alcuni altri moduli dipendono dal "module-shared" ma nessun altro modulo dipende da "module-database".
Tutti gli script SQL di DML sono memorizzati in "module-shared" ma DDL sono memorizzati in "module-database".
- Il vantaggio di questo design è che
non è necessario rilasciare il database se le modifiche riguardano DML in "module-shared" e utilizzare i test di integrazione del database per accertarsi che siano ancora compatibili.
- Lo svantaggio è che
questo crea alcune confusioni sulle versioni. Ad esempio è possibile avere "module-shared" 2.3.1 dipende da "module-database" 1.4.2 e alla fine dimenticheremo quale versione è compatibile con quale.
Domande:
Sarebbe un progetto migliore se avessimo un "module-database" che contenga sia DDL e DML (e tutte le altre operazioni di database se esistenti) sia che il modulo condiviso contenga tutto ciò che aveva tranne le operazioni del database?
Quali sono le tue esperienze nell'avere architetture multi-livello? usi sempre i moduli per separare i livelli? Hai esperienze in cui potresti avere DAO e servizi nello stesso modulo? Se lo fai, dove hai mantenuto gli script di schema DDL?
UPDATE: dimentica di menzionare che il DDL è sottoposto a versioning usando il sistema di controllo delle versioni degli script del database come flyway. In modo che tutte le modifiche DDL siano incrementali
Nota: ad es. un modulo potrebbe essere un modulo gradle, modulo Maven, ecc.
Nota: sto facendo del mio meglio per non essere prevenuto mentre faccio questa domanda. Quindi supponiamo che non abbia alcuna preferenza su nessuna delle due soluzioni. :)