Zum Hauptinhalt springen

Datenmodell-Konzepte

Dieses Dokument erläutert die grundlegenden Datenmodellierungskonzepte in OctoMesh, darunter Construction Kits, Runtime-Entitäten und Streamdaten.

Überblick​

OctoMesh verwendet einen zweischichtigen Datenmodell-Ansatz:

  1. Construction Kit (CK): Schema-Definitionen, die die Struktur Ihrer Daten beschreiben
  2. Runtime (RT): Tatsächliche Dateninstanzen auf Basis der Construction-Kit-Definitionen

Construction Kit (CK)​

Was ist ein Construction Kit?​

Ein Construction Kit ist ein Typsystem, das die Struktur und die Beziehungen Ihrer Datendomäne definiert. Betrachten Sie es als Schema oder Bauplan für Ihre Daten.

CK-Bibliotheken​

Construction Kits sind in Bibliotheken organisiert:

System (base library)
├── Industry.Energy
├── Industry.Manufacturing
├── Industry.Logistics
└── Custom.MyCompany

Jede Bibliothek hängt von der System-Bibliothek ab, die grundlegende Typen und Definitionen bereitstellt.

CK-Typen​

Typen sind die primären Bausteine, die Entitäten in Ihrer Domäne definieren.

Beispiel: Energy-Meter-Typ

Type: EnergyMeter
Namespace: Industry.Energy
BaseType: System.Asset
Attributes:
- serialNumber: string
- manufacturer: string
- installationDate: dateTime
- maxCapacity: decimal
Associations:
- location: Industry.Common.Location (1:1)
- readings: Industry.Energy.MeterReading (1:N)

Typvererbung​

Typen können von anderen Typen erben und dabei alle Attribute und Assoziationen übernehmen:

Attribute​

Attribute definieren die Eigenschaften eines Typs.

AttributtypBeschreibungBeispiel
stringTextwertName, Beschreibung
intGanzzahlAnzahl, Menge
decimalDezimalzahlPreis, Messwert
booleanWahr/falschIsActive, isEnabled
dateTimeDatum und UhrzeitCreatedAt, modifiedAt
binaryBinärdatenDateiinhalt, Bilder
geoGeodatenStandortkoordinaten

Attribut-Metadaten:

  • isRequired: Ob das Attribut einen Wert haben muss
  • defaultValue: Standardwert, falls nicht angegeben
  • validationRules: Einschränkungen für zulässige Werte

Records​

Records sind komplexe Attribute, die mehrere Felder enthalten. Sie sind nützlich, um zusammengehörige Daten zu gruppieren.

Beispiel: Address-Record

Record: Address
Fields:
- street: string
- city: string
- postalCode: string
- country: string

Verwendung in einem Typ:

Type: Customer
Attributes:
- name: string
- billingAddress: Address (Record)
- shippingAddress: Address (Record)

Assoziationen​

Assoziationen definieren Beziehungen zwischen Typen.

Assoziations-Multiplizitäten:

MultiplizitätBeschreibung
1:1Eins-zu-eins-Beziehung
1:NEins-zu-viele-Beziehung
N:MViele-zu-viele-Beziehung

Assoziationsrollen: Jede Assoziation hat zwei Rollen, die die Beziehung von jeder Seite definieren:

Enums​

Enums definieren kontrollierte Vokabulare für semantische Werte:

Enum: MeterStatus
Values:
- Active
- Inactive
- Maintenance
- Decommissioned

Verwendung:

Type: EnergyMeter
Attributes:
- status: MeterStatus (Enum)

Runtime-Entitäten (RT)​

Was ist eine Runtime-Entität?​

Eine Runtime-Entität ist eine Instanz eines Construction-Kit-Typs. Sie repräsentiert tatsächlich im System gespeicherte Daten.

RT-Struktur​

{
"rtId": "550e8400-e29b-41d4-a716-446655440000",
"ckTypeId": "Industry.Energy/EnergyMeter",
"wellKnownName": "main-building-meter",
"attributes": {
"name": "Main Building Meter",
"serialNumber": "EM-2024-001",
"manufacturer": "Siemens",
"installationDate": "2024-01-15T00:00:00Z",
"maxCapacity": 1000.0,
"status": "Active"
},
"associations": {
"location": {
"items": ["location-rtid-123"]
},
"readings": {
"items": ["reading-rtid-1", "reading-rtid-2"]
}
}
}

Wesentliche Eigenschaften​

EigenschaftBeschreibung
rtIdEindeutige Kennung (GUID)
ckTypeIdVerweis auf den Construction-Kit-Typ
wellKnownNameMenschenlesbarer eindeutiger Name (optional)
attributesAttributwerte
associationsVerweise auf zugehörige Entitäten

Arbeiten mit RT-Entitäten​

Eine Entität erstellen (über GraphQL):

mutation {
runtime {
createRtIndustryEnergyEnergyMeter(
entity: {
attributes: {
name: "New Meter"
serialNumber: "EM-2024-002"
status: Active
}
}
) {
rtId
}
}
}

Entitäten abfragen:

query {
runtime {
rtIndustryEnergyEnergyMeter(
first: 10
filter: { status: { eq: "Active" } }
) {
items {
rtId
name
serialNumber
location {
items {
name
address
}
}
}
}
}
}

Eine Entität aktualisieren:

mutation {
runtime {
updateRtIndustryEnergyEnergyMeter(
rtId: "550e8400-e29b-41d4-a716-446655440000"
entity: {
attributes: {
status: Maintenance
}
}
) {
rtId
}
}
}

Streamdaten (Zeitreihen)​

Was sind Streamdaten?​

Streamdaten repräsentieren kontinuierliche, zeitkritische Daten wie zum Beispiel:

  • Sensormesswerte
  • Ereignisprotokolle
  • Metriken und Messungen
  • Finanzdaten

Speicherung von Streamdaten​

Streamdaten werden in CrateDB gespeichert, optimiert für:

  • Datenaufnahme mit hohem Durchsatz
  • Zeitbasierte Abfragen
  • Echtzeit-Analysen

Struktur von Streamdaten​

{
"rtId": "550e8400-e29b-41d4-a716-446655440000",
"ckTypeId": "Industry.Energy/EnergyMeter",
"timeStamp": "2024-01-15T10:30:00Z",
"voltage": 230.5,
"current": 15.2,
"power": 3503.6,
"frequency": 50.0
}

Streamdaten abfragen​

query {
streamData {
tsIndustryEnergyEnergyMeter(
first: 100
filter: {
rtId: { eq: "550e8400-e29b-41d4-a716-446655440000" }
timeStamp: {
gte: "2024-01-15T00:00:00Z"
lte: "2024-01-15T23:59:59Z"
}
}
orderBy: { timeStamp: DESC }
) {
items {
timeStamp
voltage
current
power
}
pageInfo {
hasNextPage
endCursor
}
}
}
}

Streamdaten vs. Runtime-Daten​

AspektRuntime-DatenStreamdaten
SpeicherungMongoDBCrateDB
ZweckStammdaten, EntitätenZeitreihen, Ereignisse
AktualisierungenVeränderbarNur anhängend (append-only)
AbfragenEntitätsbasiertZeitbasiert
VolumenModeratHoch

Datenfluss​

Bewährte Praktiken​

Construction Kits entwerfen​

  1. Mit der System-Bibliothek beginnen: Verwenden Sie nach Möglichkeit vorhandene Basistypen
  2. Vererbung mit Bedacht einsetzen: Erstellen Sie Hierarchien für gemeinsames Verhalten
  3. Typen fokussiert halten: Jeder Typ sollte ein einziges Konzept repräsentieren
  4. Records für eingebettete Daten verwenden: Gruppieren Sie zusammengehörige Attribute
  5. Aussagekräftige Assoziationen definieren: Modellieren Sie reale Beziehungen

Arbeiten mit Runtime-Daten​

  1. wellKnownName für Lookups verwenden: Besser lesbar als GUIDs
  2. Früh filtern: Verwenden Sie Abfragefilter, um die Datenübertragung zu reduzieren
  3. Große Ergebnisse paginieren: Verwenden Sie stets die Parameter first und after
  4. Nur benötigte Felder einbeziehen: Optimieren Sie GraphQL-Abfragen

Streamdaten verwalten​

  1. Für zeitbasierte Abfragen entwerfen: Sehen Sie geeignete Zeitfelder vor
  2. Datenaufbewahrung berücksichtigen: Planen Sie das Datenlebenszyklus-Management
  3. Schreibvorgänge bündeln: Gruppieren Sie mehrere Datenpunkte zur Effizienzsteigerung
  4. Angemessene Granularität verwenden: Speichern Sie nicht mehr Details als nötig

Nächste Schritte​