{"id":55000512,"date":"2021-02-01T00:00:00","date_gmt":"2021-02-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/512"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Normalisierung_Teil_3_Die_dritte_Normalform","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html","title":{"rendered":"Normalisierung, Teil 3: Die dritte Normalform"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/858daf87684543b5a7c3ec75bd3eca7d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class='introduction'>Der Entwurf eines Datenmodells und der darin enthaltenen Tabellen und Beziehungen erfordert vor allem eines: Das Ber&uuml;cksichtigen der Normalformen. Dies sind Regeln, mit denen Sie die ben&ouml;tigten Felder auf verschiedene Tabellen aufteilen. Dabei ist das Ziel, redundante Daten auszuschlie&szlig;en und Inkonsistenzen zu verhindern. Diese Artikelreihe beschreibt die wichtigsten Normalformen und wie Sie diese in der Praxis anwenden. In diesem Teil ist die dritte Normalform an der Reihe.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>2101_Normalisierung.accdb<\/b>.<\/p>\n<h2>Die dritte Normalform<\/h2>\n<p>Die dritte Normalform setzt erstens voraus, dass sich das Datenmodell in der ersten und der zweiten Normalform befindet.<\/p>\n<p>Die dritte Normalform sorgt au&szlig;erdem daf&uuml;r, dass es keine transitiven Abh&auml;ngigkeiten innerhalb einer Tabelle gibt. Alle Nichtschl&uuml;sselfelder m&uuml;ssen direkt vom Prim&auml;rschl&uuml;ssel der Tabelle abh&auml;ngig sein. Oder andersherum: Es darf kein Feld geben, das Detailinformationen &uuml;ber ein anderes Feld enth&auml;lt. Um sicherzugehen, dass eine Tabelle der dritten Normalform entspricht, pr&uuml;fen Sie, ob Sie die Daten aller Felder mit Ausnahme des Prim&auml;rschl&uuml;ssels einzeln &auml;ndern k&ouml;nnen, ohne dass ein weiteres Feld in dieser Tabelle davon betroffen ist.<\/p>\n<p>Am Ende des vorherigen Teils dieser Artikelreihe haben wir bereits das Beispiel von PLZ und Ort aufgegriffen. Oberfl&auml;chlich betrachtet ist das ein gutes Beispiel f&uuml;r eine transitive Abh&auml;ngigkeit: Normalerweise sollte man davon ausgehen, dass zu jeder PLZ genau ein Ort geh&ouml;rt. Daher k&ouml;nnte es Probleme bringen, beide Felder beispielsweise in einer Tabelle namens <b>tblKunden <\/b>unterzubringen.<\/p>\n<p>Sobald Sie einmal versehentlich die PLZ &auml;ndern, aber nicht den Ort an diese PLZ anpassen, haben Sie zwei verschiedene Postleitzahlen f&uuml;r den gleichen Ort. Dummerweise macht uns die Praxis an dieser Stelle ohnehin einen Strich durch die Rechnung, denn es gibt bereits Postleitzahlen, die mehr als einem Ort zugewiesen sind.<\/p>\n<h2>Beispiel BIC und Bankbezeichnung<\/h2>\n<p>Also suchen wir uns ein anderes Beispiel. Eines w&auml;re beispielsweise eine Tabelle, welche neben grundlegenden Kundendaten die folgenden Felder enth&auml;lt:<\/p>\n<ul>\n<li><b>BIC<\/b><\/li>\n<li><b>Bankbezeichnung<\/b><\/li>\n<\/ul>\n<p>Da es zu jeder <b>BIC<\/b> genau eine Bank gibt, ist das Feld <b>Bankbezeichnung <\/b>transitiv vom Feld <b>BIC <\/b>abh&auml;ngig. <\/p>\n<h2>Beispiel Artikeltabelle<\/h2>\n<p>Ein anderes Beispiel ist eine Artikeltabelle mit den folgenden Feldern:<\/p>\n<ul>\n<li>ArtikelID<\/li>\n<li>Artikelbezeichnung<\/li>\n<li>Einzelpreis<\/li>\n<li>Hersteller<\/li>\n<li>Ansprechpartner<\/li>\n<\/ul>\n<p>Der Ansprechpartner kann nicht direkt dem Artikel zugeordnet werden, sondern dem Hersteller. Daher ist das Feld <b>Ansprechpartner <\/b>transitiv vom Feld <b>Hersteller <\/b>abh&auml;ngig.<\/p>\n<p>Das letzte Beispiel, das wir uns dann auch in der Praxis ansehen, bietet eine Tabelle mit den folgenden Feldern:<\/p>\n<ul>\n<li><b>BestellID <\/b>(Prim&auml;rschl&uuml;sselfeld)<\/li>\n<li><b>Bestelldatum<\/b><\/li>\n<li><b>KundeID<\/b><\/li>\n<li><b>Firma<\/b><\/li>\n<li><b>Ansprechpartner<\/b><\/li>\n<\/ul>\n<p>Hier ist offensichtlich, dass die Felder <b>Firma <\/b>und <b>Ansprechpartner <\/b>zum Feld <b>KundeID <\/b>geh&ouml;ren, also nicht direkt vom Prim&auml;rschl&uuml;sselfeld <b>BestellID <\/b>abh&auml;ngen.<\/p>\n<p>Die Gefahr, die hier besteht, sind Inkonsistenzen bez&uuml;glich der Felder <b>KundeID<\/b>, <b>Firma <\/b>und <b>Ansprechpartner<\/b>. Wie Bild 1 zeigt, kann es durchaus vorkommen, dass mehrere Bestellungen f&uuml;r den gleichen Kunden vorgesehen sind &#8211; hier bei den Datens&auml;tzen mit den Werten <b>1 <\/b>und <b>4 <\/b>im Feld <b>BestellungID<\/b>.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_512_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_512_001.png\" alt=\"Zu normalisierende Daten\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Zu normalisierende Daten<\/p>\n<p>Wenn sich jemand bei der Eingabe der Daten beispielsweise wie in Bild 2 im Feld <b>Firma <\/b>vertippt, gibt es zwei Bestellungen an den gleichen Kunden, der aber keinen identischen Firmennamen hat. Sucht man nun nach allen Bestellungen eines Kunden &uuml;ber den Firmennamen, findet man nicht mehr alle Bestellungen dieses Kunden.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_512_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_512_003.png\" alt=\"Inkonsistente Werte im Feld Firma\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Inkonsistente Werte im Feld Firma<\/p>\n<h2>Dritte Normalform herbeif&uuml;hren<\/h2>\n<p>Die dritte Normalform f&uuml;hren wir herbei, indem wir eine neue Tabelle erstellen, in die wir das Nichtschl&uuml;sselfeld und die davon abh&auml;ngigen Felder einf&uuml;gen. Das Nichtschl&uuml;sselfeld wird in der neuen Tabelle zum Prim&auml;rschl&uuml;sselfeld.<\/p>\n<p>In der vorherigen Tabelle wird das Nichtschl&uuml;sselfeld zum Fremdschl&uuml;sselfeld, &uuml;ber das eine Beziehung zu den Datens&auml;tzen der neuen Tabelle hergestellt wird. Die vom Nichtschl&uuml;sselfeld abh&auml;ngigen Felder in der urspr&uuml;nglichen Tabelle werden nach dem Auslagern der Daten in die neue Tabelle gel&ouml;scht.<\/p>\n<p>In unserem Beispiel mit der Tabelle <b>tblBestellungen <\/b>bedeutet dies, dass wir eine neue Tabelle namens <b>tblKunden<\/b> erstellen, welche die folgenden Felder aufnimmt:<\/p>\n<ul>\n<li><b>KundeID <\/b>(Prim&auml;rschl&uuml;sselfeld)<\/li>\n<li><b>Firma<\/b><\/li>\n<li><b>Ansprechpartner<\/b><\/li>\n<\/ul>\n<p>Danach legen wir eine Beziehung zwischen dem Feld <b>KundeID <\/b>der Tabelle <b>tblBestellungen <\/b>und <b>tblKunden <\/b>an, bei der wir &uuml;ber das Feld <b>KundeID <\/b>aus <b>tblBestellungen <\/b>angeben, welcher Kundendatensatz aus <b>tblKunden <\/b>zu dieser Bestellung geh&ouml;rt.<\/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\/55000512\/\">\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\/55000512?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\/55000512\/\"\/>\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 Entwurf eines Datenmodells und der darin enthaltenen Tabellen und Beziehungen erfordert vor allem eines: Das Ber&uuml;cksichtigen der Normalformen. Dies sind Regeln, mit denen Sie die ben&ouml;tigten Felder auf verschiedene Tabellen aufteilen. Dabei ist das Ziel, redundante Daten auszuschlie&szlig;en und Inkonsistenzen zu verhindern. Diese Artikelreihe beschreibt die wichtigsten Normalformen und wie Sie diese in der Praxis anwenden. In diesem Teil ist die dritte Normalform an der Reihe.<\/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":[66012021,662021,44000003],"tags":[],"class_list":["post-55000512","post","type-post","status-publish","format-standard","hentry","category-66012021","category-662021","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>Normalisierung, Teil 3: Die dritte Normalform - Access [basics]<\/title>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Normalisierung, Teil 3: Die dritte Normalform - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Der Entwurf eines Datenmodells und der darin enthaltenen Tabellen und Beziehungen erfordert vor allem eines: Das Ber&uuml;cksichtigen der Normalformen. Dies sind Regeln, mit denen Sie die ben&ouml;tigten Felder auf verschiedene Tabellen aufteilen. Dabei ist das Ziel, redundante Daten auszuschlie&szlig;en und Inkonsistenzen zu verhindern. Diese Artikelreihe beschreibt die wichtigsten Normalformen und wie Sie diese in der Praxis anwenden. In diesem Teil ist die dritte Normalform an der Reihe.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-01T00:00:00+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\/pic_512_001.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=\"10\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\/Normalisierung_Teil_3_Die_dritte_Normalform.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/vg08.met.vgwort.de\/na\/858daf87684543b5a7c3ec75bd3eca7d\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html\",\"name\":\"Normalisierung, Teil 3: Die dritte Normalform - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html#primaryimage\"},\"datePublished\":\"2021-02-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.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\/Normalisierung_Teil_3_Die_dritte_Normalform.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Normalisierung_Teil_3_Die_dritte_Normalform.html\",\"name\":\"Normalisierung, Teil 3: Die dritte Normalform\"}}]},{\"@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\/55000512","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=55000512"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000512\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000512"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000512"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}