{"id":55000501,"date":"2020-10-01T00:00:00","date_gmt":"2020-10-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/501"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Filmdatenbank_Teil_1_Datenmodell","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html","title":{"rendered":"Filmdatenbank, Teil 1: Datenmodell"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/7ff67c9abfe142dc9ff2f1428115750e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class='introduction'>Eine Filmdatenbank ist ein tolles Beispiel f&uuml;r eine Datenbank, die einmal nicht &uuml;berwiegend beruflich eingesetzt wird, sondern auch f&uuml;r Hobbyprogrammierer interessant ist. In dieser Artikelreihe wollen wir eine Datenbank programmieren, die Filme inklusive Darstellern, Regisseuren, Genres und vielen weiteren Daten speichert und die Suche darin erlaubt. Auch brauchen wir uns diesmal keine Sorgen um das Bereitstellen von Beispieldaten zu machen: Die Internet-Filmdatenbank IMDB bietet ihre kompletten Daten zum Download an. Das liefert uns gleichzeitig prima Material f&uuml;r die Beschreibung des Imports von Daten aus Textdateien in eine Access-Datenbank. Im ersten Teil der Beitragsreihe schauen wir uns die Daten an, die IMDB bereitstellt, und entwerfen das Datenmodell f&uuml;r die Filmdatenbank.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>2005_Filmdatenbank.accdb<\/b>.<\/p>\n<h2>Beispieldaten aus dem echten Leben<\/h2>\n<p>Die Internetfilmdatenbank IMDB enth&auml;lt sehr viele Filme (zum Zeitpunkt der Erstellung dieses Artikels ca. 7,3 Millionen Eintr&auml;ge in der Filme-Datei, allerdings sind dort auch Serien mit Staffeln enthalten) inklusive weiteren Daten wie Darstellern, Regisseuren, Genres und so weiter.<\/p>\n<p>Die Beispieldaten finden Sie unter dieser Internetadresse:<\/p>\n<pre>https:\/\/datasets.imdbws.com\/<\/pre>\n<p>Hier finden Sie sieben gezippte Textdateien vor (siehe Bild 1). Diese sind unterschiedlich gro&szlig; &#8211; die gr&ouml;&szlig;te enth&auml;lt gepackt &uuml;ber 300 MB, entpackt sogar &uuml;ber 600MB! Das hei&szlig;t, dass wir an die Grenzen einer Access-Datenbank von 2 GB sto&szlig;en k&ouml;nnten.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_501_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_501_001.png\" alt=\"Download der Filmdaten von IMDB\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Download der Filmdaten von IMDB<\/p>\n<p>Allerdings k&ouml;nnen wir diese Datenmenge vermutlich durch geschicktes Aufteilen auf verkn&uuml;pfte Datenbanken reduzieren.<\/p>\n<h2>Tabellen des Datenmodells<\/h2>\n<p>Die Haupttabelle hei&szlig;t nat&uuml;rlich <b>tblFilme<\/b>, denn um diese dreht es sich haupts&auml;chlich. Die Tabelle <b>tblFilme <\/b>sieht im Entwurf wie in Bild 2 aus. Sie hat keine Fremdschl&uuml;sselfelder zu Lookup-Tabellen &#8211; noch nicht einmal zur Auswahl eines Genres. Der Grund ist einfach: Jeder Film kann mehreren Genres zugeordnet werden, daher verwenden wir eine Verkn&uuml;pfungs-tabelle zwischen den Eintr&auml;gen der Tabelle <b>tblFilme <\/b>und der noch zu erstellenden Tabelle der Genres.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_501_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_501_002.png\" alt=\"Entwurf der Tabelle tblFilme\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Entwurf der Tabelle tblFilme<\/p>\n<p>Wie dem Bild zu entnehmen ist, verwenden wir keinen eindeutigen Schl&uuml;ssel f&uuml;r das Feld <b>Titel<\/b>. Sollten wir nicht eigentlich daf&uuml;r sorgen, dass jeder Film nur einmal in die Tabelle aufgenommen werden kann Ja, normalerweise ist die Logik korrekt, aber bei Filmen kann es durchaus vorkommen, dass zwei Filme den gleichen Titel tragen oder der gleiche Film als Remake wiederver&ouml;ffentlicht wird. <\/p>\n<h2>Tabelle zum Speichern der Genres<\/h2>\n<p>Die zweite Tabelle, die wir anlegen, hei&szlig;t <b>tblGenres<\/b>. Diese Tabelle ist eine einfache Lookup-tabelle, die neben dem Prim&auml;rschl&uuml;sselfeld <b>GenreID <\/b>nur das Feld <b>Genre <\/b>zum Speichern der Bezeichnung enth&auml;lt.<\/p>\n<p>Dieses Feld versehen wir mit einem eindeutigen Index, den wir &uuml;ber die Eigenschft <b>Indiziert <\/b>mit dem Wert <b>Ja (Ohne Duplikate) <\/b>festlegen (siehe Bild 3).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_501_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_501_003.png\" alt=\"Entwurf der Tabelle tblGenres\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Entwurf der Tabelle tblGenres<\/p>\n<h2>Tabelle zum Verkn&uuml;pfen von Filmen und Genres<\/h2>\n<p>Die Daten der IMDB halten Informationen dar&uuml;ber bereit, welcher Film welchem Genre zugeordnet ist. Diese Information bilden wir in einer Verkn&uuml;pfungstabelle ab, welche jeweils einen Eintrag der Tabelle <b>tblFilme <\/b>mit einem Eintrag der Tabelle <b>tblGenres <\/b>zusammenf&uuml;hrt.<\/p>\n<p>Die Verkn&uuml;pfungstabelle soll <b>tblFilmeGenres <\/b>hei&szlig;en und enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld jeweils ein Fremdschl&uuml;sselfeld zur Auswahl des Films und eines zur Auswahl des Genres. Wir richten diese beiden Fremdschl&uuml;sselfelder als Nachschlagefelder ein, damit diese beim Hinzuf&uuml;gen zu Formularen sp&auml;ter direkt als Kombinationsfelder implementiert werden. Bei Einrichten der Nachschlagefelder achten wir insbesondere darauf, dass die Beziehung zwischen den Tabellen <b>tblFilme <\/b>und <b>tblFilmeGenres <\/b>mit referenzieller Integrit&auml;t angelegt und die L&ouml;schweitergabe f&uuml;r diese Beziehung aktiviert wird. Diese sorgt daf&uuml;r, dass beim L&ouml;schen eines Films auch direkt die mit diesem Film verkn&uuml;pften Eintr&auml;ge der Tabelle <b>tblFilmeGenres <\/b>gel&ouml;scht werden.<\/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\/55000501\/\">\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\/55000501?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\/55000501\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"34aae43e8a\"\/>\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>Eine Filmdatenbank ist ein tolles Beispiel f&uuml;r eine Datenbank, die einmal nicht &uuml;berwiegend beruflich eingesetzt wird, sondern auch f&uuml;r Hobbyprogrammierer interessant ist. In dieser Artikelreihe wollen wir eine Datenbank programmieren, die Filme inklusive Darstellern, Regisseuren, Genres und vielen weiteren Daten speichert und die Suche darin erlaubt. Auch brauchen wir uns diesmal keine Sorgen um das Bereitstellen von Beispieldaten zu machen: Die Internet-Filmdatenbank IMDB bietet ihre kompletten Daten zum Download an. Das liefert uns gleichzeitig prima Material f&uuml;r die Beschreibung des Imports von Daten aus Textdateien in eine Access-Datenbank. Im ersten Teil der Beitragsreihe schauen wir uns die Daten an, die IMDB bereitstellt, und entwerfen das Datenmodell f&uuml;r die Filmdatenbank.<\/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":[662020,66052020,44000014],"tags":[],"class_list":["post-55000501","post","type-post","status-publish","format-standard","hentry","category-662020","category-66052020","category-Loesungen"],"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>Filmdatenbank, Teil 1: Datenmodell - Access [basics]<\/title>\n<meta name=\"description\" content=\"Eine Filmdatenbank ist ein tolles Beispiel f\u00fcr eine Datenbank, die einmal nicht \u00fcberwiegend beruflich eingesetzt wird, sondern auch f\u00fcr Hobbyprogrammierer interessant ist. In dieser Artikelreihe wollen wir eine Datenbank programmieren, die Filme inklusive Darstellern, Regisseuren, Genres und vielen weiteren Daten speichert und die Suche darin erlaubt. Auch brauchen wir uns diesmal keine Sorgen um das Bereitstellen von Beispieldaten zu machen: Die Internet-Filmdatenbank IMDB bietet ihre kompletten Daten zum Download an. Das liefert uns gleichzeitig prima Material f\u00fcr die Beschreibung des Imports von Daten aus Textdateien in eine Access-Datenbank. Im ersten Teil der Beitragsreihe schauen wir uns die Daten an, die IMDB bereitstellt, und entwerfen das Datenmodell f\u00fcr die Filmdatenbank.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Filmdatenbank, Teil 1: Datenmodell - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Eine Filmdatenbank ist ein tolles Beispiel f\u00fcr eine Datenbank, die einmal nicht \u00fcberwiegend beruflich eingesetzt wird, sondern auch f\u00fcr Hobbyprogrammierer interessant ist. In dieser Artikelreihe wollen wir eine Datenbank programmieren, die Filme inklusive Darstellern, Regisseuren, Genres und vielen weiteren Daten speichert und die Suche darin erlaubt. Auch brauchen wir uns diesmal keine Sorgen um das Bereitstellen von Beispieldaten zu machen: Die Internet-Filmdatenbank IMDB bietet ihre kompletten Daten zum Download an. Das liefert uns gleichzeitig prima Material f\u00fcr die Beschreibung des Imports von Daten aus Textdateien in eine Access-Datenbank. Im ersten Teil der Beitragsreihe schauen wir uns die Daten an, die IMDB bereitstellt, und entwerfen das Datenmodell f\u00fcr die Filmdatenbank.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-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_501_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=\"8\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\/Filmdatenbank_Teil_1_Datenmodell.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/vg08.met.vgwort.de\/na\/7ff67c9abfe142dc9ff2f1428115750e\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html\",\"name\":\"Filmdatenbank, Teil 1: Datenmodell - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html#primaryimage\"},\"datePublished\":\"2020-10-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Eine Filmdatenbank ist ein tolles Beispiel f\\u00fcr eine Datenbank, die einmal nicht \\u00fcberwiegend beruflich eingesetzt wird, sondern auch f\\u00fcr Hobbyprogrammierer interessant ist. In dieser Artikelreihe wollen wir eine Datenbank programmieren, die Filme inklusive Darstellern, Regisseuren, Genres und vielen weiteren Daten speichert und die Suche darin erlaubt. Auch brauchen wir uns diesmal keine Sorgen um das Bereitstellen von Beispieldaten zu machen: Die Internet-Filmdatenbank IMDB bietet ihre kompletten Daten zum Download an. Das liefert uns gleichzeitig prima Material f\\u00fcr die Beschreibung des Imports von Daten aus Textdateien in eine Access-Datenbank. Im ersten Teil der Beitragsreihe schauen wir uns die Daten an, die IMDB bereitstellt, und entwerfen das Datenmodell f\\u00fcr die Filmdatenbank.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.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\/Filmdatenbank_Teil_1_Datenmodell.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Filmdatenbank_Teil_1_Datenmodell.html\",\"name\":\"Filmdatenbank, Teil 1: Datenmodell\"}}]},{\"@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\/55000501","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=55000501"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000501\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}