{"id":283,"date":"2024-10-06T16:20:49","date_gmt":"2024-10-06T16:20:49","guid":{"rendered":"https:\/\/oberle-it-beratung.de\/?p=283"},"modified":"2024-10-06T16:20:49","modified_gmt":"2024-10-06T16:20:49","slug":"dry-and-coc","status":"publish","type":"post","link":"https:\/\/www.elrebo.de\/index.php\/2024\/10\/06\/dry-and-coc\/","title":{"rendered":"DRY and CoC"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Don&#8217;t repeat yourself<\/h3>\n\n\n\n<p>Dieser Satz ist die Quintessenz des &#8220;DRY Principle of Software Development&#8221;. Eine Beschreibung dazu gibt es <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">hier bei Wikipedia<\/a>. Es geht dabei darum, dass man in einem System den gleichen Code nicht mehrfach schreibt, sondern, dass es eine Stelle gibt, an der der Code steht und dieser Code im System immer wieder verwendet werden kann.<\/p>\n\n\n\n<p>Auch bei der Data Warehouse Automation geht es darum, den Aufwand f\u00fcr die wiederholte Definition immer gleicher Programmteile (z.B. f\u00fcr Hubs, Links, Satellites und Stages) zu reduzieren, indem man ein Tool wie z.B. <a href=\"https:\/\/www.getdbt.com\">dbt<\/a> verwendet und die DataVault-Objekte wie Hubs, Links und Satellites z.B. mit den dbt-Makros von <a href=\"https:\/\/automate-dv.readthedocs.io\/en\/latest\/\">AutomateDV<\/a> beschreibt. So eine L\u00f6sung habe ich in meinem Beitrag <a href=\"https:\/\/elrebo.de\/ein-dwh-mit-git-linux-docker-postgresql-dbt-und-automatedv\" data-type=\"post\" data-id=\"137\">Ein DWH mit git, Linux, Docker, PostgreSQL, dbt und AutomateDV<\/a> beschrieben.<\/p>\n\n\n\n<p>Doch das ist nat\u00fcrlich noch nicht das Ende der Abstraktion, wie ich schon in meinem Beitrag <a href=\"https:\/\/elrebo.de\/die-kraft-der-abstraktion\" data-type=\"post\" data-id=\"155\">Die Kraft der Abstraktion<\/a> beschrieben habe. Man kann sich einen Generator bauen, der den AutomateDV-Code f\u00fcr die Objekte des Raw Vault aus einer noch kleineren Steuerdatei erzeugt. Wie das geht, steht in meinem Beitrag <a href=\"https:\/\/elrebo.de\/genrawvault-wie-man-aus-einer-steuerdatei-ein-ganzes-dwh-generieren-kann\" data-type=\"post\" data-id=\"234\">GenRawVault: wie man aus einer Steuerdatei ein ganzes DWH generieren kann<\/a>.<\/p>\n\n\n\n<p>Bei der Steuerdatei <a href=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/09\/RawVault.xml\" data-type=\"attachment\" data-id=\"239\">RawVault.xml<\/a>, die dort beschrieben ist, handelt es sich quasi um eine DSL (domain specific language) f\u00fcr einen RawVault gem\u00e4\u00df Data Vault 2.0. Man erkauft sich die Kompaktheit der Darstellung damit, dass man keine individuellen Abweichungen und Erg\u00e4nzungen mehr in sein System einbringen kann, die in der DSL nicht vorgesehen sind. Aber das ist ja genau das, was Dan Linstedt fordert &#8211; dass man sich strikt an das Konzept von DataVault 2.0 halten soll, da nur so die Effizienz von DV2.0 erhalten bleibt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Convention over Configuration<\/h3>\n\n\n\n<p>Und damit sind wir beim zweiten Prinzip der Software-Entwicklung, auf das ich in diesem Beitrag eingehen m\u00f6chte: Convention over configuration (CoC). Auch hier gibt es eine <a href=\"https:\/\/en.wikipedia.org\/wiki\/Convention_over_configuration\">Beschreibung auf Wikipedia<\/a>. Man verwendet Festlegungen (Konventionen), aus denen sich das &#8220;normale&#8221; Verhalten des Systems ergibt. Nur wenn man Abweichungen von diesem &#8220;normalen&#8221; Verhalten ben\u00f6tigt, dann konfiguriert man diese. <\/p>\n\n\n\n<p>Mit diesen beiden Prinzipien im Sinn habe ich die Struktur der RawVault.xml ver\u00e4ndert und eine neue Version (schema_version=&#8221;2&#8243;) erstellt. Der Rest dieses Beitrags beschreibt diese neue Version im Vergleich zur bisherigen. <\/p>\n\n\n\n<p>Die Struktur der DSL, die bisher in der Steuerdatei RawVault.xml verwendet wurde, orientiert sich am Ablauf der Daten\u00fcbernahme in das DWH:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"524\" height=\"232\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.39.53.png\" alt=\"\" class=\"wp-image-287\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.39.53.png 524w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.39.53-300x133.png 300w\" sizes=\"auto, (max-width: 524px) 100vw, 524px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Der Abschnitt system enth\u00e4lt Systemparameter und wird hier nicht n\u00e4her beschrieben.<\/li>\n\n\n\n<li>Der Abschnitt file_imports beschreibt den Import der CSV-Dateien aus den operativen Systemen in die Source-Schemata der DWH-Datenbank.<\/li>\n\n\n\n<li>Der Abschnitt db_sources beschreibt die Tabellen der Source-Schemata der DWH-Datenbank.<\/li>\n\n\n\n<li>Der Abschnitt stages beschreibt die Staging-Tabellen in der DWH-Datenbank mit Feldern, Unique-Keys und den darin enthaltenen NaturalKeys.<\/li>\n\n\n\n<li>Der Abschnitt dv_tables beschreibt die Objekte des RawVault: Hubs, Links und Satellites.<\/li>\n<\/ul>\n\n\n\n<p>Obwohl diese Struktur schon einigerma\u00dfen kompakt ist, enth\u00e4lt sie doch noch viele Attribute, in denen die Konfigurationen f\u00fcr die RawVault-Objekte angegeben werden. So wird z.B. f\u00fcr jeden Satelliten der Name (name), der Pr\u00e4fix (prefix), die Stage-Tabelle (stage), der Hub (hub)oder Link (link) und eine Beschreibung (description) angegeben. \u00c4hnliches gilt auch f\u00fcr die Hubs und Links.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"675\" height=\"227\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-05-um-18.50.02.png\" alt=\"\" class=\"wp-image-284\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-05-um-18.50.02.png 675w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-05-um-18.50.02-300x101.png 300w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/><\/figure>\n\n\n\n<p>Wie l\u00e4sst sich diese Struktur noch weiter vereinfachen, so dass es einfacher wird, einen RawVault zu beschreiben?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Das Attribut stage wird ben\u00f6tigt, weil angegeben werden muss, aus welcher Stage-Tabelle der Satellit geladen wird. Das w\u00e4re nicht n\u00f6tig, wenn das Element sat innerhalb des Elements stage definiert w\u00fcrde.<\/li>\n\n\n\n<li>Das Attribut hub wird ben\u00f6tigt, weil angegeben werden muss, auf welchen Hub oder Link sich der Satellit bezieht. Das w\u00e4re nicht n\u00f6tig, wenn das Element sat innerhalb des Elements hub bzw. Link definiert w\u00fcrde.<\/li>\n\n\n\n<li>Das Attribut prefix hat den gleichen Inhalt wie das Attribut name, nur in Gro\u00dfbuchstaben statt in Kleinbuchstaben. Das w\u00e4re nicht n\u00f6tig, wenn man festlegt, dass das immer so sein soll. <\/li>\n<\/ul>\n\n\n\n<p>Au\u00dferdem werden bei den csv-Dateien im Abschnitt file_imports\/import die Felder (fields) und der eindeutige Schl\u00fcssel (unique_key) definiert und im Abschnitt stages in der zugeh\u00f6rigen Stage-Tabelle werden die Felder und der eindeutige Schl\u00fcssel erneut angegeben. Das w\u00e4re nicht n\u00f6tig, wenn man die Festlegung trifft, dass die Felder in db_source\/table und im zugeh\u00f6rigen file_import\/imort\/file identisch sind. <\/p>\n\n\n\n<p>Es ist also m\u00f6glich, eine noch kompaktere Darstellung zu erzeugen, wenn man die Struktur der xml-Datei umstellt und zus\u00e4tzliche Konventionen festlegt.<\/p>\n\n\n\n<p>Die neue Version (schema_version=&#8221;2&#8243;) von RawVault.xml sieht jetzt so aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"516\" height=\"159\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.43.41.png\" alt=\"\" class=\"wp-image-288\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.43.41.png 516w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.43.41-300x92.png 300w\" sizes=\"auto, (max-width: 516px) 100vw, 516px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Der Abschnitt system enth\u00e4lt Systemparameter und wird hier nicht n\u00e4her beschrieben.<\/li>\n\n\n\n<li>Der Abschnitt nat_keys enth\u00e4lt die Definition aller im DataVault verwendeten NaturalKeys.<\/li>\n\n\n\n<li>Der Abschnitt db_sources beschreibt alles weitere.<\/li>\n<\/ul>\n\n\n\n<p>Im Abschnitt db_sources werden zun\u00e4chst die Source-Schemata in der DWH-Datenbank (db_source) definiert.<\/p>\n\n\n\n<p>F\u00fcr jedes Source-Schema (db_source) wird definiert, aus welchem \u00dcbergabeverzeichnis (file_import) die CSV-Dateien f\u00fcr das Source-Schema \u00fcbernommen werden und welche Tabellen (table) in diesem Source-Schema enthalten sind.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"497\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.48.33-1024x497.png\" alt=\"\" class=\"wp-image-289\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.48.33-1024x497.png 1024w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.48.33-300x146.png 300w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.48.33-768x373.png 768w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-10.48.33.png 1084w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>F\u00fcr jede Tabelle wird beschrieben, welche Felder (fields) sie enth\u00e4lt, und aus welchen Feldern der eindeutige Schl\u00fcssel (unique_key) f\u00fcr die Records in der Tabelle besteht. Wenn die Tabelle aus einer CSV-Datei eingelesen werden soll, wird der Name der zugeh\u00f6rigen CSV-Datei angegeben (import). Au\u00dferdem wird beschrieben, welche Stage-Tabelle aus dieser Source-Tabelle bef\u00fcllt wird.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"772\" height=\"465\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.17.00.png\" alt=\"\" class=\"wp-image-290\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.17.00.png 772w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.17.00-300x181.png 300w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.17.00-768x463.png 768w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/figure>\n\n\n\n<p>Im Element stage wird definiert, welche Hubs (hub) aus dieser Stage-Tabelle gef\u00fcllt werden und damit auch, welche NaturalKeys (hub\/nat_key) in dieser Stage-Tabelle enthalten sind und aus welchen Feldern der Source-Tabelle (source_field) sie best\u00fcckt werden oder mit welcher SQL-Funktion sie erzeugt werden (definition). Wenn an dem Hub auch ein Satellit aus dieser Stage-Tabelle geladen wird, dann gibt es im Hub noch eine Definition f\u00fcr den Satellite (sat).<\/p>\n\n\n\n<p>Weiter wird definiert, welche Links aus dieser Stage-Tabelle gef\u00fcllt werden (link). Hier werden die NaturalKeys aufgef\u00fchrt, die der Link verbindet (link\/nat_key). Wenn an dem Link auch ein Satellit aus dieser Stage-Tabelle geladen wird, dann gibt es im Link noch eine Definition f\u00fcr den Satellite (sat).  <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"941\" height=\"772\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.38.37.png\" alt=\"\" class=\"wp-image-292\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.38.37.png 941w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.38.37-300x246.png 300w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-16.38.37-768x630.png 768w\" sizes=\"auto, (max-width: 941px) 100vw, 941px\" \/><\/figure>\n\n\n\n<p>Da in dieser Version der RawVault.xml der Name der Satelliten aus dem Stage-Namen und dem Hub- bzw. Link-Namen erzeugt wird, w\u00e4re es nicht m\u00f6glich aus einer Stage f\u00fcr einen Hub mehrere Satelliten zu definieren. Dies ist jedoch notwendig, wenn man z.B. in der inkrementellen Entwicklung einen vohandenen Satelliten durch eine neue Version ersetzen will, oder wenn man die Payload eines Satelliten auf mehrere Satelliten aufteilen will. Daf\u00fcr wurde in dieser Version das Attribut sat_suffix am Element sat eingef\u00fchrt. Hier ist ein Beispiel daf\u00fcr:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"774\" height=\"442\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-17.22.27.png\" alt=\"\" class=\"wp-image-293\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-17.22.27.png 774w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-17.22.27-300x171.png 300w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-06-um-17.22.27-768x439.png 768w\" sizes=\"auto, (max-width: 774px) 100vw, 774px\" \/><\/figure>\n\n\n\n<p>Diese neue Version der <a href=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/10\/RawVault.xml\" data-type=\"attachment\" data-id=\"296\">RawVault.xml (mit schema_version=&#8221;2&#8243;)<\/a> ben\u00f6tigt noch 591 Zeilen im Vergleich zu den 919 Zeilen der vorherigen Version <a href=\"https:\/\/elrebo.de\/wp-content\/uploads\/2024\/09\/RawVault.xml\" data-type=\"attachment\" data-id=\"239\">RawVault.xml<\/a>. <\/p>\n\n\n\n<p>In den n\u00e4chsten Beitr\u00e4gen werde ich versuchen &#8211; ausgehend von diesem Raw Vault &#8211; den Business Vault unseres Data Warehouse zu beschreiben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Don&#8217;t repeat yourself Dieser Satz ist die Quintessenz des &#8220;DRY Principle of Software Development&#8221;. Eine Beschreibung dazu gibt es hier bei Wikipedia. Es geht dabei darum, dass man in einem System den gleichen Code nicht mehrfach schreibt, sondern, dass es eine Stelle gibt, an der der Code steht und dieser Code im System immer wieder [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":303,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,14,18],"tags":[22,28,29,30,32,33,35,59],"class_list":["post-283","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dwh","category-dv20","category-werkzeuge","tag-automatedv","tag-coc","tag-data-warehouse","tag-dbt","tag-dry","tag-dv2-0","tag-dwh","tag-willibald-challenge"],"_links":{"self":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts\/283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/comments?post=283"}],"version-history":[{"count":0,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts\/283\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/media\/303"}],"wp:attachment":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/media?parent=283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/categories?post=283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/tags?post=283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}