[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f2ls8qiv4z7na0":3,"$f36ks0hyptmpuz":157},{"data":4},[5],{"id":6,"slug":7,"locale":8,"type":9,"title":10,"subtitle":11,"summary":12,"body":13,"primary_topic":14,"knowledge_status":15,"practical_validation":16,"workflow_status":17,"author_id":18,"published_at":19,"updated_at":19,"review_due_at":20,"canonical_url":21,"seo_title":10,"seo_description":12,"hero_asset_id":20,"reading_time":22,"version":23,"technology_versions":24,"review_frequency_days":25,"parent_content_id":26,"sort_in_parent":27,"hub_entry_status":28,"content_blocks":29,"hero_alt_text":21,"hero_caption":21,"hero_credit":21,"publication_scope":147,"access_level":148,"approved_at":149,"approved_by":150,"review_note":21,"home_enabled":151,"home_slot":152,"home_variant":153,"home_priority":154,"home_eyebrow":20,"home_valid_from":20,"home_valid_to":20,"home_image_asset_id":20,"promotion_kind":155,"sponsor_name":20,"sponsor_url":20,"sponsor_disclosure":156},"e7f7808e-a670-4b40-85df-1699f9be6b87","modernizzazione-legacy-sanitario-cqrs-read-model-bff","it","CAPSULE","CQRS, Read Model e BFF: comporre viste senza join tra database","Separare il modello di scrittura dalle esigenze di lettura e costruire viste aggregate senza violare l'ownership dei dati.","CQRS, Read Model, API Composition e BFF permettono UI e reporting ricchi senza accessi SQL diretti tra bounded context.","Il problema\nUna UI sanitaria può dover mostrare identità paziente, episodio, letto, ordini e ultimi documenti nella stessa schermata. Se ogni contesto possiede il proprio database, la tentazione è creare un database condiviso di nuovo o consentire join cross-schema. Questo annulla il Data Ownership.\nAPI Composition\nUn BFF o servizio di composizione può interrogare in parallelo le API dei proprietari e assemblare una risposta orientata alla schermata. È adatto quando il numero di fonti è limitato, i dati devono essere freschi e la latenza resta sotto controllo.\nRead Model\nPer dashboard, liste ad alto volume, ricerca o reporting può essere meglio mantenere una proiezione denormalizzata costruita dagli eventi. Il Read Model è derivato: non è source of truth e può essere ricostruito dai dati\u002Feventi autorevoli.\nCQRS\nCommand Query Responsibility Segregation separa il modello usato per cambiare lo stato da quello usato per leggerlo. Non implica necessariamente Event Sourcing e non richiede due tecnologie diverse. Significa che il modello di scrittura protegge invarianti mentre il modello di lettura è ottimizzato per le query.\nBFF\nIl Backend for Frontend espone API pensate per un particolare frontend o Application Shell. Può comporre dati, propagare identità\u002Fautorizzazioni e ridurre round trip. Non deve diventare il luogo dove si decidono ricoveri, ordini o regole cliniche: quelle restano nei bounded context.\nEsempio\nEMPI espone identità canonica.\n\nADT espone episodio corrente.\n\nBed Management espone occupazione.\n\nOrder Entry espone ordini aperti.\n\nUn Patient Workspace Read Model combina gli eventi necessari e serve rapidamente la home clinica.\n\nConsistenza\nUna proiezione asincrona può essere leggermente in ritardo. L'interfaccia deve tollerarlo e, per dati critici che richiedono conferma immediata, può interrogare direttamente il source of truth. CQRS non elimina la necessità di decidere quali informazioni possono essere eventualmente consistenti.\nReporting\nAnche il reporting dovrebbe consumare API\u002Fproiezioni dedicate invece di replicare l'intero catalogo di controller o interrogare direttamente i database degli altri servizi. Questo consente di evolvere i domini senza rompere centinaia di report.\n\nCQRS non è sinonimo di Event Sourcing: si può usare una semplice proiezione PostgreSQL e ottenere già il vantaggio di separare ownership e query.","58ba728e-da9d-409d-a6c7-31325e3773a8","REVIEWED","NOT_PERFORMED","PUBLISHED","fbbfd4b6-f4c7-4740-94a6-f81eb8fbb1b2","2026-08-25T18:18:22.546Z",null,"",9,3,{},365,"776fc737-dda9-4c82-bd56-b6ba0b7148d6",11,"AVAILABLE",[30,143],{"id":31,"type":32,"version":33,"doc":34},"95efaab6-e2ee-54ec-ac07-97ee652bc802","rich_text",1,{"type":35,"content":36},"doc",[37,45,50,55,59,64,68,73,77,82,86,91,125,130,134,139],{"type":38,"attrs":39,"content":41},"heading",{"level":40},2,[42],{"type":43,"text":44},"text","Il problema",{"type":46,"content":47},"paragraph",[48],{"type":43,"text":49},"Una UI sanitaria può dover mostrare identità paziente, episodio, letto, ordini e ultimi documenti nella stessa schermata. Se ogni contesto possiede il proprio database, la tentazione è creare un database condiviso di nuovo o consentire join cross-schema. Questo annulla il Data Ownership.",{"type":38,"attrs":51,"content":52},{"level":40},[53],{"type":43,"text":54},"API Composition",{"type":46,"content":56},[57],{"type":43,"text":58},"Un BFF o servizio di composizione può interrogare in parallelo le API dei proprietari e assemblare una risposta orientata alla schermata. È adatto quando il numero di fonti è limitato, i dati devono essere freschi e la latenza resta sotto controllo.",{"type":38,"attrs":60,"content":61},{"level":40},[62],{"type":43,"text":63},"Read Model",{"type":46,"content":65},[66],{"type":43,"text":67},"Per dashboard, liste ad alto volume, ricerca o reporting può essere meglio mantenere una proiezione denormalizzata costruita dagli eventi. Il Read Model è derivato: non è source of truth e può essere ricostruito dai dati\u002Feventi autorevoli.",{"type":38,"attrs":69,"content":70},{"level":40},[71],{"type":43,"text":72},"CQRS",{"type":46,"content":74},[75],{"type":43,"text":76},"Command Query Responsibility Segregation separa il modello usato per cambiare lo stato da quello usato per leggerlo. Non implica necessariamente Event Sourcing e non richiede due tecnologie diverse. Significa che il modello di scrittura protegge invarianti mentre il modello di lettura è ottimizzato per le query.",{"type":38,"attrs":78,"content":79},{"level":40},[80],{"type":43,"text":81},"BFF",{"type":46,"content":83},[84],{"type":43,"text":85},"Il Backend for Frontend espone API pensate per un particolare frontend o Application Shell. Può comporre dati, propagare identità\u002Fautorizzazioni e ridurre round trip. Non deve diventare il luogo dove si decidono ricoveri, ordini o regole cliniche: quelle restano nei bounded context.",{"type":38,"attrs":87,"content":88},{"level":40},[89],{"type":43,"text":90},"Esempio",{"type":92,"content":93},"bulletList",[94,101,107,113,119],{"type":95,"content":96},"listItem",[97],{"type":46,"content":98},[99],{"type":43,"text":100},"EMPI espone identità canonica.",{"type":95,"content":102},[103],{"type":46,"content":104},[105],{"type":43,"text":106},"ADT espone episodio corrente.",{"type":95,"content":108},[109],{"type":46,"content":110},[111],{"type":43,"text":112},"Bed Management espone occupazione.",{"type":95,"content":114},[115],{"type":46,"content":116},[117],{"type":43,"text":118},"Order Entry espone ordini aperti.",{"type":95,"content":120},[121],{"type":46,"content":122},[123],{"type":43,"text":124},"Un Patient Workspace Read Model combina gli eventi necessari e serve rapidamente la home clinica.",{"type":38,"attrs":126,"content":127},{"level":40},[128],{"type":43,"text":129},"Consistenza",{"type":46,"content":131},[132],{"type":43,"text":133},"Una proiezione asincrona può essere leggermente in ritardo. L'interfaccia deve tollerarlo e, per dati critici che richiedono conferma immediata, può interrogare direttamente il source of truth. CQRS non elimina la necessità di decidere quali informazioni possono essere eventualmente consistenti.",{"type":38,"attrs":135,"content":136},{"level":40},[137],{"type":43,"text":138},"Reporting",{"type":46,"content":140},[141],{"type":43,"text":142},"Anche il reporting dovrebbe consumare API\u002Fproiezioni dedicate invece di replicare l'intero catalogo di controller o interrogare direttamente i database degli altri servizi. Questo consente di evolvere i domini senza rompere centinaia di report.",{"id":144,"type":145,"version":33,"text":146},"da75a974-ebe9-53f1-917c-a6d518d208ad","callout","CQRS non è sinonimo di Event Sourcing: si può usare una semplice proiezione PostgreSQL e ottenere già il vantaggio di separare ownership e query.","PORTAL","ANONYMOUS","2026-08-25T18:18:21.169Z","794a9185-136c-4415-ab23-cd144eb5870e",false,"LATEST","AUTO",0,"EDITORIAL","Sponsorizzato",{"sources":158,"secondaryTopics":159,"tags":160,"primaryTopic":161,"technologies":165},[],[],[],[162],{"id":14,"name":163,"slug":164},"Software Architecture","software-architecture",[]]