{"id":518,"date":"2021-07-02T10:47:22","date_gmt":"2021-07-02T08:47:22","guid":{"rendered":"https:\/\/www.iot-embedded.de\/iot-2021\/?p=518"},"modified":"2021-07-02T10:47:24","modified_gmt":"2021-07-02T08:47:24","slug":"smart-drives-datenmodell","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2021\/smart-drive\/smart-drives-datenmodell\/","title":{"rendered":"Smart Drive&#8217;s Datenmodell"},"content":{"rendered":"\n<p>Smart Drive&#8217;s Datenmodell<\/p>\n\n\n\n<p>Daten sind f\u00fcr unser Gesch\u00e4ftsmodell von gro\u00dfer Bedeutung. Deshalb haben wir uns Gedanken \u00fcber unser initiales Datenmodell gemacht und ein ERD erstellt. Dieses ist f\u00fcr den Anfang mit nur drei Entit\u00e4ten nicht gro\u00df, sieht dabei jedoch schon Daten f\u00fcr die Zukunft vor.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"561\" height=\"312\" src=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/06\/ERD-1.png\" alt=\"\" class=\"wp-image-527\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/06\/ERD-1.png 561w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/06\/ERD-1-300x167.png 300w\" sizes=\"(max-width: 561px) 100vw, 561px\" \/><figcaption>ERD Smart Drive<\/figcaption><\/figure>\n\n\n\n<p>Kern unseres Gesch\u00e4ftsmodells sind die aufgezeichneten Fahrdaten unserer Kunden, die aktuell insgesamt sechs Messwerte umfassen. Obwohl zun\u00e4chst nur die Beschleunigungsdaten in X, Y und Z-Richtung zur Auswertung verwendet werden, speichern wir die gemessenen Rotationsdaten f\u00fcr zuk\u00fcnftige Auswertungen ebenfalls ab. Das bietet uns zu einem sp\u00e4teren Zeitpunkt die M\u00f6glichkeit auf die bereits gesammelten Daten f\u00fcr m\u00f6gliche Machine Learning Anwendungen zur\u00fcckgreifen zu k\u00f6nnen. Essentiell f\u00fcr die Messreihen sind Zeitstempel der einzelnen Messwerte, damit diese in korrekter Reihenfolge ausgewertet und visualisiert werden k\u00f6nnen. Au\u00dferdem wichtig ist die Zuordnung zu einem bestimmten IoT-Device, damit Kunden nur die Daten des ausgew\u00e4hlten Device sehen k\u00f6nnen. Daf\u00fcr wird die ID des Device, der die Messung durchgef\u00fchrt hat, als Fremdschl\u00fcssel aufgenommen. Da von einem Device zu einem Zeitpunkt maximal ein Messwert vorhanden sein kann, kann ein Messpunkt mit den beiden Attributen Zeitpunkt der Messung und ID des messenden Device eindeutig identifiziert werden, sodass diese den Prim\u00e4rschl\u00fcssel bilden.<\/p>\n\n\n\n<p>Zur Messung des Fahrverhaltens unserer Kunden, werden unsere selbst produzierten IoT-Devices an die Kunden ausgegeben. Dabei kann ein Kunde mehr als ein Ger\u00e4t kaufen. Wir speichern den Typ des Ger\u00e4ts und das Ausgabedatum an den Kunden, um regelm\u00e4\u00dfige Wartung und schnelle Fehleranalyse zu gew\u00e4hrleisten. Jedes Device bekommt eine von der Balena Cloud generierte eindeutige ID, die als Prim\u00e4rschl\u00fcssel verwendet wird. Zus\u00e4tzlich wird als Fremdschl\u00fcssel die Kundennummer des Kunden aufgenommen, der das Device gekauft hat.<\/p>\n\n\n\n<p>Zudem speichern wir Daten unserer Kunden. Zun\u00e4chst wurde im ERD nur eine minimale Auswahl an Attributen modelliert, da weiteres f\u00fcr die technische Umsetzung nicht erforderlich ist. Zu einem sp\u00e4teren Zeitpunkt m\u00fcssen hier Adressdaten u. a. hinzugef\u00fcht werden. Die Erweiterung stellt kein Problem dar, da jeder Kunde bereits jetzt eine eindeutige Kundennummer bekommt, die als Prim\u00e4rschl\u00fcssel verwendet wird. Die Kundennummer besteht aus 6 Zeichen, wobei die 26 Buchstaben des Alphabets sowie die Ziffern 0-9 verwendet werden k\u00f6nnen. Daraus ergibt sich eine Menge von (26 + 10)^6 = 2.176.782.336 m\u00f6glichen Kundennummern. Diese Menge sollte f\u00fcr die Dauer unseres Gesch\u00e4fts ausreichen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Relationenschema<\/h2>\n\n\n\n<p>Um unser Datenmodell in einem relationalen DBMS umzusetzen, muss das oben erkl\u00e4rte ERD in ein Relationenschema transformiert werden. Die Umsetzung ist in diesem Fall relativ simpel, da jede Beziehung eine 1:n Beziehung ist. Das bedeutet, dass keine Verkn\u00fcpfungstabellen notwendig sind, da die Beziehung in der Tabelle der Entit\u00e4t abgebildet werden kann. Ansonsten wird pro Identit\u00e4t eine Tabelle mit den im ERD modellierten Prim\u00e4rschl\u00fcsseln verwendet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kunde<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><u>Kd.-Nr.<\/u><\/td><td>Vorname<\/td><td>Nachname<\/td><td>Geburtsdatum<\/td><\/tr><tr><td>1ab23c<\/td><td>Max<\/td><td>Mustermann<\/td><td>13.12.1999<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Das SQL-Statement zur Erstellung der Tabelle sieht wie folgt aus.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted block\">CREATE TABLE Kunde (\n\tKundennummer VARCHAR(6),\n\tVorname VARCHAR(64) NOT NULL,\n\tNachname VARCHAR(64) NOT NULL,\n\tGeburtsdatum DATE NOT NULL,\n\tPRIMARY KEY (Kundennummer)\n);\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Iot-Device<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><u>Device ID<\/u><\/td><td>Kd.-Nr.<\/td><td>Typ<\/td><td>Ausgabedatum<\/td><\/tr><tr><td>e6567070007e0e09652ae54dc8131af2<\/td><td>1ab23c<\/td><td>Raspberry Pi 4<\/td><td>15.06.2021<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-preformatted block\">CREATE TABLE Device (\n\tDevice_ID VARCHAR(32),\n\tKundennummer VARCHAR(6) NOT NULL,\n\tTyp VARCHAR(128) NOT NULL,\n\tAusgabedatum DATE NOT NULL,\n\tPRIMARY KEY (Device_ID)\n);\n\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Fahrdatum<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><u>Zeitstempel<\/u><\/td><td><u>Device ID<\/u><\/td><td>X_Beschleunigung<\/td><td>Y_Beschleunigung<\/td><td>Z_Beschleunigung<\/td><td>X_Rotation<\/td><td>Y_Rotation<\/td><td>Z_Rotation<\/td><\/tr><tr><td>2021-06-25 19:09:32.909<\/td><td>e6567070007e0e09652ae54dc8131af2<\/td><td>1.06689453125<\/td><td>-0.021728515625<\/td><td>-0.03759765625<\/td><td>-245<\/td><td>-108<\/td><td>294<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-preformatted block\">CREATE TABLE Fahrdatum (\n\tZeitstempel TIMESTAMP,\n\tDevice_ID VARCHAR(32),\n\tX_acc DECIMAL,\n\tY_acc DECIMAL,\n\tZ_acc DECIMAL,\n\tX_rot SMALLINT,\n\tY_rot SMALLINT,\n\tZ_rot SMALLINT,\n\tPRIMARY KEY (Zeitstempel, Device_ID)\n);\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Auswahl der Datentypen<\/h2>\n\n\n\n<p>F\u00fcr die gemessenen Beschleunigungswerte wurde der Datentyp <i>DECIMAL<\/i> der PostgreSQL Datenbank ausgew\u00e4hlt, da die Nachkommastellen dieser Werte essentiell sind. Ein Ganzzahl-Datentyp kommt daher nicht in Betracht und es wurde der kleinere Datentyp f\u00fcr Gleitkommazahlen gew\u00e4hlt. Es k\u00f6nnen bis zu 16.383 Stellen nach dem Komma exakt gespeichert werden. Der Bedarf an Speicherplatz ist f\u00fcr diesen Datentyp variabel, also abh\u00e4ngig von den tats\u00e4chlich gespeicherten Werten.<\/p>\n\n\n\n<p>Da die Rotationswerte nur ganzzahlig im Wertebereich von -360 bis 360 m\u00f6glich sind, wurde daf\u00fcr der Typ <i>SMALLINT<\/i> ausgew\u00e4lt. Damit sind Werte von -32.768 bis +32.767 in den Spalten speicherbar. Daf\u00fcr werden pro Wert 2 Byte Speicherplatz ben\u00f6tigt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Smart Drive&#8217;s Datenmodell Daten sind f\u00fcr unser Gesch\u00e4ftsmodell von gro\u00dfer Bedeutung. Deshalb haben wir uns Gedanken \u00fcber unser initiales Datenmodell gemacht und ein ERD erstellt. Dieses ist f\u00fcr den Anfang mit nur drei Entit\u00e4ten nicht gro\u00df, sieht dabei jedoch schon<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[8],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/518"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/comments?post=518"}],"version-history":[{"count":7,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/518\/revisions"}],"predecessor-version":[{"id":528,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/518\/revisions\/528"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/media?parent=518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/categories?post=518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/tags?post=518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}