Kapitel 11
This commit is contained in:
		
							parent
							
								
									7641f3c31f
								
							
						
					
					
						commit
						e2ea83c7de
					
				| @ -1622,5 +1622,262 @@ Statistische Datenbanken | ||||
|   - Unterdrücken von Tupeln: Löschen von Tupeln, welche die k-Anonymität verletzen und damit identifizierbar sind | ||||
| 
 | ||||
| # NoSQL Datenbanken | ||||
| ## Motivation für NoSQL | ||||
| - NoSQL = Not only SQL | ||||
| - im Umfeld vieler aktueller Buzzwords | ||||
|   - NoSQL | ||||
|   - Big Data | ||||
|   - BASE | ||||
|   - ... | ||||
| - oft einfach als Etikett einer Neuentwicklung eines DBMS pauschal vergeben | ||||
| 
 | ||||
| Was ist NoSQL? | ||||
| - SQL - No! | ||||
|   - SQL-Datenbanken sind zu komplex, nicht skalierbar, ... | ||||
|   - man braucht was einfacheres! | ||||
| - Not only SQL | ||||
|   - SQL-Datenbanken haben zu wenig (oder die falsche) Funktionalität | ||||
|   - Operationen auf Graphen, Data Mining Operatoren, ... | ||||
| - New SQL | ||||
|   - SQL-Datenbanken sind (software-technisch) in die Jahre gekommen | ||||
|   - eine neue Generation von DBMS muss her (ohne die etablierten Vorteile von SQL zu ignorieren) | ||||
| 
 | ||||
| Kritik an RDBMS / SQL | ||||
| - nicht skalierbar | ||||
|   - Normalisierung von Relationen, viele Integritätsbedingungen zu prüfen | ||||
|   - kann man in RDBMS auch vermeiden! | ||||
| - starre Tabellen nicht flexibel genug | ||||
|   - schwach typisierte Tabellen (Tupel weichen in den tatsächlich genutzten Attributen ab) | ||||
|   - viele Nullwerte wenn alle potentiellen Attribute definiert | ||||
|   - alternativ Aufspaltung auf viele Tabellen | ||||
|   - Schema-Evolution mit alter table skaliert bei Big Data nicht | ||||
|   - tatsächlich in vielen Anwendungen ein Problem | ||||
| - Integration von spezifischen Operationen (Graphtraversierung, Data-Mining-Primitive) mit Stored Procedures zwar möglich führt aber oft zu schwer interpretierbarem Code | ||||
| 
 | ||||
| 
 | ||||
| ## Datenmodelle für NoSQL | ||||
| Datenmodelle für NoSQL | ||||
| - KV-Stores | ||||
| - Wide Column Stores | ||||
| - Dokumenten-orientierte Datenhaltung | ||||
| - Graph-Speicher | ||||
| - ... | ||||
| 
 | ||||
| Anfragesprachen für NoSQL | ||||
| - unterschiedliche Ansätze: | ||||
| - einfache funktionale API | ||||
| - Programmiermodell für parallele Funktionen | ||||
| - angelehnt an SQL-Syntax | ||||
| - ... | ||||
| 
 | ||||
| ## KV-Stores und Wide Column | ||||
| Datenmodell: Key-Value-Stores | ||||
| - Key-Value-Store: binäre Relationen, bestehend aus | ||||
|   - einem Zugriffsschlüssel (dem Key) und | ||||
|   - den Nutzdaten (dem Value) | ||||
| - Nutzdaten | ||||
|   - binäre Daten ohne Einschränkung, | ||||
|   - Dateien oder Dokumente, → Document Databases | ||||
|   - oder schwachstrukturierte Tupel → Wide Column Store | ||||
| - Anfragen an KV-Stores | ||||
|   - einfache API | ||||
|     ```sql | ||||
|     store.put(key, value) | ||||
|     value = store.get(key) | ||||
|     store.delete(key) | ||||
|     ``` | ||||
|   - aufgesetzte höherer Sprache angelehnt an SQL | ||||
|     - Map-Reduce: Framework zur Programmierung paralleler Datenaggregation auf KV-Stores | ||||
| - Beispielsysteme für KV-Stores | ||||
|   - Amazon DynamoDB | ||||
|   - Riak | ||||
| 
 | ||||
| Datenmodell: Wide Column | ||||
| - Basisidee: KV-Store mit schwachstrukturiertem Tupel als Value | ||||
| - Value = Liste von Attributname-Attributwert-Paaren | ||||
|   - schwache Typisierung für Attributwerte (auch Wiederholgruppen) | ||||
| - nicht alle Einträge haben die selben Attributnamen | ||||
|   - offene Tupel | ||||
|   - Hinzufügen eines neuen Attributs unproblematisch | ||||
|   - Nullwerte aus SQL ersetzt durch fehlende Einträge | ||||
| - Beispiel in DynamoDB | ||||
| - Anfragen bei Wide Column | ||||
|   - CRUD: Create, Read, Update und Delete | ||||
|   - in DynamoDB | ||||
|     - *PutItem* fügt einen neuen Datensatz mit der gegebenen Attribut-Wert-Liste ein bzw. ersetzt einen existierenden Datensatz mit gleichem Schlüssel. | ||||
|     - *GetItem*-Operation liest alle Felder eines über einen Primärschlüssel identifizierten Datensatzes. | ||||
|     - *Scan* erlaubt einen Lauf über alle Datensätze mit Angabe von Filterkriterien. | ||||
|   - Aufruf über HTTP oder aus Programmiersprachen heraus | ||||
| 
 | ||||
| 
 | ||||
| ## Document Stores | ||||
| Datenmodell: dokumentenorientierte Speicherung | ||||
| - Basisidee: KV-Store mit (hierarchisch) strukturiertem Dokument als Value | ||||
| - strukturiertes Dokument: | ||||
|   - JSON-Format: geschachtelte Wide Column-Daten | ||||
|   - XML (eher unüblich auf KV-Stores) | ||||
| - Anfragen bei dokumentenorientierter Speicherung | ||||
|   - CRUD erweitert um dokumentspezifische Suche | ||||
|   - Beispiele (MongoDB mit BSON statt JSON) `db.kritiker.find({Name: "Bond"})` | ||||
| - Beispielsysteme für dokumentenorientierte Speicherung | ||||
|   - MongoDB | ||||
|   - CouchDB | ||||
| 
 | ||||
| ## Graph Stores | ||||
| Graph-Datenmodelle: Grundlagen | ||||
| - spezielle Form der Datenrepräsentation = Graphen, insb. Beziehungen zwischen Objekten | ||||
| - Anwendungsgebiete: | ||||
|   - Transportnetze | ||||
|   - Networking: Email-Verkehr, Mobilfunk-Nutzer | ||||
|   - Soziale Netzwerke: Eigenschaften, Communities | ||||
|   - Web: Verlinkte Dokumente | ||||
|   - Chemie: Struktur chemischer Komponenten | ||||
|   - Bioinformatik: Proteinstrukturen, metabolische Pathways, Genexpressionen | ||||
| - Graph $G = (V, E)$ | ||||
|   - $V$: Menge der Knoten (vertices) | ||||
|   - $E \subseteq V \times V$: Menge der Kanten (edges) | ||||
|   - Kanten können mit Gewicht versehen werden | ||||
| - Adjazenzmatrix | ||||
|   - Repräsentation von Graphen durch Matrix (Knoten als Zeilen und Spalten) | ||||
|   - ungerichteter Graph: symmetrische Matrix | ||||
|   - ungewichteter Graph: Zellen nur 0 oder 1 | ||||
| - Knotengrad | ||||
|   - Eigenschaft eines Knotens: Anzahl der verbundenen Knoten | ||||
|   - bei gerichteren Graphen: Unterscheidung in Eingangs- und Ausgangsgrad | ||||
| - Traversierung | ||||
|   - Tiefensuche (DFS): zunächst rekursiv alle Kindknoten besuchen bevor alle Geschwisterknoten besucht werden | ||||
|     - Bestimmung der Zusammenhangskomponente | ||||
|     - Wegsuche um Labyrinth | ||||
|   - Breitensuche (BFS): zunächst alle Geschwisterknoten besuchen bevor die Kindknoten besucht werden | ||||
|     - Bestimmung des kürzesten Weges | ||||
| 
 | ||||
| Subjekt-Prädikat-Objekt-Modell: RDF | ||||
| - Sprache zur Repräsentation von Informationen über (Web)-Ressourcen | ||||
| - Ziel: automatisierte Verarbeitung | ||||
| - zentraler Bestandteil von Semantic Web, Linked (Open) Data | ||||
| - Repräsentation von Daten, aber auch Wissensrepräsentation (z.B. Ontologie) | ||||
| 
 | ||||
| Ontologien | ||||
| - Ontologie = formale Spezifikation einer Konzeptualisierung, d.h. einer Repräsentation von Begriffen (Konzepten) und deren Beziehungen | ||||
| - Anwendung: Annotation von Daten, semantische Suche | ||||
| 
 | ||||
| RDF: Graphen & Tripel | ||||
|   - Graph = Menge von Tripeln, die Aussagen über Web-Ressourcen repräsentieren | ||||
|   - Identifikation der Web-Ressourcen über Uniform Resource Identifier (URI) | ||||
|   - Tripel: subjekt prädikat objekt . | ||||
|   - Beispiel `<http://weindb.org/weine/2171> \ ` und `<http://weindb.org/ontologie/name> "Pinot Noir".` | ||||
|   - Subjekt: URI-Referenz, d.h. Ressource, auf die sich die Aussage bezieht | ||||
|   - Prädikat: Eigenschaft, ebenfalls in Form einer URI-Referenz | ||||
|   - Objekt: Wert der Eigenschaft als Literal (Konstante) oder URI- Referenz | ||||
| - abkürzende Notation für Namensräume über Präfixe: | ||||
|     ```sql | ||||
|       prefix wo: <http://weindb.org/ontologie/> | ||||
|       prefix weine: <http://weindb.org/weine/> | ||||
|       weine:2171 wo:name "Pinot Noir". | ||||
|     ``` | ||||
| - Komplexe Graphen | ||||
|   - mehrere Aussagen zum gleichen Subjekt | ||||
|   - Objekte nicht nur Literale sondern selbst Objekte (URI) | ||||
|     ```sql | ||||
|     weine:2171 wo:name "Pinot Noir". | ||||
|     weine:2171 wo:farbe "Rot". | ||||
|     weine:2171 wo:jahrgang "1999". | ||||
|     weine:2171 wo:erzeuger werzeuger:567 . | ||||
|     ``` | ||||
| - Repräsentation, Schema und Vokabulare | ||||
|   - Repräsentation von RDF-Daten: N-Tripel, RDF/XML | ||||
|   - RDF Schema: | ||||
|     - objektorientierte Spezifikationssprache | ||||
|     - erweitert RDF um Typsystem: Definition von Klassen und Klassenhierarchien mit Eigenschaften, Ressourcen als Instanzen von Klassen | ||||
|     - RDF Schema ist selbst RDF-Spezifikation | ||||
|   - Beispiel RDF Schema | ||||
|     ```sql | ||||
|     Wein rdf:type rdfs:Class . | ||||
|     Schaumwein rdf:type rdfs:Class . | ||||
|     Schaumwein rdfs:subClassOf Wein . | ||||
|     Name rdf:type rdf:Property . | ||||
|     Jahrgang rdf:type rdf:Property . | ||||
|     Jahrgang rdfs:domain Wein . | ||||
|     Jahrgang rdfs:range xsd:integer . | ||||
|     ``` | ||||
|   - für komplexere Ontologien: OWL (Web Ontology Language) | ||||
|   - Vokabular: vordefinierte Klassen und Eigenschaften | ||||
|     - Bsp: Dublin Core (Metadaten für Dokumente), FOAF (Soziale Netze), ... | ||||
|     - wichtig z.B. für Linked Open Data | ||||
| 
 | ||||
| SPARQL als RDF-Anfragesprache | ||||
| - SPARQL Protocol And RDF Query Language: Anfragesprache für RDF | ||||
| - W3C-Recommendation | ||||
| - unterschiedliche Implementierungen möglich: | ||||
|   - Aufsatz für SQL-Backends (z.B. DB2, Oracle) | ||||
|   - Triple Stores (RDF-Datenbank) | ||||
|   - SPARQL-Endpoints | ||||
| - syntaktisch an SQL angelehnt, aber Unterstützung für Graph-Anfragen | ||||
| - SPARQL-Elemente | ||||
|   - Grundelemente: select-where-Block und Tripelmuster `?wein wo:name ?name .` | ||||
|   - Auswertung: finden aller Belegungen (Bindung) für Variable (?name) bei Übereinstimmung mit nicht-variablen Teilen | ||||
|     ```sql | ||||
|     <http://weindb.org/weine/2171> wo:name "Pinot Noir". | ||||
|     <http://weindb.org/weine/2168> wo:name "Creek Shiraz". | ||||
|     <http://weindb.org/weine/2169> wo:name "Chardonnay". | ||||
|     ``` | ||||
| - SPARQL: Basic Graph Pattern | ||||
|   - Graphmuster (BGP = Basic Graph Pattern): Kombination von Tripelmustern über gemeinsame Variablen | ||||
|     ```sql | ||||
|     ?wein wo:name ?name . | ||||
|     ?wein wo:farbe ?farbe . | ||||
|     ?wein wo:erzeuger ?erzeuger . | ||||
|     ?erzeuger wo:weingut ?ename . | ||||
|     ``` | ||||
|   - Einsatz in SPARQL-Anfragen im where-Teil | ||||
|     ```sql | ||||
|     select ?wein ?name ?farbe ?ename | ||||
|     where { ?wein wo:name ?name . | ||||
|       ?wein wo:farbe ?farbe . | ||||
|       ?wein wo:erzeuger ?erzeuger . | ||||
|       ?erzeuger wo:weingut ?ename . } | ||||
|     ``` | ||||
| - SPARQL: Weitere Elemente | ||||
|   - filter: Filterbedingungen für Bindungen | ||||
|   - optional: optionale Muster – erfordern nicht zwingend ein Matching | ||||
|     ```sql | ||||
|     prefix wo: <http://weindb.org/ontologie/> | ||||
|     select ?name | ||||
|     where { ?wein wo:name ?name . } | ||||
|       optional { ?wein wo:jahrgang ?jahrgang } . | ||||
|       filter ( bound(?jahrgang) && ?jahrgang < 2010 ) | ||||
|     ``` | ||||
| - Property-Graph-Modell | ||||
|   - Knoten und (gerichtete) Kanten mit Eigenschaften (Properties) | ||||
|   - nicht streng typisiert, d.h. Eigenschaften als Name-Wert-Paare | ||||
|   - Unterstützung in diversen Graph-Datenbanksystemen: neo4j, Microsoft Azure Cosmos DB, OrientDB, Amazon, Neptune, ... | ||||
|   - Property-Graph-Modell in Neo4j | ||||
|     - Elemente: Nodes, Relationships, Properties, Labels | ||||
|     - Properties = Key-Value-Paare: Key (=String), Value (=Java-Datentypen + Felder) | ||||
|     - Nodes mit Labels (≈ Klassenname) | ||||
|     - Relationships: sind gerichtet, mit Namen und ggf. Properties | ||||
|   - Anfragen auf Graphen | ||||
|     - keine Standardsprache | ||||
|     - aber wiederkehrende Grundelemente | ||||
|       - Graph Matching: Knoten, Kanten, Pfade (siehe BGP in SPARQL) | ||||
|       - Filter für Knoten- und Kanteneigenschaften | ||||
|       - Konstruktion neuer Graphen | ||||
|     - Anfragen in Cypher | ||||
|       - Basis: Muster der Form „Knoten → Kante → Knoten ...“ `(von)-[:relationship]->(nach)` | ||||
|       - Beschränkung über Label und Properties `(e:ERZEUGER)-[:LIEGT_IN]->(a:ANBAUGEBIET {gebiet: 'Napa Valley' } )` | ||||
|       - Klauseln | ||||
|         - match: Beispielmuster für Matching | ||||
|         - return: Festlegung der Rückgabedaten (Projektion) | ||||
|         - where: Filterbedingung für „gematchte“ Daten | ||||
|         - create: Erzeugen von Knoten oder Beziehungen | ||||
|         - set: Ändern von Property-Werten | ||||
| 
 | ||||
| Zusammenfassung | ||||
| - NoSQL als Oberbegriff für diverse Datenbanktechniken | ||||
| - große Bandbreite: von einfachen KV-Stores bis zu Graphdatenbanken | ||||
| - höhere Skalierbarkeit / Performance gegenüber SQL-DBMS meist durch Einschränkungen erkauft | ||||
| - Abschwächung von ACID-Eigenschaften | ||||
| - begrenzte Anfragefunktionalität | ||||
| - Nicht-Standard bzw. proprietäre Schnittstellen | ||||
| 
 | ||||
| # Anwendungsprogrammierung | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user