Donnerstag, 1. September 2011

Technische Unterschiede PostgreSQL, MySQL, MariaDB - Teil 4

Die vorangegangenen Teile dieser Artikelserie sind hier:
  1. http://miraspostgresqlwelt.blogspot.com/2011/08/technische-unterschiede-postgresql.html 
  2. http://miraspostgresqlwelt.blogspot.com/2011/08/technische-unterschiede-postgresql_30.html 
  3. http://miraspostgresqlwelt.blogspot.com/2011/08/technische-unterschiede-postgresql_31.html 
Grobe architektonische Unterschiede

Prozess versus Thread

PostgreSQL ist prozessbasiert, MySQL ist threadbasiert.

REDO statt UNDO und REDO

PostgreSQL macht REDO, InnoDB UNDO und REDO.

Write Ahead Log

Sowohl bei PostgreSQL als auch InnoDB loggen Transaktionen.

PostgreSQL schaut hier, welche Blöcke sich geändert haben und übernimmt die gesamten Blöcken in das Log.

InnoDB überträgt nur die geänderten Bereiche eines geänderten Blocks in das Log.

Die Blöcke hier sind in der Regel bei PostgreSQL 8 kB und bei InnoDB 16 kB.

Was ist eigentlich eine Datenbank?

Was genau eine Datenbank ist, ist im SQL-Standard festgelegt. Der SQL Standard
spricht von Datenbank, Schema, Tabelle und Spalte.

Datenbanken sind unabhängig von einander. Objekte einer Datenbank dürfen keine Verbindungen zu Objekten anderer Datenbanken haben.

Schemas sind Objekte einer Datenbank.

Tabellen sind Objekte in einem Schema und Spalten Objekte innerhalb einer Tabelle.

Objekte eines Schemas dürfen Verbindungen zu Objekten in anderen Schemas haben.

Ich vergleich das gern mit Bauausschreibungen oder LaTex. Bauabschnitt, Los, Titel, Position bzw. Chapter, Section, Subsection, Subsubsection. Nur bei ganz großen Bauten ist die Unterteilung nach Losen erforderlich. Unterschiedliche Bauabschnitte kommen ebenfalls nur in sehr großen Bauvorhaben vor. Die meisten Bauausschreibungen wird im Bauabschnitt genau das eine Gebäude genannt, das gebaut wird, Lose gibt es nicht, sondern die Untergliederung der Ausschreibung enthält sofort Titel und Positionen.

Chapter in LaTeX habe ich persönlich nur für meine Diplomarbeit benötigt. Alle anderen Dokumente, die ich bis heute verfaßt habe, kamen mit Section, Subsection und Subsubsection aus.

Eine MySQL-Datenbank ist ein Schema. Eine Instanz ist eine Datenbank.

Der Begriff Datenbank führt bei PostgreSLern und MySQLern immer wieder gern zu Mißverständnissen. Wenn MySQLer von Datenbank sprechen, meinen Sie i.d.R. Schema. Wenn PostgreSQLer von Schema sprechen, meinen sie das, was in MySQL eine Datenbank ist.

Nicht jede PostgreSQL-Datenbank nutzt die Hirarchie Schema. Auch wenn PostgreSQL mehrere Datenbanken verwalten kann, so sieht man häufig nur eine einzige pro Instanz. Die Unterteilung in Schemas ist ein nettes Feature für Datenbanken mit vielen Tabellen. Es macht die Datenbank zum einen übersichtlicher und zum anderen erspart es eine Menge Tipparbeit bei der Vergabe von Zugriffsrechten (GRANT auf das Schema statt auf die einzelnen Tabellen).

Bei kleinen und mittleren Datenbanken wird bei Postgres aber gerne auf die Unterteilung in Schemas verzichtet und stattdessen lediglich Datenbank und dann
die Tabellen angelegt. Gibt es kein Schema, liegen die Tabellen bei PostgreSQL in dem Schema "public".

Bei MySQL ist der Begriff Datenbank ein Alias auf Schema. Der MySQLer legt
quasi ein Schema an, in welchem er die Tabellen ablegt. Aber - auch bei MySQL
findet man häufig nur ein Schema pro Instanz.

Daraus folgt, dass es in den meisten Fällen einfach eine Bezeichnung für eine Datensammlung ist, in der dann Tabellen liegen. Aufpassen sollte man hier nur,
wenn von einem zum anderen migriert oder repliziert wird.

Von MySQL zu PostgreSQL sollte man sich überlegen, ob man das MySQL Schema als PostgreSQL Datenbank anlegt und einfach auf die Hirarchiestufe Schema in Postgres verzichtet - oder ob man der PostgreSQL-Datenbank einen eigenen Namen gibt und das Schema als Schema dieser Datenbank implementiert. Bei den meisten Fällen, die mir hier bislang untergekommen sind, war ersteres sinnvoller.

Von PostgreSQL zu MySQL sollte man schauen, ob die Datenbank eine Schemaunterteilung hat. Wenn ja, sind die einzelnen Schemas in MySQLDB einzelne Datenbanken/Schemas. Wenn nicht, dann sollte der Datenbankname von PostgreSQL der Datenbank-/Schemaname von MySQL werden. Achtung hier bei der Verwendung von Tools. Immer wieder sehe ich hier, dass die MySQL Datenbank am Ende "public" heisst.

Fortsetzung folgt ....

Keine Kommentare:

Kommentar veröffentlichen