{"id":55000263,"date":"2015-10-01T00:00:00","date_gmt":"2020-01-24T15:59:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=263"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Adressen_konsolidieren","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html","title":{"rendered":"Adressen konsolidieren"},"content":{"rendered":"<p class='introduction'>Der geradezu prototypische Anwendungsfall f&uuml;r eine Datenbank ist sicherlich die Speicherung von Kontakten. Ob Nordwind-, unsere S&uuml;dwinddatenbank oder die hier oft verwendete Stammdatentabelle: im Zentrum stehen Adressdatens&auml;tze. Auf den ersten Blick gibt es dabei keinen Erkl&auml;rungsnotstand, denn so ein Kontaktdatensatz scheint eine einfache Angelegenheit zu sein. Bei  genauerem Hinsehen tauchen aber doch Fragen auf, die dieser Beitrag thematisiert.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1411_Adressen.mdb<\/b>.<\/p>\n<p>F&uuml;r die Beispieldatenbank zu diesem Beitrag wurde die Stammdatentabelle aufgebohrt und mit zus&auml;tzlichen Feldern und Daten versehen. Neben Namen und Anschrift kommen Telefonnummern und E-Mail-Adressen hinzu, so dass sie sich wie in Bild 1 gestaltet. In diese Tabelle k&ouml;nnten Sie bereits etwa Ihre Outlook-Kontakte importieren.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/01_tblAdressen.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/01_tblAdressen.png\" alt=\"Aufbau der Adressentabelle\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Aufbau der Adressentabelle<\/p>\n<p>Man findet Adresstabellen in dieser Form recht h&auml;ufig in Datenbanken. Dabei ist der Aufbau keineswegs optimal, obwohl es sich bereits um eine normalisiertere Form handelt, denn Anreden, Orte und L&auml;nder sind bereits mit <b>Lookup-Tabellen<\/b> verkn&uuml;pft (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/02_tblAdressenPlusSubTabs.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/02_tblAdressenPlusSubTabs.png\" alt=\"Lookup-Tabellen der Adressentabelle\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Lookup-Tabellen der Adressentabelle<\/p>\n<p>Diese Felder verhindern auch einen einfachen Import aus anderen Datenquellen. Damit etwa im Feld <b>IDOrt<\/b> der Bezug zur Tabelle <b>tblOrte<\/b> gespeichert werden kann, muss diese erst mit Orten gef&uuml;llt worden sein. Nat&uuml;rlich k&ouml;nnte man diese Felder auch als Text anlegen, was in Hinsicht auf den Speicherbedarf jedoch suboptimal ist. Beim Import aus anderen Datenquellen kommt es in der Regel jedoch zu so einer Tabelle, die in der Beispieldatenbank als <b>tblAdressenImport<\/b> zu finden ist (Bild 3).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/03_tblImport.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/03_tblImport.png\" alt=\"Aufbau der Importtabelle\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Aufbau der Importtabelle<\/p>\n<h2>Normalisieren des Imports<\/h2>\n<p>Im Folgenden wird Schritt f&uuml;r Schritt aufgezeigt, wie die Importtabelle in eine normalisierte Form &uuml;berf&uuml;hrt wird.<\/p>\n<p>Legen Sie also zun&auml;chst die Lookup-Tabellen rechts in Bild 2 an, wobei f&uuml;r das Feld ID ein Autowert als Prim&auml;rschl&uuml;ssel zu verwenden ist und f&uuml;r das andere Feld &#8211; Anrede, Ort, Land &#8211; das Textformat. Jetzt kann die Tabelle <b>tblOrte<\/b> mit Daten gef&uuml;llt werden, wof&uuml;r eine Anf&uuml;geabfrage zum Einsatz kommt:<\/p>\n<pre>INSERT INTO tblOrte (Ort)\r\nSELECT DISTINCT Ort\r\nFROM tblAdressenImport;<\/pre>\n<p>Nur die Orte der Ausgangstabelle werden hier in die Orte-Tabelle gespeichert, wobei Doppelungen infolge der <b>DISTINCT<\/b>-Klausel ausbleiben. Analog die Anf&uuml;geabfragen f&uuml;r die L&auml;nder und Anreden:<\/p>\n<pre>INSERT INTO tblLaender (Land)\r\nSELECT DISTINCT Land\r\nFROM tblAdressenImport;\r\nINSERT INTO tblAnreden (Anrede)\r\nSELECT DISTINCT Anrede\r\nFROM tblAdressenImport;<\/pre>\n<p>Sehen Sie sich die Inhalte der Tabellen an. Hier wird schon deutlich, worin der Vorteil der Normalisierung liegt. Waren in der Importtabelle noch 11.444 Felder mit L&auml;nderbezeichnungen gef&uuml;llt, sind es in der L&auml;ndertabelle nur noch 16 Eintr&auml;ge, auf die per ID verwiesen werden muss. Und da der Long-Wert von <b>IDLand<\/b> weniger Bytes ben&ouml;tigt, als ein Bezeichnungs-String, wird die Speicherersparnis offensichtlich. <\/p>\n<p>Diese Rechnung zeigt allerdings, dass nicht in jedem Fall eine solche Normalisierung n&uuml;tzlich ist. Nehmen Sie etwa das Feld <b>Nation<\/b> der Importtabelle. Auch hier k&ouml;nnte man eine Lookup-Tabelle <b>tblNationen<\/b> anlegen, die dann lediglich die zwei Eintr&auml;ge &#8222;D&#8220; und &#8222;CH&#8220; f&uuml;r Deutschland und Schweiz enthielte.<\/p>\n<p>Ein Verweis auf die ID dieser Eintr&auml;ge kostet 4 Bytes und ist damit gr&ouml;&szlig;er, als die ein beziehungsweise zwei Bytes der Strings. Eine Lookup-Tabelle w&auml;re hier nutzlos und machte Abfragen auf die Tabellen nur komplizierter &#8211; es sei denn, Sie wollten die Lookup-Tabelle f&uuml;r die Auswahl in einem Kombinationsfeld verwenden.<\/p>\n<p>Umgekehrt macht die Auslagerung in eine Lookup-Tabelle nur dann Sinn, wenn sich die Datenmenge dadurch reduzieren l&auml;sst. W&uuml;rde man Postleitzahlen auslagern, w&auml;re der Nutzen sehr gering, weil es eben so viele unterschiedliche Postleitzahlen gibt, dass man sie auch gleich in der Originaltabelle belassen kann.<\/p>\n<p>Wenden wir uns dem &uuml;berf&uuml;hren der Daten aus der Importtabelle in die <b>tblAdressen<\/b> zu. Auch daf&uuml;r eignet sich eine Anf&uuml;geabfrage, die verk&uuml;rzt so daher kommt:<\/p>\n<pre>INSERT INTO tblAdressen ( Nachname, Vorname, Strasse, ...)\r\nSELECT Nachname, Vorname, Strasse, ...\r\nFROM tblAdressenImport;<\/pre>\n<p>Transferiert werden alle Daten mit Ausnahme der Felder f&uuml;r Anrede, Ort und Land, denn diese existieren in der Zieltabelle nicht als Textfelder. Sie enth&auml;lt ja stattdessen Verweise auf die IDs der entsprechenden Lookup-Tabellen.<\/p>\n<p>Wie kommen diese Lookup-Verweise nun aber in die Tabelle <b>tblAdressen<\/b> Das ist nicht ganz so einfach. Dazu braucht es drei Ausgangstabellen, die miteinander verkn&uuml;pft eine Aktualisierungsabfrage bilden, wie in Bild 4.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/04_LookupUpdate.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/04_LookupUpdate.png\" alt=\"Aktualisierungsabfrage zum F&uuml;llen der Ort-Verweise\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Aktualisierungsabfrage zum F&uuml;llen der Ort-Verweise<\/p>\n<p>Die Importtabelle vergleicht &uuml;ber eine Beziehung das Ort-Feld mit den Inhalten der <b>tblOrte<\/b>. Die so ermittelte ID des Ortes wird dann benutzt, um das Feld <b>IDOrt<\/b> der Tabelle <b>tblAdressen<\/b> zu aktualisieren.<\/p>\n<p>Auf &auml;hnliche Weise verfahren Sie mit dem Aktualisieren der Felder f&uuml;r Anrede und Land. <\/p>\n<p>Sie habe damit die neue Tabelle <b>tblAdressen<\/b> vollst&auml;ndig bef&uuml;llt und k&ouml;nnen die Ausgangstabelle wieder l&ouml;schen. Um ihre Daten anzuzeigen, bedienen Sie sich einer Auswahlabfrage, die den gleichen Aufbau hat, wie die Beziehungen in Bild 2.<\/p>\n<h2>Flexibilisieren des Adressenaufbaus<\/h2>\n<p>Eingangs war davon die Rede, dass der Aufbau der <b>tblAdressen<\/b> samt Lookup-Tabellen nicht wirklich optimal ist. So findet man f&uuml;r Telefonnummern und E-Mail-Adressen jeweils zwei Felder in ihr, was im einen Fall zu viel, im anderen Fall zu wenig sein kann. Ist zu einem Kontakt keine Telefonnummer bekannt &#8211; ein Umstand, der gerade in den Outlook-Kontakten nicht selten ist -, so bleiben die beiden Felder leer. Ebenso kann ein Kontakt aber auch mehr als zwei Telefonnummern aufweisen, etwa Privat-, Gesch&auml;fts- und Mobilnummer. Dann ist guter Rat teuer. Dasselbe gilt f&uuml;r E-Mail-Adressen. <\/p>\n<p>Nat&uuml;rlich k&ouml;nnte man nun etwa die Zahl der Telefonnummernfelder in der Tabelle heraufsetzen, was jedoch zu weitgehend leeren Zellen f&uuml;hrte wird und die Speicherverschwendung vorantriebe.<\/p>\n<p>F&uuml;r diesen Fall ist es daher g&uuml;nstiger, die Telefonnummern und E-Mail-Adressen in gesonderte Tabellen auszulagern und &uuml;ber die ID eines Adressdatensatzes zu verkn&uuml;pfen.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000263\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000263?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000263\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der geradezu prototypische Anwendungsfall f&uuml;r eine Datenbank ist sicherlich die Speicherung von Kontakten. Ob Nordwind-, unsere S&uuml;dwinddatenbank oder die hier oft verwendete Stammdatentabelle: im Zentrum stehen Adressdatens&auml;tze. Auf den ersten Blick gibt es dabei keinen Erkl&auml;rungsnotstand, denn so ein Kontaktdatensatz scheint eine einfache Angelegenheit zu sein. Bei  genauerem Hinsehen tauchen aber doch Fragen auf, die dieser Beitrag thematisiert.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66112014,662014,44000003],"tags":[],"class_list":["post-55000263","post","type-post","status-publish","format-standard","hentry","category-66112014","category-662014","category-Tabellen_entwerfen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Adressen konsolidieren - Access [basics]<\/title>\n<meta name=\"description\" content=\"Der geradezu prototypische Anwendungsfall f\u00fcr eine Datenbank ist sicherlich die Speicherung von Kontakten. Ob Nordwind-, unsere S\u00fcdwinddatenbank oder die hier oft verwendete Stammdatentabelle: im Zentrum stehen Adressdatens\u00e4tze. Auf den ersten Blick gibt es dabei keinen Erkl\u00e4rungsnotstand, denn so ein Kontaktdatensatz scheint eine einfache Angelegenheit zu sein. Bei genauerem Hinsehen tauchen aber doch Fragen auf, die dieser Beitrag thematisiert.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adressen konsolidieren - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Der geradezu prototypische Anwendungsfall f\u00fcr eine Datenbank ist sicherlich die Speicherung von Kontakten. Ob Nordwind-, unsere S\u00fcdwinddatenbank oder die hier oft verwendete Stammdatentabelle: im Zentrum stehen Adressdatens\u00e4tze. Auf den ersten Blick gibt es dabei keinen Erkl\u00e4rungsnotstand, denn so ein Kontaktdatensatz scheint eine einfache Angelegenheit zu sein. Bei genauerem Hinsehen tauchen aber doch Fragen auf, die dieser Beitrag thematisiert.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/01_tblAdressen.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"14\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/01_tblAdressen.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html\",\"name\":\"Adressen konsolidieren - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:17+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Der geradezu prototypische Anwendungsfall f\\u00fcr eine Datenbank ist sicherlich die Speicherung von Kontakten. Ob Nordwind-, unsere S\\u00fcdwinddatenbank oder die hier oft verwendete Stammdatentabelle: im Zentrum stehen Adressdatens\\u00e4tze. Auf den ersten Blick gibt es dabei keinen Erkl\\u00e4rungsnotstand, denn so ein Kontaktdatensatz scheint eine einfache Angelegenheit zu sein. Bei genauerem Hinsehen tauchen aber doch Fragen auf, die dieser Beitrag thematisiert.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Adressen_konsolidieren.html\",\"name\":\"Adressen konsolidieren\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000263"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000263\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}