====== Datenstruktur ======
Auf dieser Seite beschreibe ich die Datenstruktur unserer Middleware und der damit verbundenen Datenbank.
===== Objekte ("entities") =====
==== Typen ====
[[http://github.com/volkszaehler/volkszaehler.org/blob/master/share/definitions/entities.json]]
=== Kanäle ("channels") ===
Kanäle sind nach unserer [[development:definitions]] jede Art von Zähler oder Sensor (Strom, Wasser, Gas bzw. Temperatur, Luftdruck, Feuchtigkeit etc).
Sie können [[#Messwerte]] speichern.
=== Gruppierung ("aggregators") ===
Die Gruppierung der Zähler hat mehrere Aufgaben:
* sie strukturiert die Kanäle nach ihren realen oder virtuellen Gegebenheiten
* z.B. alle Temperatursensoren in einer Stadt
* z.B. die Drei Phasen eines Haushalts
* z.B. mehrere Parteien an einem Hausanschluss
* z.B. WGs
* z.B. alle Wohnungen eines Vermieters
* sie kann gruppierte Kanäle gemeinsam auswerten
* Visualisierung
* ein Kanal kann in mehreren Gruppen enthalten sein
* eine Gruppe kann selbst in mehreren Gruppen enthalten sein (Rekursion)
==== Eigenschaften ("properties") ====
[[https://github.com/volkszaehler/volkszaehler.org/blob/master/lib/Volkszaehler/Definition/PropertyDefinition.json]]
==== Referenzierung ====
=== global (weltweit) ===
Ein wichtiger Bestandteil unserer API ist die weltweit eindeutige Referenzierung aller Entities durch eine [[http://de.wikipedia.org/wiki/Universally_Unique_Identifier|UUID]] gemäß [[http://tools.ietf.org/html/rfc4122|RFC4122]].
Die UUID's werden immer durch die Middleware zufällig generiert um die Kollisionsgefahr zu minimieren.
Das ganze hat Vorteile:
* einmal installiert behält ein Zähler immer seine UUID
* das Mergen von Middlewares mit ihren Messwerten wäre möglich
* bieten durch ihre Komplexität einen gewissen Zugriffsschutz
und Nachteile:
* relativ viel Daten (16byte vs. 2byte für eine normale Interger-ID)
* schwer zu merken
=== lokal (auf der Middleware) ===
Um Speicherplatz zu sparen nutzt die Middleware intern nur 2byte lange IDs. Diese werden mit Foreign Keys in der Datenbank untereinander verknüpft. Das sorgt dafür das wir zusätzlich zur Absicherung in der Middleware keine inkonsistenten Daten bekommen können.
=== mysql Database ===
The mysql database structure can be analyzed with the mysql command line client.
The following results are as of 2014-05-22:
show tables;
Tables_in_volkszaehler
* aggregate
* data
* entities
* entities_in_aggregator
* properties
describe entities;
^ Field ^ Type ^ Null ^ Key ^ Default ^ Extra ^
| id | int(11) | NO | PRI | NULL | auto_increment |
| uuid | varchar(36) | NO | UNI | NULL | |
| type | varchar(255) | NO | | NULL | |
| class | varchar(255) | NO | | NULL | |
describe properties;
^ Field ^ Type ^ Null ^ Key ^ Default ^ Extra ^
| id | int(11) | NO | PRI | NULL | auto_increment |
| entity_id | int(11) | YES | MUL | NULL | |
| pkey | varchar(255) | NO | | NULL | |
| value | longtext | NO | | NULL | |
describe data;
^ Field ^ Type ^ Null ^ Key ^ Default ^ Extra ^
| id | int(11) | NO | PRI | NULL | auto_increment |
| channel_id | int(11) | YES | MUL | NULL | |
| timestamp | bigint(20) | NO | | NULL | |
| value | double | NO | | NULL | |
describe aggregate;
^ Field ^ Type ^ Null ^ Key ^ Default ^ Extra ^
| id | int(11) | NO | PRI | NULL | auto_increment |
| channel_id | int(11) | YES | MUL | NULL | |
| type | smallint(6) | NO | | NULL | |
| timestamp | bigint(20) | NO | | NULL | |
| value | double | NO | | NULL | |
| count | int(11) | NO | | NULL | |
describe entities_in_aggregator;
^ Field ^ Type ^ Null ^ Key ^ Default ^ Extra ^
| parent_id | int(11) | NO | PRI | NULL | |
| child_id | int(11) | NO | PRI | NULL | |
===== Messwerte ("data") =====
Die Messwerte bestehen aus folgenden Daten:
* Referenz auf Kanal (Foreign Key über interne Kanal-ID)
* Zeitstempel (ordnet jeden Messwert einem genauen Zeitpunkt zu, sollte mindestens in Millisekunden Auflösung gespeichert werden)
* Wert (enthält den absoluten Messwert eines Sensors oder die Anzahl der Pulse eines Pulszählers nach dem letzten Messwert, je nach Typ des durch Kanal[ID] referenzierten Kanals)