{"id":2261,"date":"2022-11-19T06:21:55","date_gmt":"2022-11-19T05:21:55","guid":{"rendered":"https:\/\/x-cross.cloud\/it\/?p=2261"},"modified":"2023-01-11T04:18:41","modified_gmt":"2023-01-11T03:18:41","slug":"struttura-dati-avanzata","status":"publish","type":"post","link":"https:\/\/www.x-cross.cloud\/it\/avanzate-funzionalita-di-sistema\/database\/struttura-dati-avanzata\/","title":{"rendered":"Struttura dati avanzata"},"content":{"rendered":"<p><img decoding=\"async\" class=\"wp-image-2083 alignright\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/Screenshot-2022-11-01-at-14.03.18.jpg\" alt=\"\" width=\"148\" height=\"113\" \/>La struttura dati di X-Cross sfrutta appieno le funzionalit\u00e0 avanzate dei moderni database:<\/p>\n<ul>\n<li><strong>Transazioni<\/strong><\/li>\n<li><strong>Integrit\u00e0 referenziale<\/strong><\/li>\n<li><strong>Stored procedures<\/strong><\/li>\n<li><strong>Triggers<\/strong><\/li>\n<li><strong>Viste<\/strong><\/li>\n<\/ul>\n<p>per la massima velocit\u00e0 operativa e affidabilit\u00e0 della struttura dati.<!--more--><\/p>\n<ul>\n<li>I moderni database offrono un insieme di funzionalit\u00e0 che, tutte insieme, fanno s\u00ec che la struttura dei dati rispetti i cosiddetti criteri &#8220;<strong>ACID<\/strong>&#8220;:<\/li>\n<li><strong>Atomica<\/strong><\/li>\n<li><strong>Coerente<\/strong><\/li>\n<li><strong>Isolata<\/strong><\/li>\n<li><strong>Durevole<\/strong><\/li>\n<\/ul>\n<p>Per una spiegazione di <strong>ACID<\/strong>, vedere: <a href=\"https:\/\/it.wikipedia.org\/wiki\/ACID\">https:\/\/it.wikipedia.org\/wiki\/ACID<\/a>.<\/p>\n<p>Per rispettare questi criteri non \u00e8 sufficiente che nel database siano presenti le funzionalit\u00e0 necessarie, ma anche l<strong>&#8216;ERP deve farne pieno uso<\/strong>. Ad esempio, se il database offre la funzionalit\u00e0 di <strong>integrit\u00e0 referenziale<\/strong>, ma il programma non la utilizza, i criteri <strong>ACID<\/strong> non vengono rispettati.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-2083 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/Screenshot-2022-11-01-at-14.03.18.jpg\" alt=\"\" width=\"673\" height=\"514\" \/><\/p>\n<p><strong>In X-Cross, invece, i requisiti ACID del database vengono pienamente soddisfatti sfruttando appieno le funzionalit\u00e0 offerte.<\/strong><\/p>\n<h4>Transazioni in inserimento-modifica-cancellazione<\/h4>\n<p><strong>In X-Cross, tutti gli inserimenti e gli aggiornamenti dei record sono inclusi in un&#8217;unica transazione ed in un&#8217;unico statament SQ<\/strong>.<\/p>\n<p>Ad esempio, l&#8217;inserimento-modifica di una transazione contabile per il database \u00e8 una singola transazione.<\/p>\n<p>Questa struttura garantisce che tutti gli inserimenti aggiornati abbiano esito positivo (&#8220;COMMIT&#8221;), oppure l&#8217;intera transazione venga annullata (&#8220;ROLLBACK&#8221;), ed in questo caso i dati rimangono invariati.<\/p>\n<h4>Transazioni in oggetti complessi<\/h4>\n<p>La struttura dati di X-Cross \u00e8 spesso basata su oggetti complessi:<\/p>\n<p><img decoding=\"async\" class=\"wp-image-2009 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/1_1-1.jpg\" alt=\"\" width=\"482\" height=\"288\" \/><\/p>\n<p>Ad esempio una fattura \u00e8 formata da tante tabelle (intestazione, righe, lotti, numeri di serie, provvigioni, spese, ecc.) che insieme formano l&#8217;oggetto &#8220;fattura&#8221;.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2311 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/corossmodel_objects-1.png\" alt=\"\" width=\"506\" height=\"423\" \/><\/p>\n<p>In X-Cross l&#8217;inserimento e l&#8217;aggiornamento di tutte le tabelle che costituiscono una fattura \u00e8 contenuto in un&#8217;unica transazione, che comprende tutte le tabelle e sottotabelle, a qualsiasi livello, in un&#8217;unica transazione.<\/p>\n<p>In questo modo la transazione non \u00e8 limitata alla singola tabella (intestazione, righe, ecc.) ma a tutte le tabelle che insieme formano l&#8217;oggetto, che viene visto come un&#8217;entit\u00e0 &#8220;atomica&#8221;.<\/p>\n<p>Questo vale non solo per una fattura, ma anche per tutti gli oggetti che sono formati da pi\u00f9 tabelle.<\/p>\n<h4>Transazioni in una singola istruzione SQL<\/h4>\n<p><strong>Una caratteristica molto importante di X-Cross \u00e8 che l&#8217;inserimento o l&#8217;aggiornamento di oggetti complessi che includono pi\u00f9 tabelle viene effettuato non solo in una singola transazione, ma anche in un singolo <em>statement<\/em> SQL.<\/strong><\/p>\n<p>In molti programmi, infatti, anche se i molteplici inserimenti-aggiornamenti sono compresi in un&#8217;unica transazione, le varie operazioni vengono eseguite con <em>statements<\/em> separati.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-2363 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/trnsaction_1.jpg\" alt=\"\" width=\"274\" height=\"300\" \/><\/p>\n<p>Se qualcosa va storto, il programma client deve prendere atto del problema ed eseguire l&#8217;azione appropriata (ROLLBACK), e non c&#8217;\u00e8 una garanzia totale che ci\u00f2 accada. Inoltre, queste azioni vengono eseguite in tempi diversi, quindi nel frattempo le transazioni sono &#8220;sospese&#8221;.<\/p>\n<p><strong>In X-Cross, invece, la transazione \u00e8 sempre un singolo <em>statement<\/em> SQL<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-2364 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/trnsaction_2.jpg\" alt=\"\" width=\"300\" height=\"244\" \/><\/p>\n<p>che viene automaticamente invertito (ROLLBACK) se qualcosa, a qualsiasi livello, va storto.<\/p>\n<p>Questi livelli possono includere anche azioni indirette, come trigger attivati da azioni di inserimento e modifica.<\/p>\n<h4>Integrit\u00e0 referenziale<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-2350 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/foreign_keys-1.jpg\" alt=\"\" width=\"300\" height=\"224\" \/><\/p>\n<p>In X-Cross, tutte le connessioni tra le tabelle creano una <strong>foreign key<\/strong> nel database, con una <strong>completa integrit\u00e0 referenziale<\/strong> che garantisce la coerenza dei dati.<\/p>\n<p>La foreign key impedisce all&#8217;utente di eliminare un record connesso a un altro: ad esempio, un cliente con fatture non pu\u00f2 essere eliminato.<\/p>\n<h4>Cascade in foreign keys<\/h4>\n<p>In altri casi, le foreign keys possono cancellare i record figlio quando viene cancellato quello padre. Ad esempio, la cancellazione dell&#8217;intestazione di una fattura comporta l&#8217;automatica eliminazione anche di tutte le righe della fattura stessa.<\/p>\n<h4>Coerenza del database &#8211; nessun &#8220;orfano&#8221;<\/h4>\n<p>Nei database che non implementano l&#8217;integrit\u00e0 referenziale, \u00e8 possibile avere record &#8220;<strong>orfani<\/strong>&#8220;, cio\u00e8 record collegati a un padre che non esiste pi\u00f9, ad esempio fatture senza cliente, o righe fattura senza intestazione. Questo pu\u00f2 accadere perch\u00e9 le cancellazioni delle singole tabelle non sono comprese in una singola transazione, quindi se qualcosa va storto i dati possono diventare incoerenti.<\/p>\n<p>L&#8217;integrit\u00e0 referenziale, con o senza cascade, impedisce al database di creare record &#8220;orfani&#8221; e ne garantisce la consistenza.<\/p>\n<ul>\n<li>Senza cascade, <strong>il record padre non pu\u00f2 essere cancellato<\/strong> se sono presenti record figli collegati<\/li>\n<li>Con cascade, <strong>i record figli vengono cancellati insieme al padre<\/strong><\/li>\n<li>In entrambi i casi, <strong>l&#8217;integrit\u00e0 del database \u00e8 assicurata<\/strong>.<\/li>\n<\/ul>\n<h4>Stored procedures<\/h4>\n<p>Tutte le operazioni di inserimento-modifica-cancella vengono eseguite tramite stored procedure, garantendo le massime prestazioni e, allo stesso tempo, assicurando la consistenza e l&#8217;isolamento del database.<\/p>\n<p>Le stored procedure vengono utilizzate anche per leggere i dati in pi\u00f9 oggetti (es. una transazione contabile, una fattura, ecc.) che includono pi\u00f9 tabelle, aumentando notevolmente la velocit\u00e0 di lettura.<\/p>\n<p>Questo \u00e8 molto importante in X-Cross, i cui oggetti complessi possono includere molte tabelle o viste diverse (ognuna di esse pu\u00f2 a sua volta includere molte tabelle diverse)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2368 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/Screenshot-2022-11-19-at-12.31.48.png\" alt=\"\" width=\"384\" height=\"264\" \/><br \/>\nUn oggetto <strong>operazione contabile<\/strong>, ad esempio, ha 28 viste diverse da leggere (intestazione e 27 sottotabelle)<\/p>\n<ul>\n<li>L&#8217;intestazione della contabilit\u00e0 \u00e8 una vista, composta da 42 diverse tabelle\n<ul>\n<li>Ogni riga contabile (una delle 27 sottotabelle) \u00e8 composta da 32 diverse tabelle.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2369 aligncenter\" src=\"https:\/\/www.x-cross.cloud\/wp-content\/uploads\/Screenshot-2022-11-19-at-12.32.26.png\" alt=\"\" width=\"383\" height=\"253\" \/><br \/>\nUn oggetto <strong>ordine cliente<\/strong> ha 30 viste diverse da leggere (intestazione e 29 sottotabelle)<\/p>\n<ul>\n<li>L&#8217;intestazione dell&#8217;ordine \u00e8 una vista, composta da 62 diverse tabelle\n<ul>\n<li>Ogni riga d&#8217;ordine (una delle 29 sottotabelle) \u00e8 composta da 70 diverse tabelle.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Leggere un oggetto come un ordine, con 29 sottotabelle, richiederebbe un tempo piuttosto lungo; se sono necessari 0,2 secondi per sottotabella, il tempo totale di lettura sar\u00e0 di circa 6 secondi.<\/p>\n<p><strong>La tecnologia delle stored procedure di X-Cross pu\u00f2 leggere un oggetto come questo in 0,2-0,3 secondi, ovvero circa 20 volte pi\u00f9 velocemente.<\/strong><\/p>\n<h4>Triggers<\/h4>\n<p>Molti aggiornamenti sono conseguenza di altri inserimenti-modifica (es. aggiornamento della giacenza inserendo o aggiornando un movimento di magazzino), e in questo caso vengono modificati con un trigger, ovvero una procedura che si attiva come conseguenza di un altro inserimento-aggiornamento -cancellazione.<\/p>\n<p>In questo modo l&#8217;aggiornamento secondario non viene eseguito prima o dopo la transazione principale, ma <strong>esattamente durante la transazione stessa<\/strong>. Se la transazione \u00e8 annullata, il database rimane totalmente invariato.<\/p>\n<h4>Viste<\/h4>\n<p>Il modellatore di dati CrossModel fa pieno uso delle viste, che vengono utilizzate per molti scopi diversi:<\/p>\n<ul>\n<li><strong>Alias<\/strong> \u200b\u200bdelle tabelle per connessioni a pi\u00f9 record della stessa tabella<\/li>\n<li><strong>Viste complesse<\/strong> con due o pi\u00f9 tabelle nella stessa vista, che non possono comunque essere visualizzate e inserite-aggiornate come una singola tabella<\/li>\n<li>Viste (<strong>queries<\/strong>) che includono tutti i record collegati di una tabella principale (ad es. una fattura collegata al cliente, termine di pagamento, ecc.)<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>La struttura dati di X-Cross sfrutta appieno le funzionalit\u00e0 avanzate dei moderni database: Transazioni Integrit\u00e0 referenziale Stored procedures Triggers Viste per la massima velocit\u00e0 operativa e affidabilit\u00e0 della struttura dati.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[30],"tags":[],"class_list":["post-2261","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/posts\/2261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/comments?post=2261"}],"version-history":[{"count":2,"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/posts\/2261\/revisions"}],"predecessor-version":[{"id":2661,"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/posts\/2261\/revisions\/2661"}],"wp:attachment":[{"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/media?parent=2261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/categories?post=2261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.x-cross.cloud\/it\/wp-json\/wp\/v2\/tags?post=2261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}