Abstrakte Datenschicht

Die abstrakte Datenschicht, das einheitliche Systemdatenmodell, die Geräteabstraktion und die Datennormalisierung, die Anwendungen von der physischen Speicherung entkoppeln.

Die abstrakte Datenschicht liegt zwischen der physischen Speicherung der Daten und den Anwendungen, die sie nutzen. Sie abstrahiert die physische Umsetzung und die Hardwarespezifika und stellt eine einheitliche Schnittstelle für die Arbeit mit den Daten bereit. Sie bietet:

  • Hardwareunabhängigkeit: Die Daten werden auf unterschiedlichen Geräten gespeichert (Server, Cloud, IoT-Geräte), doch die Anwendung greift über eine einheitliche Schnittstelle darauf zu.
  • Einfachere Entwicklung: Entwickler arbeiten mit abstrakten Entitäten, ohne sich um die Details der physischen Speicherung kümmern zu müssen.
  • Flexibilität: Änderungen an der physischen Struktur der Daten (etwa eine Migration in die Cloud) wirken sich nicht auf die Anwendungen aus.

Einheitliches Datenmodell

Das System verwendet ein einheitliches Datenmodell, das an unterschiedliche Gerätetypen angepasst ist und eine einheitliche Arbeit mit ihnen ermöglicht – unabhängig von ihrer Quelle oder ihrem Gerätetyp. Es umfasst gemeinsame Datenstrukturen, einheitliche Verarbeitungsregeln und die semantische Konsistenz der Daten über alle Systeme und Subsysteme hinweg.

Ein einheitliches Systemdatenmodell umfasst beispielsweise:

  • Entitäten: Geräte, Kanäle, Sitzungen, Einheiten und Referenzparameter.
  • Beziehungen: Geräte besitzen Kanäle, Kanäle stehen mit Daten in Beziehung und Daten stehen mit Sitzungen in Beziehung.
  • Attribute: Für jede Entität sind Attribute definiert (zum Beispiel equipment.serial_number und channel_data.value).

Aufbau des einheitlichen Systemdatenmodells

Das einheitliche Systemdatenmodell ist eine Struktur zum Speichern und Verwalten von Daten zu Geräten, Kanälen, Sitzungen und Messungen. Sehen wir uns jede Tabelle und ihren Zweck sowie die Beziehungen zwischen ihnen an.

Tabelle channel_data

Diese Tabelle speichert die Daten, die innerhalb bestimmter Sitzungen aus den Gerätekanälen empfangen werden.

FeldTypBeschreibung
idbigintEindeutige Datensatzkennung (Primärschlüssel).
equipment_idbigintVerweis auf das Gerät (equipment.id).
seance_idbigintVerweis auf die Sitzung (seances.id).
channel_idbigintVerweis auf den Kanal (channels.id).
unit_idbigintVerweis auf die Maßeinheit (units.id).
archive_type_idintegerVerweis auf den Archivtyp (referenceparameters.id).
event_timeintegerZeitpunkt des Ereignisses (z. B. Zeitstempel).
valuecharacter varying(100)Der vom Kanal empfangene Wert.
created_attimestamp(6) without time zoneZeitpunkt der Erstellung des Datensatzes.
updated_attimestamp(6) without time zoneZeitpunkt der letzten Aktualisierung des Datensatzes.

Beziehungen:

  • Der Fremdschlüssel unit_id verweist auf die Tabelle units.
  • Der Fremdschlüssel archive_type_id verweist auf die Tabelle referenceparameters.
  • Der Fremdschlüssel equipment_id verweist auf die Tabelle equipment.
  • Der Fremdschlüssel channel_id verweist auf die Tabelle channels.
  • Der Fremdschlüssel seance_id verweist auf die Tabelle seances.

Tabelle units

Diese Tabelle speichert die für die Kanaldaten verwendeten Maßeinheiten.

FeldTypBeschreibung
idbigintEindeutige Datensatzkennung (Primärschlüssel).
namecharacter varying(30)Bezeichnung der Maßeinheit.
varnamecharacter varying(30)Kurzer Variablenname für die Maßeinheit.
descriptioncharacter varying(100)Beschreibung der Maßeinheit.
conversion_factordouble precisionUmrechnungsfaktor für eine Maßeinheit.
roundingsmallintAnzahl der Nachkommastellen zum Runden.
synonymscharacter varying[]Array von Synonymen für die Maßeinheit.
created_attimestamp(6) without time zoneZeitpunkt der Erstellung des Datensatzes.
updated_attimestamp(6) without time zoneZeitpunkt der letzten Aktualisierung des Datensatzes.

Tabelle referenceparameters

Diese Tabelle speichert Referenzparameter wie Archivtypen oder andere Qualifizierer.

FeldTypBeschreibung
idbigintEindeutige Kennung des Datensatzes (Primärschlüssel).
namecharacter varying(30)Die Bezeichnung der Maßeinheit.
varnamecharacter varying(30)Kurzer Variablenname für die Maßeinheit.
descriptioncharacter varying(100)Beschreibung der Maßeinheit.
parent_idintegerVerweis auf den übergeordneten Parameter (Hierarchie).
referencemodel_idintegerVerweis auf das Verzeichnismodell.
created_attimestamp(6) without time zoneZeitpunkt der Erstellung des Datensatzes.
updated_attimestamp(6) without time zoneZeitpunkt der letzten Aktualisierung des Datensatzes.
deleted_attimestamp(6) without time zoneZeitpunkt der Löschung des Datensatzes (Soft Delete).

Beziehungen:

  • Der Fremdschlüssel parent_id verweist auf dieselbe Tabelle (referenceparameters.id) und ermöglicht so den Aufbau von Hierarchien.

Tabelle equipment

FeldTypBeschreibung
idbigintEindeutige Kennung des Datensatzes (Primärschlüssel).
equipment_type_idbigintVerweis auf den Gerätetyp.
serial_numbercharacter varying(25)Seriennummer des Geräts.
manufacture_datetimestamp(6) without time zoneHerstellungsdatum des Geräts.
installation_datetimestamp(6) without time zoneInstallationsdatum des Geräts.
program_versioncharacter varying(100)Softwareversion des Geräts.
created_attimestamp(6) without time zoneZeitpunkt der Erstellung des Datensatzes.
updated_attimestamp(6) without time zoneZeitpunkt der letzten Aktualisierung des Datensatzes.

Tabelle channels

Diese Tabelle speichert Informationen über die Gerätekanäle.

FeldTypBeschreibung
idbigintEindeutige Kennung des Datensatzes (Primärschlüssel).
equipment_type_idbigintVerweis auf den Gerätetyp (equipment_type.id).
unit_idbigintVerweis auf die Maßeinheit (units.id).
namecharacter varying(100)Kanalname.
varnamecharacter varying(20)Kurzer Variablenname für den Kanal.
created_attimestamp(6) without time zoneZeitpunkt der Erstellung des Datensatzes.
updated_attimestamp(6) without time zoneZeitpunkt der letzten Aktualisierung des Datensatzes.

Beziehungen:

  • Der Fremdschlüssel equipment_type_id verweist auf die Tabelle equipment_type.
  • Der Fremdschlüssel unit_id verweist auf die Tabelle units.

Tabelle seances

Diese Tabelle speichert Informationen über die Kommunikationssitzungen des Geräts.

FeldTypBeschreibung
idbigintEindeutige Kennung des Datensatzes (Primärschlüssel).
telemetry_idbigintVerweis auf die Telemetrie (telemetry.id).
event_timeintegerZeitpunkt des Ereignisses.
evtidsmallintKennung des Ereignisses.
trycntsmallintAnzahl der Versuche.
tryflcharacter varying(12)Flag des Versuchs.
statesmallintStatus der Sitzung.
btmintegerBatterieladung.
rssiintegerSignalstärke (falls verwendet).
created_attimestamp(6) without time zoneZeitpunkt der Erstellung des Datensatzes.
updated_attimestamp(6) without time zoneZeitpunkt der letzten Aktualisierung des Datensatzes.

Allgemeine Struktur und Beziehungen

Haupttabellechannel_data, die Kanaldaten mit Geräten, Sitzungen und Einheiten verknüpft.

Beziehungstabellen:

  • units – Maßeinheiten.
  • referenceparameters – Archivtypen und andere Qualifizierer.

Gerätetabellen:

  • equipment – Geräteinformationen.
  • channels – Gerätekanäle.

Sitzungstabelleseances, die Informationen über Kommunikationssitzungen speichert.

Anwendungsbeispiel:

  • Kanaldaten (channel_data) stammen aus Geräten (equipment) innerhalb bestimmter Sitzungen (seances).
  • Jeder Kanal (channels) verfügt über seine eigene Maßeinheit (units).
  • Der Archivtyp (referenceparameters) legt fest, wie die Daten gespeichert oder verarbeitet werden sollen.

Vorteile eines einheitlichen Modells

Dieses Datenmodell bietet die Flexibilität und Skalierbarkeit, um Daten von unterschiedlichen Geräten zu speichern und zu analysieren.

Zu den Vorteilen eines einheitlichen Datenmodells zählen:

  • Konsistenz: Die Daten besitzen über alle Systeme hinweg dieselbe Struktur und Semantik.
  • Skalierbarkeit: Neue Datenquellen oder Gerätetypen lassen sich leicht hinzufügen.
  • Datenschutz: Einheitliche Mechanismen für Authentifizierung, Autorisierung und Verschlüsselung.
  • Einfachere Analyse: Die Daten lassen sich mit einheitlichen Werkzeugen analysieren.

Geräteabstraktion

Die Geräteabstraktion ist ein zentrales Konstruktionsprinzip des Systems, das die Logik der Datenverarbeitung von den physischen Eigenschaften der Geräte trennt. Dies ist besonders bei Systemen wichtig, die heterogene Geräte einsetzen.

Geräteabstraktion bedeutet, dass das System die Daten auf einer logischen Ebene verarbeitet, die von den physischen Geräten unabhängig ist, auf denen die Daten gespeichert oder verarbeitet werden. Erreicht wird dies durch:

  • Vereinheitlichung der Schnittstellen: Eine einheitliche Art des Datenzugriffs, unabhängig vom Gerät.
  • Verbergen der Umsetzungsdetails: Der physische Speicherort der Daten, die Übertragungsprotokolle und weitere technische Aspekte bleiben vor den Anwendungen verborgen.
  • Adapter: Umwandlung der Daten aus einem gerätespezifischen Format in ein einheitliches Format.

Umsetzung der Geräteabstraktion

Das folgende Beispiel zeigt, wie dieser Ansatz in unserem System umgesetzt wird. Es verfolgt die Daten von einem IoT-Gerät über einen Adapter in das einheitliche Datenmodell und über die API wieder hinaus.

Betrachten wir ein IoT-Gerät, das Daten zum Gasverbrauch sendet. Die implementierten Algorithmen ermöglichen es uns:

  • Die Daten über einen Adapter vom Gerät zu empfangen.
  • Sie in eine channel_data-Struktur umzuwandeln.
  • Sie in einer Datenbank zu speichern.
  • Den Zugriff auf die Daten über eine API bereitzustellen.

Für jeden Gerätetyp werden Adapter erstellt, die gerätespezifische Protokolle verarbeiten und die Daten in ein einheitliches Format umwandeln.

Beispiel: Datentransformation

Bei einem IoT-Gerät können die Daten im JSON-Format eintreffen:

example.json
{
  "device_id": "sensor-123",
  "timestamp": 1739950861,
  "value": 42.5
}

Der Adapter wandelt die Daten in eine channel_data-Struktur um:

example.sql
INSERT INTO channel_data (equipment_id, seance_id, channel_id,
 archive_type_id, value, event_time)
VALUES (1, 2, 3, 4, '42.5', 1739950861);

Datenabfrage:

Request example
GET /api/v1/channel_data?equipment_id=1&archive_type=daily&channel_id=3

Antwort:

Response example
[
  {
    "id": 123,
    "equipment_id": 1,
    "seance_id": 2,
    "channel_id": 3,
    "archive_type_id": 4,
    "value": 42.5,
    "event_time": 1739950861
  }
]

Vorteile der Geräteabstraktion

  • Hardwareunabhängigkeit: Anwendungen arbeiten mit den Daten, ohne zu wissen, wo diese physisch liegen.
  • Flexibilität: Neue Geräte lassen sich leicht hinzufügen und bestehende leicht anpassen.
  • Einfachere Entwicklung: Entwickler arbeiten mit abstrakten Entitäten, ohne sich um Hardwaredetails kümmern zu müssen.
  • Skalierbarkeit: Die Daten können auf unterschiedlichen Geräten gespeichert werden, das System arbeitet dennoch einheitlich weiter.

Datennormalisierung

Datennormalisierung ist der Prozess, Daten in einer Datenbank so zu strukturieren, dass Redundanz minimiert und die Datenintegrität verbessert wird. Im Kontext der abstrakten Datenschicht spielt die Normalisierung eine zentrale Rolle bei der Erstellung eines einheitlichen, effizienten Datenmodells, das sich für die Verarbeitung unterschiedlicher Gerätetypen und Datenquellen nutzen lässt.

Die Datennormalisierung teilt die Daten in logische Tabellen auf und stellt Beziehungen zwischen ihnen her, um:

  • Doppelte Daten zu vermeiden.
  • Pflege und Aktualisierung der Daten zu vereinfachen.
  • Die Datenintegrität sicherzustellen.
  • Die Abfrageleistung zu verbessern.

Das einheitliche Datenmodell des Systems ist hinsichtlich atomarer (skalarer) Werte auf die (dritte) Boyce-Codd-Normalform reduziert. Einige Entitäten des Datenmodells verwenden zusammengesetzte Strukturen, um die Verarbeitung seltener, nicht standardisierter Attribute zu optimieren.

Vorteile der Normalisierung

  • Beseitigt Redundanz: Die Daten werden an einer Stelle gespeichert, wodurch Redundanz verringert wird.
  • Datenkonsistenz: Die Wahrung der Datenkonsistenz wird vereinfacht.
  • Flexibilität: Änderungen an der Datenstruktur lassen sich leicht vornehmen.
  • Leistung: Die Abfrageleistung wird verbessert (in den meisten Fällen).

Normalisierung im Kontext der abstrakten Datenschicht

Die Datennormalisierung ist ein wichtiger Schritt beim Entwurf der abstrakten Datenschicht.

Sie ermöglicht es Ihnen:

  • Ein einheitliches Datenmodell zu erstellen, das sich für die Verarbeitung unterschiedlicher Gerätetypen nutzen lässt.
  • Redundanz und Datenduplizierung zu vermeiden.
  • Die Datenintegrität und -konsistenz unabhängig von der Quelle sicherzustellen.
  • Die Integration neuer Geräte und Systeme zu vereinfachen.

Verwandte Themen

Zuletzt aktualisiert am

War diese Seite hilfreich?