Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Datenbanken — die Qual der Wahl

Philipp Krenn
September 07, 2017

Datenbanken — die Qual der Wahl

In kaum einem anderen Bereich gab es in den letzten Jahren eine derartig rege Neu- und Weiterentwicklung wie bei Datenbanken. Hatte man vor einigen Jahren oft noch "seine" Datenbank, die bei jedem Projekt zum Einsatz kam, ist man heute mit einer Vielzahl an Ansätzen und Implementierungen konfrontiert.

Wir starten mit einem kurzen Blick auf den theoretischen Hintergrund von verteilten Systemen und Datenbanken im Speziellen. Anhand dessen wird dann die Unterteilung in traditionelle, relationale Datenbanken wie PostgreSQL und MySQL auf der einen, beziehungsweise den neueren NoSQL Systemen wie MongoDB, Redis, Cassandra oder ElasticSearch auf der anderen Seite klar.
Danach diskutieren wir mögliche Einsatzszenarien sowie Vor- und Nachteile einiger Datenbanken:
* Wieso SQL (wieder) in Mode ist
* Warum MongoDB's Dokumenten-Struktur so gut zur objektorientierten Programmierung passt
* Wie man mit Redis effizient Zugriffe erfassen kann
* Wieso Cassandra so skalierbar und ausfallssicher ist
* Wie Volltextsuche mit ElasticSearch funktioniert

Die richtige Wahl der Datenbank(en) wurde durch die Vielzahl an Möglichkeiten sicherlich nicht einfacher, aber dafür um so interessanter!

Philipp Krenn

September 07, 2017
Tweet

More Decks by Philipp Krenn

Other Decks in Programming

Transcript

  1. Beating the CAP Theorem Checklist Your ( ) tweet (

    ) blog post ( ) marketing material ( ) online comment advocates a way to beat the CAP theorem. Your idea will not work. http://ferd.ca/beating-the-cap-theorem-checklist.html
  2. @OneToMany(mappedBy = "destCustomerId") @ManyToMany @Fetch(FetchMode.SUBSELECT) @JoinTable(name = "customer_dealer_map", joinColumns =

    { @JoinColumn(name = "customer_id", referencedColumnName = "id")}, inverseJoinColumns = { @JoinColumn(name = "dealer_id", referencedColumnName = "id")}) private Collection<Client> dealers;
  3. public abstract class EmployeeEntity { protected String name; } public

    class ManagerEntity extends EmployeeEntity { protected Boolean approveFunds; } public class WorkerEntity extends EmployeeEntity { protected Integer yearsExperience; }
  4. @Entity(value = "employee", noClassnameStored = false) public abstract class EmployeeEntity

    { @Id protected ObjectId id; protected String name; } public class ManagerEntity extends EmployeeEntity { protected Boolean approveFunds; } public class WorkerEntity extends EmployeeEntity { protected Integer yearsExperience; }
  5. { "_id": ObjectId("5461c8bf9e2acf32ed50c079"), "className": "net.xeraa.morphia_demo.entities.ManagerEntity", "name": "Peter", "approveFunds": true }

    { "_id": ObjectId("524d9fe7e4b0f8bd3031f84e"), "className": "net.xeraa.morphia_demo.entities.WorkerEntity", "name": "Philipp", "yearsExperience": 10 }
  6. HyperLogLog Unique elements in 12KB regardless of their number Error

    rate ~0,81% http://redis.io/commands/pfcount
  7. Eventually consistent was too hard, so we went with immediately

    inaccurate. — https://twitter.com/mysqlborat/status/621785755107524608
  8. Cassandra Query Language (CQL) Google Query Language (GQL) Couchbase N1QL

    RethinkDB Query Language (ReQL) ArangoDB Query Language (AQL)
  9. Document Score Term Frequency (TF) / Inverse Document Frequency (IDF)

    Field-length norm https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html