Abstrakte Datenschicht
Die abstrakte Datenschicht ist eine Schicht zwischen der physischen Datenspeicherung und den Anwendungen, die sie nutzen. Sie ermöglicht die Abstraktion von physischen Implementierungs- und Hardwarespezifika und bietet eine einzige Schnittstelle für die Arbeit mit Daten. Sie bietet:
- Hardware-Unabhängigkeit: Die Daten werden auf verschiedenen Geräten gespeichert (Server, Cloud, IoT-Geräte), aber die Anwendung interagiert mit ihnen über eine einzige Schnittstelle.
- Vereinfachung der Entwicklung: Die Entwickler arbeiten mit abstrakten Einheiten, ohne sich um die Details der physischen Speicherung zu kümmern.
- Flexibilität: Änderungen an der physischen Struktur der Daten (z. B. Migration in die Cloud) haben keine Auswirkungen auf die Anwendungen.
Vereinheitlichtes Datenmodell
Das System verwendet ein einheitliches Datenmodell, das an die verschiedenen Gerätetypen angepasst ist und es Ihnen ermöglicht, mit ihnen auf einheitliche Weise zu arbeiten, unabhängig von ihrer Quelle oder ihrem Gerätetyp. Es umfasst gemeinsame Datenstrukturen, einheitliche Verarbeitungsregeln und semantische Konsistenz der Daten über alle Systeme und Subsysteme hinweg.
Ein einheitliches Systemdatenmodell umfasst zum Beispiel:
- Einheiten: Geräte, Kanäle, Sitzungen, Einheiten, Referenzparameter.
- Beziehungen: Geräte haben Kanäle, Kanäle sind mit Daten verbunden, Daten sind mit Sitzungen verbunden.
- Attribute: Für jede Entität werden Attribute definiert (z. B.
equipment.serial_number
,channel_data.value
).
Struktur des Unified System Datenmodells
Das Unified System Data Model ist eine Struktur zum Speichern und Verwalten von Daten in Bezug auf Hardware, Kanäle, Sitzungen und Messungen. Schauen wir uns die einzelnen Tabellen und ihren Zweck sowie die Beziehungen zwischen ihnen an.
Tabelle channel_data
In dieser Tabelle werden die von den Gerätekanälen innerhalb bestimmter Sitzungen empfangenen Daten gespeichert.
Feld | Typ | Beschreibung |
---|---|---|
id |
bigint |
Eindeutiger Datensatzbezeichner (Primärschlüssel). |
equipment_id |
bigint |
Referenz auf Ausrüstung (equipment.id ). |
seance_id |
bigint |
Verweis auf Sitzung (seances.id ). |
channel_id |
bigint |
Verweis auf den Kanal (channels.id ). |
unit_id |
bigint |
Verweis auf die Maßeinheit (units.id ). |
archive_type_id |
integer |
Referenz auf den Archivtyp (referenceparameters.id ). |
event_time |
integer |
Der Zeitpunkt des Ereignisses (z.B. Zeitstempel). |
value |
Character varying(100) |
Der vom Kanal empfangene Wert. |
created_at |
timestamp(6) without time zone |
Zeitpunkt, zu dem der Datensatz erstellt wurde. |
updated_at |
timestamp(6) without time zone |
Zeitpunkt, an dem der Datensatz zuletzt aktualisiert wurde. |
Beziehungen:
- Der Fremdschlüssel
unit_id
verweist auf die Tabelleunits
. - Der Fremdschlüssel
archive_type_id
verweist auf die Tabellereferenceparameters
. - Der Fremdschlüssel
equipment_id
verweist auf die Tabelleequipment
. - Der Fremdschlüssel
channel_id
verweist auf die Tabellechannels
. - Der Fremdschlüssel
seance_id
verweist auf die Tabelleseances
.
Tabelle units
In dieser Tabelle werden die für die Kanaldaten verwendeten Maßeinheiten gespeichert.
Feld | Typ | Beschreibung |
---|---|---|
id |
bigint |
Eindeutiger Datensatzbezeichner (Primärschlüssel). |
Name |
Zeichen variierend(30) |
Name der Maßeinheit. |
Varname |
Zeichen variierend(30) |
Kurzer Variablenname für die Maßeinheit. |
Beschreibung |
Zeichen variierend(100) |
Beschreibung der Maßeinheit. |
conversion_factor |
double precision |
Umrechnungsfaktor für eine Maßeinheit. |
rundung |
smallint |
Anzahl der Dezimalstellen, auf die gerundet wird. |
Synonyme |
Character varying[] |
Array von Synonymen für die Maßeinheit. |
created_at |
timestamp(6) without time zone |
Uhrzeit, zu der der Datensatz erstellt wurde. |
updated_at |
timestamp(6) without time zone |
Zeitpunkt, an dem der Datensatz zuletzt aktualisiert wurde. |
Tabelle referenceparameters
In dieser Tabelle werden Referenzparameter wie Archivtypen oder andere Qualifikatoren gespeichert.
Feld | Typ | Beschreibung |
---|---|---|
id |
bigint |
Eindeutiger Bezeichner des Datensatzes (Primärschlüssel). |
Name |
Character varying(30) |
Der Name der Maßeinheit. |
varname |
Zeichen variierend(30) |
Kurzer Variablenname für die Maßeinheit. |
Beschreibung |
Zeichen variierend(100) |
Beschreibung der Maßeinheit. |
parent_id |
integer |
Ein Verweis auf den übergeordneten Parameter (Hierarchie). |
referencemodel_id |
integer |
Verweis auf das Verzeichnismodell. |
created_at |
timestamp(6) without time zone |
Zeitpunkt, zu dem der Datensatz erstellt wurde. |
updated_at |
timestamp(6) without time zone |
Zeitpunkt, an dem der Datensatz zuletzt aktualisiert wurde. |
deleted_at |
timestamp(6) without time zone |
Zeitpunkt, an dem der Datensatz gelöscht wurde (soft delete). |
Beziehungen:
- Der Fremdschlüssel
parent_id
verweist auf dieselbe Tabelle (referenceparameters.id
), so dass Hierarchien gebildet werden können.
Tabelle equipment
Feld | Typ | Beschreibung |
---|---|---|
id |
bigint |
Eindeutiger Bezeichner des Datensatzes (Primärschlüssel). |
equipment_type_id |
bigint |
Referenz auf den Gerätetyp. |
serial_number |
Character varying(25) |
Seriennummer des Geräts. |
manufacture_date |
timestamp(6) without time zone |
Das Herstellungsdatum des Geräts. |
installation_date |
timestamp(6) without time zone |
Installationsdatum des Geräts. |
program_version |
Zeichen variierend(100) |
Softwareversion des Geräts. |
created_at |
timestamp(6) without time zone |
Uhrzeit, zu der der Datensatz erstellt wurde. |
updated_at |
timestamp(6) without time zone |
Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde. |
Tabelle channels
In dieser Tabelle werden Informationen über die Gerätekanäle gespeichert.
Feld | Typ | Beschreibung |
---|---|---|
id |
bigint |
Eindeutiger Bezeichner des Datensatzes (Primärschlüssel). |
equipment_type_id |
bigint |
Referenz auf den Gerätetyp (equipment_type.id ). |
unit_id |
bigint |
Verweis auf die Maßeinheit (units.id ). |
Name |
Zeichen variierend(100) |
Kanalname. |
Varname |
Zeichen variierend(20) |
Kurzer Variablenname für den Kanal. |
created_at |
timestamp(6) without time zone |
Zeitpunkt, zu dem der Datensatz erstellt wurde. |
updated_at |
timestamp(6) without time zone |
Zeitpunkt, an dem der Datensatz zuletzt aktualisiert wurde. |
Beziehungen:
- Der Fremdschlüssel
equipment_type_id
verweist auf die Tabelleequipment_type
. - Der Fremdschlüssel
unit_id
verweist auf die Tabelleunits
.
Tabelle seances
In dieser Tabelle werden Informationen über die Kommunikationssitzungen des Geräts gespeichert.
Feld | Typ | Beschreibung |
---|---|---|
id |
bigint |
Eindeutiger Bezeichner des Datensatzes (Primärschlüssel). |
telemetry_id |
bigint |
Referenz zur Telemetrie (telemetry.id ). |
event_time |
integer |
Der Zeitpunkt des Ereignisses. |
evtid |
smallint |
Der Bezeichner des Ereignisses. |
trycnt |
smallint |
Die Anzahl der Versuche. |
tryfl |
Zeichen variierend(12) |
Das Kennzeichen des Versuchs. |
state |
smallint |
Sitzungsstatus. |
btm |
Ganzzahl |
Batterieladung. |
rssi |
integer |
Signalstärke (falls verwendet). |
created_at |
timestamp(6) without time zone |
Zeitpunkt, an dem der Datensatz erstellt wurde. |
updated_at |
timestamp(6) without time zone |
Zeitpunkt, an dem der Datensatz zuletzt aktualisiert wurde. |
Allgemeine Struktur und Beziehungen
Haupttabelle - channel_data
, die Kanaldaten mit Geräten, Sitzungen und Einheiten verknüpft.
Beziehungstabellen:
units
- Maßeinheiten.referenceparameters
- Archivtypen und andere Qualifikatoren.
Ausrüstungstabellen:
equipment
- Informationen über die Geräte.channels
- Ausrüstungskanäle.
Tabelle Sitzungen - seances
, in der Informationen über Kommunikationssitzungen gespeichert werden.
Benutzungsbeispiel:
- Kanaldaten (
channel_data
) stammen von Geräten (equipment
) innerhalb bestimmter Sitzungen (seances
). - Jeder Kanal (
channels
) hat seine eigene Maßeinheit (units
). - Die Art des Archivs (
referenceparameters
) bestimmt, wie die Daten gespeichert oder verarbeitet werden sollen.
Vorteile eines vereinheitlichten Modells
Dieses Datenmodell bietet Flexibilität und Skalierbarkeit für die Speicherung und Analyse von Daten aus verschiedenen Geräten.
Lassen Sie uns einige der Vorteile eines einheitlichen Datenmodells aufzählen:
- Konsistenz: Die Daten haben in allen Systemen die gleiche Struktur und Semantik.
- Skalierbarkeit: Es ist einfach, neue Datenquellen oder Gerätetypen hinzuzufügen.
- Datenschutz: Einheitliche Authentifizierungs-, Autorisierungs- und Verschlüsselungsmechanismen.
- Vereinfachung der Analyse: Die Daten können mit einheitlichen Tools analysiert werden.
Abstraktion der Ausrüstung
Die Geräteabstraktion ist ein wichtiges Prinzip der Systementwicklung, das es ermöglicht, die Logik der Datenverarbeitung von den physischen Eigenschaften der Geräte zu trennen. Dies ist besonders wichtig bei Systemen, die heterogene Geräte verwenden.
Geräteabstraktion bedeutet, dass das System mit Daten auf einer logischen Ebene arbeitet, die unabhängig von den physischen Geräten ist, auf denen die Daten gespeichert oder verarbeitet werden. Dies wird erreicht durch:
- Vereinheitlichung der Schnittstellen: Ein einziger Weg, um auf Daten zuzugreifen, unabhängig von der Ausstattung.
- Verstecken von Implementierungsdetails: Physikalischer Speicherort der Daten, Übertragungsprotokolle und andere technische Aspekte werden vor den Anwendungen verborgen.
- Adapter: Konvertierung von Daten aus einem gerätespezifischen Format in ein einheitliches Format.
Implementierung der Geräteabstraktion
Betrachten wir nun die Umsetzung dieses Ansatzes in unserem System
Angenommen, wir haben ein IoT-Gerät, das Gasverbrauchsdaten sendet. Die implementierten Algorithmen ermöglichen uns das:
- Empfangen der Daten vom Gerät über einen Adapter.
- Konvertiert sie in eine
channel_data
Struktur. - Speichern Sie sie in einer Datenbank.
- Bereitstellung des Zugriffs auf die Daten über API.
Für jeden Gerätetyp werden Adapter entwickelt, die gerätespezifische Protokolle verarbeiten und die Daten in ein einheitliches Format umwandeln.
Betrachten wir ein Beispiel:
Für ein IoT-Gerät können die Daten im JSON-Format vorliegen:
|
|
Der Adapter konvertiert Daten in eine channel_data
Struktur:
|
|
Datenanforderung:
GET /api/v1/channel_data?equipment_id=1&archive_type=daily&channel_id=3
Antwort:
|
|
Vorteile der Geräteabstraktion
- Hardware-Unabhängigkeit: Anwendungen arbeiten mit Daten, ohne zu wissen, wo diese physisch gespeichert sind.
- Flexibilität: Einfaches Hinzufügen neuer Geräte oder Ändern vorhandener Geräte.
- Vereinfachung der Entwicklung: Entwickler arbeiten mit abstrakten Einheiten, ohne sich um Hardware-Details kümmern zu müssen.
- Skalierbarkeit: Daten können auf verschiedenen Geräten gespeichert werden, aber das System arbeitet weiterhin auf einheitliche Weise.
Daten-Normalisierung
Bei der Datennormalisierung werden die Daten in einer Datenbank so organisiert, dass die Redundanz minimiert und die Datenintegrität verbessert wird. Im Zusammenhang mit der abstrakten Datenschicht spielt die Normalisierung eine Schlüsselrolle bei der Schaffung eines einheitlichen und effizienten Datenmodells, das für die Handhabung verschiedener Arten von Hardware und Datenquellen verwendet werden kann.
Bei der Datennormalisierung werden die Daten in logische Tabellen unterteilt und Beziehungen zwischen ihnen hergestellt, um sie zu normalisieren:
- Eliminierung von doppelten Daten.
- Vereinfachung der Datenpflege und -aktualisierung.
- Sicherstellung der Datenintegrität.
- Verbesserung der Abfrageleistung.
- Das einheitliche Datenmodell des Systems ist auf die (dritte) normale Boyce-Codd-Form in Form von atomaren (skalaren) Werten reduziert. Einige Datenmodell-Entitäten verwenden zusammengesetzte Strukturen, um den Umgang mit seltenen Nicht-Standard-Attributen zu optimieren.
Vorteile der Normalisierung
- Entfernt Redundanz: Die Daten werden an einem Ort gespeichert, wodurch die Redundanz verringert wird.
- Datenkonsistenz: Die Aufrechterhaltung der Datenkonsistenz wird vereinfacht.
- Flexibilität: Änderungen an der Datenstruktur können leicht vorgenommen werden.
- Produktivität: Die Abfrageleistung wird (in den meisten Fällen) verbessert.
Normalisierung im Kontext der abstrakten Datenschicht
Die Normalisierung der Daten ist ein wichtiger Schritt bei der Entwicklung der abstrakten Datenschicht.
Es ermöglicht Ihnen:
- Schaffung eines einheitlichen Datenmodells, das für verschiedene Arten von Hardware verwendet werden kann.
- Eliminierung von Redundanz und Duplizierung von Daten.
- Sicherstellung der Integrität und Konsistenz der Daten, unabhängig von ihrer Quelle.
- Vereinfachung der Integration neuer Geräte und Systeme.