SlideShare ist ein Scribd-Unternehmen logo
1 von 94
Downloaden Sie, um offline zu lesen
Fachmodell-First
Einstieg in das NoSQL-Schema-Design
Gregor Biswanger | Freier Berater, Trainer, Autor und Sprecher
about.me/gregor.biswanger
Über mich
▪ Freier Berater, Trainer und Autor
▪ Schwerpunkte: Softwarearchitektur, Web und
Cross-Plattform Entwicklung mit JavaScript
▪ Technologieberater für die Intel Developer Zone
▪ Internationaler Sprecher auf Konferenzen und
User Groups
▪ Freier Autor für heise.de, dotnetpro,
WindowsDeveloper und viele weitere
Fachmagazine
▪ Video-Trainer bei video2brain und Microsoft
Gregor Biswanger
Microsoft MVP, Intel Black Belt &
Intel Software Innovator
cross-platform-blog.de
about.me/gregor.biswanger
Mein Versprechen…
Durch NoSQL erhalten wir ein Booster in unsere
Architektur bezüglich Produktivität,
Flexibilität und Performance.
Unser Reiseplan
▪ Was ist schlecht an relationalen
Datenbanken
▪ Einführung in NoSQL
▪ Dokumentenorientierte Datenbank
▪ Dokumentenorientiert modellieren
▪ Gemeinsam ein Beispiel modellieren
▪ Domain-Driven Design und
das Fachmodell
▪ Fazit
Relationale Datenbanken
machen mich Aggro!
Relationale Datenbanken sind nicht
für Entwickler gemacht
Sie geben sich als König
in der Architektur aus
Der Datenbank wird zu hohe Priorität zugesprochen und
die meisten Diskussionen drehen sich um die Datenbank
und das Datenmodell statt um Geschäftsprozesse und -
vorgänge.
Weil Sie es uns durch Ihre
Regeln aufzwingen.
Das Datenbank-Schema wird zur…
Londoner U-Bahn Karte
Entwickler
Relationale
Datenbank
O/R-Mapper
Das macht die Entwickler
traurig
Retrain your relational brain…
NoSQL
=
Not Only SQL
NoSQL Datenbanken verfolgen einen
nicht-relationalen Ansatz.
Sie brechen damit die lange Geschichte
relationaler Datenbanken.
Diese benötigen keine festgelegten
Tabellenschemata und versuchen
Joins zu vermeiden.
NoSQL-Datenbanken können
horizontal skalieren.
Die Ziele der
NoSQL-Bewegung
Verwaltung von unstrukturierten Daten
Stark
vernetzten Daten
Schnellen
Strukturänderungen
Großen Datenmengen
Unterscheidung nach Datenmodell und Leistung
Datenmodell Leistung Skalierbarkeit Flexibilität Komplexität Funktionalität
Key–Value Hoch Hoch Hoch Keine Unterschiedlich
(keine)
Spaltenorientiert Hoch Hoch Mittel Gering Minimal
Dokumentenorientiert Hoch Unterschiedlich (Hoch) Hoch Gering Unterschiedlich
(gering)
Graphbasiert Unterschiedlich Unterschiedlich Hoch Hoch Graphentheorie
Relational Unterschiedlich Unterschiedlich Gering Mittel Relationale
Algebra
Quelle: https://de.wikipedia.org/wiki/NoSQL
Datenmodell Leistung Skalierbarkeit Flexibilität Komplexität Funktionalität
Key–Value Hoch Hoch Hoch Keine Unterschiedlich
(keine)
Spaltenorientiert Hoch Hoch Mittel Gering Minimal
Dokumentenorientiert Hoch Unterschiedlich (Hoch) Hoch Gering Unterschiedlich
(gering)
Graphbasiert Unterschiedlich Unterschiedlich Hoch Hoch Graphentheorie
Relational Unterschiedlich Unterschiedlich Gering Mittel Relationale
Algebra
Dokumentenorientierte
Datenbank
Eine relationale Datenbank besteht aus
Datenbanktabellen, die einem festen
Datenbankschema unterliegen.
Modeling data, the relational way
Eine dokumentenorientierte Datenbank
besteht aus einzelnen Dokumenten mit einem
eindeutigen Identifikator.
Modeling data, the document way
{
"id": "0ec1ab0c-de08-4e42-...",
"addresses": [
{ "street": "sesamstraße",
"city": "gotham city" }
],
"contractdetails": [
{ "type": "home": "detail": "555-1212" },
{ "type": "email": "detail": "no@no.com" }
],
...
}
SQL
NoSQL
Data normalization
Come as you are
Relationale Daten sind wie das
recherchieren von Informationen
Dokumentenorientiere Daten
bieten alle benötigten Informationen
Dokumentenorientiert
modellieren
Dokumentenorientierte Datenbanken meinen NICHT,
das es keine relationale Daten geben darf.
„Design with No-Reference first“
Oder auch…
„Design with embedded first“
Im Allgemeinen bietet die Einbettung von Daten
eine bessere Leistung für Leseoperationen.
Eingebettete Datenmodelle ermöglichen
die Aktualisierung der zugehörigen Daten in
einem atomaren Schreibvorgang.
Integriert oder Referenziert?
Eingebettete Datenmodelle verwenden, wenn:
▪ Bei One-to-One-Beziehungen zwischen Entitäten.
▪ Bei One-to-Many-Beziehungen zwischen Entitäten.
▪ In diesen Beziehungen werden die "vielen" oder untergeordneten
Dokumente immer zusammen mit dem "ein" oder den
übergeordneten Dokumenten angezeigt.
Referenzierte Datenmodelle verwenden, wenn:
▪ Ein Einbetten würde zu einer Duplizierung von Daten führen, würde
jedoch keine ausreichenden Leseleistungsvorteile bieten, um die
Auswirkungen der Duplizierung zu überwiegen.
▪ Komplexere Many-to-Many-Beziehungen.
▪ Große hierarchische Datensätze.
Mein NoSQL Dokumenten-
Schema Kompass für Dich!
Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Dokumenten-Schema Kompass
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Dokumenten-Schema Kompass
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
Das Beispiel:
Rezeptdatenbank
Aktueller Stand
Optimierter Stand
Datenbankspezifisch
Datenbankspezifisch
Datenbankspezifisch
Zusammenfügen in
Datentyp: Zutat
Datentyp: Quelle
Datentyp: Tag
Datentyp: Rezept
(Root-Document)
Weniger als 100 Mehr als 100 Tausend
X
Wie groß ist der Datensatz?
Immer Manchmal Selten
Wie oft werden die Daten zusammen benutzt?
Nie / Selten Gelegentlich Konstant
X
Wie oft ändern sich die Daten?
Analyse vom Datentyp: Rezept
Vergleich mit dem Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
interface Rezept {
titel: string;
beschreibung: string;
seitenzahl?: number;
anzahlPersonen?: number;
}
Zu Dokument
Weniger als 100 Mehr als 100 Tausend
X
Wie groß ist der Datensatz?
Immer Manchmal Selten
X
Wie oft werden die Daten zusammen benutzt?
Nie / Selten Gelegentlich Konstant
X
Wie oft ändern sich die Daten?
Analyse vom Datentyp: Tag
Vergleich mit dem Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
interface Rezept {
titel: string;
beschreibung: string;
seitenzahl?: number;
anzahlPersonen?: number;
tags?: Tag[];
}
interface Tag {
titel: string;
}
Zu Dokument
Weniger als 100 Mehr als 100 Tausend
X
Wie groß ist der Datensatz?
Immer Manchmal Selten
X
Wie oft werden die Daten zusammen benutzt?
Nie / Selten Gelegentlich Konstant
X
Wie oft ändern sich die Daten?
Analyse vom Datentyp: Zutat
Vergleich mit dem Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
interface Rezept {
titel: string;
beschreibung: string;
seitenzahl?: number;
anzahlPersonen?: number;
tags?: Tag[];
zutaten?: Zutat[];
}
interface Tag {
titel: string;
}
interface Zutat {
stueck: number;
lebensmittel: string;
einheit?: string;
}
Zu Dokument
Weniger als 100 Mehr als 100 Tausend
X
Wie groß ist der Datensatz?
Immer Manchmal Selten
X
Wie oft werden die Daten zusammen benutzt?
Nie / Selten Gelegentlich Konstant
X
Wie oft ändern sich die Daten?
Analyse vom Datentyp: Quelle
Vergleich mit dem Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
interface Rezept {
titel: string;
beschreibung: string;
seitenzahl?: number;
anzahlPersonen?: number;
quelle: Quelle;
tags?: Tag[];
zutaten?: Zutat[];
}
interface Quelle {
titel: string;
standort?: string;
kurzbezeichnung?: string;
herkunft?: string;
anzahlRezepteGeschaetzt?: number;
}
interface Tag {
titel: string;
}
interface Zutat {
stueck: number;
lebensmittel: string;
einheit?: string;
}
Zu Dokument
Rezept
-----------------------------------
Titel
Beschreibung
…
Quelle
…
Tags
Zutaten
Tag
…
Zutat
…
Unterschiedliche Beziehungen behandeln in
dokumentenorientierten Datenbanken
Abfrage von Array-Werten ohne Duplikationen
> db.foo.save({ tags: ['Eierspeisen', 'Backstube'] })
> db.foo.save({ tags: ['Eierspeisen', 'Eingelegtes', 'Beilagen'] } )
> db.foo.save({ tags: ['Buttermischungen', 'Beilagen'] } )
> db.foo.distinct("tags")
[
"Backstube",
"Eierspeisen",
"Beilagen",
"Eingelegtes",
"Buttermischungen"
]
>
Anfragen für Array Felder
> db.foo.save({ _id: 1, "things" : [ 1, 2, 3 ] });
> db.foo.save({ _id: 2, "things" : [ 2, 3 ] });
> db.foo.save({ _id: 3, "things" : [ 3 ] });
> db.foo.save({ _id: 4, "things" : [ 1, 3 ] });
> db.foo.find({ things: 1 })
{ "_id" : 1, "things" : [ 1, 2, 3 ] }
{ "_id" : 4, "things" : [ 1, 3 ] }
>
Wichtig! Mongo ist Case-Sensitive.
Dot Notation
> db.foo.save({ _id: 1, "info" : { "canFly": false } });
> db.foo.save({ _id: 2, "info" : { "canFly": false } });
> db.foo.save({ _id: 3, "info" : { "canFly": true } });
> db.foo.save({ _id: 4, "info" : { "canFly": false } });
> db.foo.find({ "info.canFly": true })
{ "_id": 3, "info": { "canFly": true }}
>
▪ Ein Query kann ebenfalls Hierarchische Bedingungen beinhalten.
▪ Diese werden als String-Wert angeben.
▪ Wichtig! Mongo ist Case-Sensitive.
And-Kombination ebenfalls möglich
> db.foo.save({ _id: 1, "info": { "canFly": false } });
> db.foo.save({ _id: 2, "info": { "canFly": false } });
> db.foo.save({ _id: 3, "name": "Sample", "info": { "canFly": true } });
> db.foo.save({ _id: 4, "info" : { "canFly": false } });
> db.foo.find({ "name": "Sample", "info.canFly": true })
{ "_id": 3, "name": "Sample", "info": { "canFly": true }}
>
Das Komma steht hierbei als And-Operator.
Referenzierte Dokumente abfragen mit dem integrierten
Aggregation-Framework und der $lookup-Funktion
Dokumentation und Beispiel unter:
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
Domain-Driven Design
und das Fachmodell
Was ist DDD?
Domain-Driven Design (DDD) ist eine Herangehensweise an
die Modellierung komplexer, objektorientierter Software.
Quelle: wikipedia.de
Die Modellierung der Software wird dabei maßgeblich von den
umzusetzenden Fachlichkeiten der Anwendungsdomäne
beeinflusst.
Quelle: wikipedia.de
Domain = Fachlichkeit
Der Kunde Der Entwickler
Business-Experte Business-Experte
Fachlichkeit == Code
und Struktur
Eine „Common Language“ aufbauen!
Quelle:http://bonkersworld.net/object-world
Entwickler geben sich nicht genug Mühe, die
Objekte und Operationen so zu benennen, dass
die Namen zu den fachlichen Aufgaben passen.
Das führt zu einer großen Lücke zwischen dem
mentalen Modell, das die Anwender haben, und der
Software, die die Entwickler den Anwendern liefern.
Was macht der folgende Code?
Fachmodell / Domain Model
▪ Um also ein einheitliches Verständnis zwischen diesen
Gruppen (Domänenexperte und Entwickler) zu schaffen,
wird ein Modell der Domäne etabliert
▪ Ein Model ist eine auf bestimmte Zwecke ausgerichtete
vereinfachende Beschreibung der Wirklichkeit
Anemic domain model
▪ Unter DDD ein Anti-Pattern
▪ Trennt Datenstruktur und Funktionen
▪ Kein „richtiges“ objektorientiertes programmieren
▪ Braucht eigene Business-Logic-Schicht
▪ Macht ein Domain Model schwerer zu verstehen
Die Onion Architecture
Domain Model
(Core)
User Interface
(ASP.NET MVC, WPF etc.)
Tests
(BDD)
Services
Infrastructure
Application Services
Domain Services
Habt mehr Fokus
auf das Fachmodell
Fazit
NoSQL
is NOT a
Silver Bullet!
Use the right tool for
the right job!
Polyglot persistence gehört der Zukunft!
„NoSQL gibt uns
mehr Freiheiten,
dafür tragen wir mehr
Verantwortung“
http://about.me/Gregor.Biswanger
I´m looking forward to get your feedback
Thank you!

Weitere ähnliche Inhalte

Was ist angesagt?

PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)Koichiro Matsuoka
 
[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster
[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster
[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, ClusterJi-Woong Choi
 
Introdução ao Banco de dados - Prof. Daniel Brandão
Introdução ao Banco de dados - Prof. Daniel BrandãoIntrodução ao Banco de dados - Prof. Daniel Brandão
Introdução ao Banco de dados - Prof. Daniel BrandãoDaniel Brandão
 
看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學
看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學
看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學永立 連
 
アプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考えるアプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考えるpospome
 
JBoss AS 7 / EAP 6 modules and class loading
JBoss AS 7 / EAP 6 modules and class loadingJBoss AS 7 / EAP 6 modules and class loading
JBoss AS 7 / EAP 6 modules and class loadingnekop
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Yuichi Hasegawa
 
WebLogic Administration und Deployment mit WLST
WebLogic Administration und Deployment mit WLSTWebLogic Administration und Deployment mit WLST
WebLogic Administration und Deployment mit WLSTenpit GmbH & Co. KG
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Ryosuke Uchitate
 
Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J  Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J Daniel San Martin
 
リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計Mikiya Okuno
 
Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...
Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...
Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...Frederic Descamps
 
PostgreSQL worst practices, version PGConf.US 2017 by Ilya Kosmodemiansky
PostgreSQL worst practices, version PGConf.US 2017 by Ilya KosmodemianskyPostgreSQL worst practices, version PGConf.US 2017 by Ilya Kosmodemiansky
PostgreSQL worst practices, version PGConf.US 2017 by Ilya KosmodemianskyPostgreSQL-Consulting
 
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~貴志 上坂
 

Was ist angesagt? (18)

Postgresql tutorial
Postgresql tutorialPostgresql tutorial
Postgresql tutorial
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster
[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster
[오픈소스컨설팅]Day #2 MySQL Tuning, Replication, Cluster
 
#5 CRUD no MongoDB
#5   CRUD  no MongoDB#5   CRUD  no MongoDB
#5 CRUD no MongoDB
 
Query logging with proxysql
Query logging with proxysqlQuery logging with proxysql
Query logging with proxysql
 
Introdução ao Banco de dados - Prof. Daniel Brandão
Introdução ao Banco de dados - Prof. Daniel BrandãoIntrodução ao Banco de dados - Prof. Daniel Brandão
Introdução ao Banco de dados - Prof. Daniel Brandão
 
WebDAV as Web API
WebDAV as Web APIWebDAV as Web API
WebDAV as Web API
 
看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學
看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學
看似比較簡單的Linux推坑教學 linux mint cinnamon 18.1 操作設定教學
 
アプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考えるアプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考える
 
JBoss AS 7 / EAP 6 modules and class loading
JBoss AS 7 / EAP 6 modules and class loadingJBoss AS 7 / EAP 6 modules and class loading
JBoss AS 7 / EAP 6 modules and class loading
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
 
WebLogic Administration und Deployment mit WLST
WebLogic Administration und Deployment mit WLSTWebLogic Administration und Deployment mit WLST
WebLogic Administration und Deployment mit WLST
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J  Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J
 
リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計
 
Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...
Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...
Another MySQL HA Solution for ProxySQL Users, Easy and All Integrated: MySQL ...
 
PostgreSQL worst practices, version PGConf.US 2017 by Ilya Kosmodemiansky
PostgreSQL worst practices, version PGConf.US 2017 by Ilya KosmodemianskyPostgreSQL worst practices, version PGConf.US 2017 by Ilya Kosmodemiansky
PostgreSQL worst practices, version PGConf.US 2017 by Ilya Kosmodemiansky
 
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
 

Ähnlich wie Fachmodell-First: Einstieg in das NoSQL-Schema-Design

MongoDB: Entwurfsmuster für das NoSQL-Schema-Design
MongoDB: Entwurfsmuster für das NoSQL-Schema-DesignMongoDB: Entwurfsmuster für das NoSQL-Schema-Design
MongoDB: Entwurfsmuster für das NoSQL-Schema-DesignGregor Biswanger
 
Objekt-Relationales Mapping - von Java zu relationalen DBs
Objekt-Relationales Mapping - von Java zu relationalen DBsObjekt-Relationales Mapping - von Java zu relationalen DBs
Objekt-Relationales Mapping - von Java zu relationalen DBsSebastian Dietrich
 
Kickoff Workshop zum Projekt amsl mit den sächsischen Hochschulbibliotheken
Kickoff Workshop zum Projekt amsl mit den sächsischen HochschulbibliothekenKickoff Workshop zum Projekt amsl mit den sächsischen Hochschulbibliotheken
Kickoff Workshop zum Projekt amsl mit den sächsischen HochschulbibliothekenLydiaU
 
AMSL Kick-off-Meeting sächsischer Hochschulbibliotheken
AMSL Kick-off-Meeting sächsischer HochschulbibliothekenAMSL Kick-off-Meeting sächsischer Hochschulbibliotheken
AMSL Kick-off-Meeting sächsischer HochschulbibliothekenBjörn Muschall
 
DWH-Modellierung mit Data Vault
DWH-Modellierung mit Data VaultDWH-Modellierung mit Data Vault
DWH-Modellierung mit Data VaultTrivadis
 
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatengeKarin Patenge
 
NoSQL - Neue Ansätze zur Verwaltung unstrukturierter Daten
NoSQL - Neue Ansätze zur Verwaltung unstrukturierter DatenNoSQL - Neue Ansätze zur Verwaltung unstrukturierter Daten
NoSQL - Neue Ansätze zur Verwaltung unstrukturierter DatenMartin Junghanns
 
Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)Andreas Buckenhofer
 
Einführung in NoSQL-Datenbanken
Einführung in NoSQL-DatenbankenEinführung in NoSQL-Datenbanken
Einführung in NoSQL-DatenbankenTobias Trelle
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“hpaustria
 
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...Spark Summit
 
Data Science Algorithms @ Xing
Data Science Algorithms @ XingData Science Algorithms @ Xing
Data Science Algorithms @ XingDaniel Kohlsdorf
 
IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...
IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...
IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...Karin Patenge
 
Webinar Big Data - Enterprise Readiness mit Hadoop
Webinar Big Data - Enterprise Readiness mit HadoopWebinar Big Data - Enterprise Readiness mit Hadoop
Webinar Big Data - Enterprise Readiness mit Hadoopfun communications GmbH
 
Cloud Computing für die Verarbeitung von Metadaten
Cloud Computing für die Verarbeitung von MetadatenCloud Computing für die Verarbeitung von Metadaten
Cloud Computing für die Verarbeitung von MetadatenMagnus Pfeffer
 
2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzen
2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzen2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzen
2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzenCarsten Hetzel
 
Heterogene Daten(-strukturen) in der Oracle Datenbank
Heterogene Daten(-strukturen) in der Oracle DatenbankHeterogene Daten(-strukturen) in der Oracle Datenbank
Heterogene Daten(-strukturen) in der Oracle DatenbankUlrike Schwinn
 
Einführung in die semantische Suche in Massendaten
Einführung in die semantische Suche in MassendatenEinführung in die semantische Suche in Massendaten
Einführung in die semantische Suche in MassendatenMartin Voigt
 
Relationale Datenbanken Access
Relationale Datenbanken AccessRelationale Datenbanken Access
Relationale Datenbanken AccessPeter Micheuz
 

Ähnlich wie Fachmodell-First: Einstieg in das NoSQL-Schema-Design (20)

MongoDB: Entwurfsmuster für das NoSQL-Schema-Design
MongoDB: Entwurfsmuster für das NoSQL-Schema-DesignMongoDB: Entwurfsmuster für das NoSQL-Schema-Design
MongoDB: Entwurfsmuster für das NoSQL-Schema-Design
 
Objekt-Relationales Mapping - von Java zu relationalen DBs
Objekt-Relationales Mapping - von Java zu relationalen DBsObjekt-Relationales Mapping - von Java zu relationalen DBs
Objekt-Relationales Mapping - von Java zu relationalen DBs
 
Kickoff Workshop zum Projekt amsl mit den sächsischen Hochschulbibliotheken
Kickoff Workshop zum Projekt amsl mit den sächsischen HochschulbibliothekenKickoff Workshop zum Projekt amsl mit den sächsischen Hochschulbibliotheken
Kickoff Workshop zum Projekt amsl mit den sächsischen Hochschulbibliotheken
 
AMSL Kick-off-Meeting sächsischer Hochschulbibliotheken
AMSL Kick-off-Meeting sächsischer HochschulbibliothekenAMSL Kick-off-Meeting sächsischer Hochschulbibliotheken
AMSL Kick-off-Meeting sächsischer Hochschulbibliotheken
 
DWH-Modellierung mit Data Vault
DWH-Modellierung mit Data VaultDWH-Modellierung mit Data Vault
DWH-Modellierung mit Data Vault
 
Amazon Redshift
Amazon RedshiftAmazon Redshift
Amazon Redshift
 
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
 
NoSQL - Neue Ansätze zur Verwaltung unstrukturierter Daten
NoSQL - Neue Ansätze zur Verwaltung unstrukturierter DatenNoSQL - Neue Ansätze zur Verwaltung unstrukturierter Daten
NoSQL - Neue Ansätze zur Verwaltung unstrukturierter Daten
 
Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)
 
Einführung in NoSQL-Datenbanken
Einführung in NoSQL-DatenbankenEinführung in NoSQL-Datenbanken
Einführung in NoSQL-Datenbanken
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
 
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
Clickstream Analysis with Spark—Understanding Visitors in Realtime by Josef A...
 
Data Science Algorithms @ Xing
Data Science Algorithms @ XingData Science Algorithms @ Xing
Data Science Algorithms @ Xing
 
IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...
IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...
IT-Tage 2017: Visuelle Analyse komplexer Datenbestände am Beispiel der Panama...
 
Webinar Big Data - Enterprise Readiness mit Hadoop
Webinar Big Data - Enterprise Readiness mit HadoopWebinar Big Data - Enterprise Readiness mit Hadoop
Webinar Big Data - Enterprise Readiness mit Hadoop
 
Cloud Computing für die Verarbeitung von Metadaten
Cloud Computing für die Verarbeitung von MetadatenCloud Computing für die Verarbeitung von Metadaten
Cloud Computing für die Verarbeitung von Metadaten
 
2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzen
2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzen2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzen
2013-09-12, sfugcgn: CSS-Selektoren für Datenbankabfragen nutzen
 
Heterogene Daten(-strukturen) in der Oracle Datenbank
Heterogene Daten(-strukturen) in der Oracle DatenbankHeterogene Daten(-strukturen) in der Oracle Datenbank
Heterogene Daten(-strukturen) in der Oracle Datenbank
 
Einführung in die semantische Suche in Massendaten
Einführung in die semantische Suche in MassendatenEinführung in die semantische Suche in Massendaten
Einführung in die semantische Suche in Massendaten
 
Relationale Datenbanken Access
Relationale Datenbanken AccessRelationale Datenbanken Access
Relationale Datenbanken Access
 

Mehr von Gregor Biswanger

Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreGregor Biswanger
 
Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Gregor Biswanger
 
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreElectron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreGregor Biswanger
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 
MongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerMongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerGregor Biswanger
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Gregor Biswanger
 
Aber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-Apps
Aber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-AppsAber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-Apps
Aber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-AppsGregor Biswanger
 
Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...
Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...
Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...Gregor Biswanger
 
Clevere Tipps zum Thema Facebook Posts
Clevere Tipps zum Thema Facebook PostsClevere Tipps zum Thema Facebook Posts
Clevere Tipps zum Thema Facebook PostsGregor Biswanger
 
Responsive Webdesign mit Bootstrap
Responsive Webdesign mit BootstrapResponsive Webdesign mit Bootstrap
Responsive Webdesign mit BootstrapGregor Biswanger
 
Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...
Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...
Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...Gregor Biswanger
 
Multi Touch.Prio.Conference 2009
Multi Touch.Prio.Conference 2009Multi Touch.Prio.Conference 2009
Multi Touch.Prio.Conference 2009Gregor Biswanger
 

Mehr von Gregor Biswanger (12)

Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1
 
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreElectron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
MongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerMongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen Hacker
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
 
Aber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-Apps
Aber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-AppsAber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-Apps
Aber schnell! Top HTML5 Performance Tipps für Hybrid- und Web-Apps
 
Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...
Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...
Roadshow: Einstieg in die Hybrid-App Entwicklung mit dem Intel XDK und Apache...
 
Clevere Tipps zum Thema Facebook Posts
Clevere Tipps zum Thema Facebook PostsClevere Tipps zum Thema Facebook Posts
Clevere Tipps zum Thema Facebook Posts
 
Responsive Webdesign mit Bootstrap
Responsive Webdesign mit BootstrapResponsive Webdesign mit Bootstrap
Responsive Webdesign mit Bootstrap
 
Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...
Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...
Intel XDK: Cross-Plattform Entwicklung – Apps Entwickeln für alle Plattformen...
 
Multi Touch.Prio.Conference 2009
Multi Touch.Prio.Conference 2009Multi Touch.Prio.Conference 2009
Multi Touch.Prio.Conference 2009
 

Fachmodell-First: Einstieg in das NoSQL-Schema-Design

  • 1. Fachmodell-First Einstieg in das NoSQL-Schema-Design Gregor Biswanger | Freier Berater, Trainer, Autor und Sprecher about.me/gregor.biswanger
  • 2. Über mich ▪ Freier Berater, Trainer und Autor ▪ Schwerpunkte: Softwarearchitektur, Web und Cross-Plattform Entwicklung mit JavaScript ▪ Technologieberater für die Intel Developer Zone ▪ Internationaler Sprecher auf Konferenzen und User Groups ▪ Freier Autor für heise.de, dotnetpro, WindowsDeveloper und viele weitere Fachmagazine ▪ Video-Trainer bei video2brain und Microsoft Gregor Biswanger Microsoft MVP, Intel Black Belt & Intel Software Innovator cross-platform-blog.de about.me/gregor.biswanger
  • 4. Durch NoSQL erhalten wir ein Booster in unsere Architektur bezüglich Produktivität, Flexibilität und Performance.
  • 5. Unser Reiseplan ▪ Was ist schlecht an relationalen Datenbanken ▪ Einführung in NoSQL ▪ Dokumentenorientierte Datenbank ▪ Dokumentenorientiert modellieren ▪ Gemeinsam ein Beispiel modellieren ▪ Domain-Driven Design und das Fachmodell ▪ Fazit
  • 7. Relationale Datenbanken sind nicht für Entwickler gemacht
  • 8. Sie geben sich als König in der Architektur aus
  • 9. Der Datenbank wird zu hohe Priorität zugesprochen und die meisten Diskussionen drehen sich um die Datenbank und das Datenmodell statt um Geschäftsprozesse und - vorgänge.
  • 10. Weil Sie es uns durch Ihre Regeln aufzwingen.
  • 14. Das macht die Entwickler traurig
  • 17. NoSQL Datenbanken verfolgen einen nicht-relationalen Ansatz.
  • 18. Sie brechen damit die lange Geschichte relationaler Datenbanken.
  • 19. Diese benötigen keine festgelegten Tabellenschemata und versuchen Joins zu vermeiden.
  • 26. Unterscheidung nach Datenmodell und Leistung Datenmodell Leistung Skalierbarkeit Flexibilität Komplexität Funktionalität Key–Value Hoch Hoch Hoch Keine Unterschiedlich (keine) Spaltenorientiert Hoch Hoch Mittel Gering Minimal Dokumentenorientiert Hoch Unterschiedlich (Hoch) Hoch Gering Unterschiedlich (gering) Graphbasiert Unterschiedlich Unterschiedlich Hoch Hoch Graphentheorie Relational Unterschiedlich Unterschiedlich Gering Mittel Relationale Algebra Quelle: https://de.wikipedia.org/wiki/NoSQL Datenmodell Leistung Skalierbarkeit Flexibilität Komplexität Funktionalität Key–Value Hoch Hoch Hoch Keine Unterschiedlich (keine) Spaltenorientiert Hoch Hoch Mittel Gering Minimal Dokumentenorientiert Hoch Unterschiedlich (Hoch) Hoch Gering Unterschiedlich (gering) Graphbasiert Unterschiedlich Unterschiedlich Hoch Hoch Graphentheorie Relational Unterschiedlich Unterschiedlich Gering Mittel Relationale Algebra
  • 28. Eine relationale Datenbank besteht aus Datenbanktabellen, die einem festen Datenbankschema unterliegen.
  • 29. Modeling data, the relational way
  • 30. Eine dokumentenorientierte Datenbank besteht aus einzelnen Dokumenten mit einem eindeutigen Identifikator.
  • 31. Modeling data, the document way { "id": "0ec1ab0c-de08-4e42-...", "addresses": [ { "street": "sesamstraße", "city": "gotham city" } ], "contractdetails": [ { "type": "home": "detail": "555-1212" }, { "type": "email": "detail": "no@no.com" } ], ... }
  • 33. Relationale Daten sind wie das recherchieren von Informationen
  • 34. Dokumentenorientiere Daten bieten alle benötigten Informationen
  • 36. Dokumentenorientierte Datenbanken meinen NICHT, das es keine relationale Daten geben darf.
  • 40. Im Allgemeinen bietet die Einbettung von Daten eine bessere Leistung für Leseoperationen.
  • 41. Eingebettete Datenmodelle ermöglichen die Aktualisierung der zugehörigen Daten in einem atomaren Schreibvorgang.
  • 43. Eingebettete Datenmodelle verwenden, wenn: ▪ Bei One-to-One-Beziehungen zwischen Entitäten. ▪ Bei One-to-Many-Beziehungen zwischen Entitäten. ▪ In diesen Beziehungen werden die "vielen" oder untergeordneten Dokumente immer zusammen mit dem "ein" oder den übergeordneten Dokumenten angezeigt.
  • 44. Referenzierte Datenmodelle verwenden, wenn: ▪ Ein Einbetten würde zu einer Duplizierung von Daten führen, würde jedoch keine ausreichenden Leseleistungsvorteile bieten, um die Auswirkungen der Duplizierung zu überwiegen. ▪ Komplexere Many-to-Many-Beziehungen. ▪ Große hierarchische Datensätze.
  • 45. Mein NoSQL Dokumenten- Schema Kompass für Dich!
  • 46. Dokumenten-Schema Kompass Immer Manchmal Selten Integriert x x x Referenziert x x Wie oft werden die Daten zusammen benutzt?
  • 47. Dokumenten-Schema Kompass Weniger als 100 Mehr als 100 Tausend Integriert x x Referenziert x x Wie groß ist der Datensatz?
  • 48. Dokumenten-Schema Kompass Nie / Selten Gelegentlich Konstant Integriert x x Referenziert x x Wie oft ändern sich die Daten?
  • 50.
  • 51.
  • 53. Optimierter Stand Datenbankspezifisch Datenbankspezifisch Datenbankspezifisch Zusammenfügen in Datentyp: Zutat Datentyp: Quelle Datentyp: Tag Datentyp: Rezept (Root-Document)
  • 54. Weniger als 100 Mehr als 100 Tausend X Wie groß ist der Datensatz? Immer Manchmal Selten Wie oft werden die Daten zusammen benutzt? Nie / Selten Gelegentlich Konstant X Wie oft ändern sich die Daten? Analyse vom Datentyp: Rezept
  • 55. Vergleich mit dem Dokumenten-Schema Kompass Immer Manchmal Selten Integriert x x x Referenziert x x Wie oft werden die Daten zusammen benutzt? Weniger als 100 Mehr als 100 Tausend Integriert x x Referenziert x x Wie groß ist der Datensatz? Nie / Selten Gelegentlich Konstant Integriert x x Referenziert x x Wie oft ändern sich die Daten?
  • 56. interface Rezept { titel: string; beschreibung: string; seitenzahl?: number; anzahlPersonen?: number; } Zu Dokument
  • 57. Weniger als 100 Mehr als 100 Tausend X Wie groß ist der Datensatz? Immer Manchmal Selten X Wie oft werden die Daten zusammen benutzt? Nie / Selten Gelegentlich Konstant X Wie oft ändern sich die Daten? Analyse vom Datentyp: Tag
  • 58. Vergleich mit dem Dokumenten-Schema Kompass Immer Manchmal Selten Integriert x x x Referenziert x x Wie oft werden die Daten zusammen benutzt? Weniger als 100 Mehr als 100 Tausend Integriert x x Referenziert x x Wie groß ist der Datensatz? Nie / Selten Gelegentlich Konstant Integriert x x Referenziert x x Wie oft ändern sich die Daten?
  • 59. interface Rezept { titel: string; beschreibung: string; seitenzahl?: number; anzahlPersonen?: number; tags?: Tag[]; } interface Tag { titel: string; } Zu Dokument
  • 60. Weniger als 100 Mehr als 100 Tausend X Wie groß ist der Datensatz? Immer Manchmal Selten X Wie oft werden die Daten zusammen benutzt? Nie / Selten Gelegentlich Konstant X Wie oft ändern sich die Daten? Analyse vom Datentyp: Zutat
  • 61. Vergleich mit dem Dokumenten-Schema Kompass Immer Manchmal Selten Integriert x x x Referenziert x x Wie oft werden die Daten zusammen benutzt? Weniger als 100 Mehr als 100 Tausend Integriert x x Referenziert x x Wie groß ist der Datensatz? Nie / Selten Gelegentlich Konstant Integriert x x Referenziert x x Wie oft ändern sich die Daten?
  • 62. interface Rezept { titel: string; beschreibung: string; seitenzahl?: number; anzahlPersonen?: number; tags?: Tag[]; zutaten?: Zutat[]; } interface Tag { titel: string; } interface Zutat { stueck: number; lebensmittel: string; einheit?: string; } Zu Dokument
  • 63. Weniger als 100 Mehr als 100 Tausend X Wie groß ist der Datensatz? Immer Manchmal Selten X Wie oft werden die Daten zusammen benutzt? Nie / Selten Gelegentlich Konstant X Wie oft ändern sich die Daten? Analyse vom Datentyp: Quelle
  • 64. Vergleich mit dem Dokumenten-Schema Kompass Immer Manchmal Selten Integriert x x x Referenziert x x Wie oft werden die Daten zusammen benutzt? Weniger als 100 Mehr als 100 Tausend Integriert x x Referenziert x x Wie groß ist der Datensatz? Nie / Selten Gelegentlich Konstant Integriert x x Referenziert x x Wie oft ändern sich die Daten?
  • 65. interface Rezept { titel: string; beschreibung: string; seitenzahl?: number; anzahlPersonen?: number; quelle: Quelle; tags?: Tag[]; zutaten?: Zutat[]; } interface Quelle { titel: string; standort?: string; kurzbezeichnung?: string; herkunft?: string; anzahlRezepteGeschaetzt?: number; } interface Tag { titel: string; } interface Zutat { stueck: number; lebensmittel: string; einheit?: string; } Zu Dokument
  • 67. Unterschiedliche Beziehungen behandeln in dokumentenorientierten Datenbanken
  • 68. Abfrage von Array-Werten ohne Duplikationen > db.foo.save({ tags: ['Eierspeisen', 'Backstube'] }) > db.foo.save({ tags: ['Eierspeisen', 'Eingelegtes', 'Beilagen'] } ) > db.foo.save({ tags: ['Buttermischungen', 'Beilagen'] } ) > db.foo.distinct("tags") [ "Backstube", "Eierspeisen", "Beilagen", "Eingelegtes", "Buttermischungen" ] >
  • 69. Anfragen für Array Felder > db.foo.save({ _id: 1, "things" : [ 1, 2, 3 ] }); > db.foo.save({ _id: 2, "things" : [ 2, 3 ] }); > db.foo.save({ _id: 3, "things" : [ 3 ] }); > db.foo.save({ _id: 4, "things" : [ 1, 3 ] }); > db.foo.find({ things: 1 }) { "_id" : 1, "things" : [ 1, 2, 3 ] } { "_id" : 4, "things" : [ 1, 3 ] } > Wichtig! Mongo ist Case-Sensitive.
  • 70. Dot Notation > db.foo.save({ _id: 1, "info" : { "canFly": false } }); > db.foo.save({ _id: 2, "info" : { "canFly": false } }); > db.foo.save({ _id: 3, "info" : { "canFly": true } }); > db.foo.save({ _id: 4, "info" : { "canFly": false } }); > db.foo.find({ "info.canFly": true }) { "_id": 3, "info": { "canFly": true }} > ▪ Ein Query kann ebenfalls Hierarchische Bedingungen beinhalten. ▪ Diese werden als String-Wert angeben. ▪ Wichtig! Mongo ist Case-Sensitive.
  • 71. And-Kombination ebenfalls möglich > db.foo.save({ _id: 1, "info": { "canFly": false } }); > db.foo.save({ _id: 2, "info": { "canFly": false } }); > db.foo.save({ _id: 3, "name": "Sample", "info": { "canFly": true } }); > db.foo.save({ _id: 4, "info" : { "canFly": false } }); > db.foo.find({ "name": "Sample", "info.canFly": true }) { "_id": 3, "name": "Sample", "info": { "canFly": true }} > Das Komma steht hierbei als And-Operator.
  • 72. Referenzierte Dokumente abfragen mit dem integrierten Aggregation-Framework und der $lookup-Funktion Dokumentation und Beispiel unter: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
  • 75. Domain-Driven Design (DDD) ist eine Herangehensweise an die Modellierung komplexer, objektorientierter Software. Quelle: wikipedia.de
  • 76. Die Modellierung der Software wird dabei maßgeblich von den umzusetzenden Fachlichkeiten der Anwendungsdomäne beeinflusst. Quelle: wikipedia.de
  • 78. Der Kunde Der Entwickler Business-Experte Business-Experte Fachlichkeit == Code und Struktur Eine „Common Language“ aufbauen!
  • 80. Entwickler geben sich nicht genug Mühe, die Objekte und Operationen so zu benennen, dass die Namen zu den fachlichen Aufgaben passen.
  • 81. Das führt zu einer großen Lücke zwischen dem mentalen Modell, das die Anwender haben, und der Software, die die Entwickler den Anwendern liefern.
  • 82. Was macht der folgende Code?
  • 83.
  • 84. Fachmodell / Domain Model ▪ Um also ein einheitliches Verständnis zwischen diesen Gruppen (Domänenexperte und Entwickler) zu schaffen, wird ein Modell der Domäne etabliert ▪ Ein Model ist eine auf bestimmte Zwecke ausgerichtete vereinfachende Beschreibung der Wirklichkeit
  • 85. Anemic domain model ▪ Unter DDD ein Anti-Pattern ▪ Trennt Datenstruktur und Funktionen ▪ Kein „richtiges“ objektorientiertes programmieren ▪ Braucht eigene Business-Logic-Schicht ▪ Macht ein Domain Model schwerer zu verstehen
  • 86. Die Onion Architecture Domain Model (Core) User Interface (ASP.NET MVC, WPF etc.) Tests (BDD) Services Infrastructure Application Services Domain Services
  • 87. Habt mehr Fokus auf das Fachmodell
  • 88. Fazit
  • 90. Use the right tool for the right job!
  • 92. „NoSQL gibt uns mehr Freiheiten, dafür tragen wir mehr Verantwortung“
  • 93.
  • 94. http://about.me/Gregor.Biswanger I´m looking forward to get your feedback Thank you!