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:
- Construction Kit (CK): Schema-Definitionen, die die Struktur Ihrer Daten beschreiben
- 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.
| Attributtyp | Beschreibung | Beispiel |
|---|---|---|
string | Textwert | Name, Beschreibung |
int | Ganzzahl | Anzahl, Menge |
decimal | Dezimalzahl | Preis, Messwert |
boolean | Wahr/falsch | IsActive, isEnabled |
dateTime | Datum und Uhrzeit | CreatedAt, modifiedAt |
binary | Binärdaten | Dateiinhalt, Bilder |
geo | Geodaten | Standortkoordinaten |
Attribut-Metadaten:
isRequired: Ob das Attribut einen Wert haben mussdefaultValue: Standardwert, falls nicht angegebenvalidationRules: 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ät | Beschreibung |
|---|---|
1:1 | Eins-zu-eins-Beziehung |
1:N | Eins-zu-viele-Beziehung |
N:M | Viele-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
| Eigenschaft | Beschreibung |
|---|---|
rtId | Eindeutige Kennung (GUID) |
ckTypeId | Verweis auf den Construction-Kit-Typ |
wellKnownName | Menschenlesbarer eindeutiger Name (optional) |
attributes | Attributwerte |
associations | Verweise 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
| Aspekt | Runtime-Daten | Streamdaten |
|---|---|---|
| Speicherung | MongoDB | CrateDB |
| Zweck | Stammdaten, Entitäten | Zeitreihen, Ereignisse |
| Aktualisierungen | Veränderbar | Nur anhängend (append-only) |
| Abfragen | Entitätsbasiert | Zeitbasiert |
| Volumen | Moderat | Hoch |
Datenfluss
Bewährte Praktiken
Construction Kits entwerfen
- Mit der System-Bibliothek beginnen: Verwenden Sie nach Möglichkeit vorhandene Basistypen
- Vererbung mit Bedacht einsetzen: Erstellen Sie Hierarchien für gemeinsames Verhalten
- Typen fokussiert halten: Jeder Typ sollte ein einziges Konzept repräsentieren
- Records für eingebettete Daten verwenden: Gruppieren Sie zusammengehörige Attribute
- Aussagekräftige Assoziationen definieren: Modellieren Sie reale Beziehungen
Arbeiten mit Runtime-Daten
- wellKnownName für Lookups verwenden: Besser lesbar als GUIDs
- Früh filtern: Verwenden Sie Abfragefilter, um die Datenübertragung zu reduzieren
- Große Ergebnisse paginieren: Verwenden Sie stets die Parameter
firstundafter - Nur benötigte Felder einbeziehen: Optimieren Sie GraphQL-Abfragen
Streamdaten verwalten
- Für zeitbasierte Abfragen entwerfen: Sehen Sie geeignete Zeitfelder vor
- Datenaufbewahrung berücksichtigen: Planen Sie das Datenlebenszyklus-Management
- Schreibvorgänge bündeln: Gruppieren Sie mehrere Datenpunkte zur Effizienzsteigerung
- Angemessene Granularität verwenden: Speichern Sie nicht mehr Details als nötig
Nächste Schritte
- Construction Kit Engine: Erfahren Sie, wie Sie Construction Kits kompilieren und damit arbeiten
- SDK-Überblick: Erkunden Sie die SDK-Bibliotheken
- API-Integration: Verbinden Sie sich mit den OctoMesh-APIs