JSON Type in der Oracle-Datenbank und Autonomous JSON Database - DOAG

Die Seite wird erstellt Leonard Braun
 
WEITER LESEN
JSON Type in der Oracle-Datenbank und Autonomous JSON Database - DOAG
Datenbank

     JSON Type in der Oracle-Datenbank
     und Autonomous JSON Database
                                                                                               Beda Hammerschmidt, Oracle Deutschland

     JSON wird bei der Entwicklung von neuen Anwendungen immer beliebter; was als Datenaustauschformat
     zwischen Webserver und Browser begann, findet immer häufiger den Weg in die Datenbank. Dieser Artikel
     beleuchtet, welche Anforderungen, Vorteile und Probleme sich daraus ergeben, Daten nicht normalisiert
     in Tabellen, sondern stattdessen im JSON-Format zu speichern und abzufragen.

     JSON ist ein einfaches Format, um Ob-        Was ist JSON?                                   Wert 25). Keys sind immer String, ihnen
     jekte einer Programmiersprache in ei-                                                        folgt ein Doppelpunkt und ein dem Key
     nen String zu serialisieren. JSON ist zwar   Wir beschreiben JSON an folgendem Bei-          zugeordneter Wert – dieser ist entweder
     syntaktisch anders als XML, diesem aber      spiel (siehe Listing 1). Wer JSON kennt,        skalar oder komplex (Objekt oder Array).
     nicht unähnlich: Beides sind hierarchi-      kann diesen Absatz gerne überspringen.          Bei skalaren Werten wird der Datentyp
     sche Datenmodelle, menschenlesbar und           JSON basiert auf zwei Strukturen: dem        durch die Syntax festgelegt (25 ist eine
     selbstbeschreibend. JSON gilt jedoch als     Objekt {…} und dem Array […]. In einem          Nummer, „25“ ein String). Die Datentypen
     wesentlich einfacher und ersetzt somit       Objekt werden Key-Value-Paare ohne              sind auf Nummer, String, Boolean und
     XML in vielen Bereichen (z.B. JSON REST      Reihenfolge zusammengefasst, der Key            null reduziert. Leider gibt es kein Datum
     statt XML Webservice).                       identifiziert den Wert (z.B. ‚age‘ hat den      oder Timestamp, sodass diese in der Re-

44    www.aoug.at • www.doag.org • www.soug.ch
JSON Type in der Oracle-Datenbank und Autonomous JSON Database - DOAG
gel als String abgebildet werden müssen                plex wahrgenommen wird. ORM-Tools              oder analytische Anfragen sein. Gerade
(siehe ‚lastUpdated‘). Innerhalb eines Ar-             wie Hibernate mögen das Mapping ver-           bei NoSQL-Datenbanken kann das dazu
rays definiert die Position den Wert. Das              einfachen, werden jedoch auch oft als          führen, dass Daten jetzt in ein anderes
Array gleicht somit einer Liste, das Object            Hindernis und inflexibel empfunden.            System geladen werden müssen.
einer Hashtable/Map. Arrays und Objekte                JSON zur Vermeidung von Normalisie-        •   JSON kennt keine Referenzen – Pri-
lassen sich schachteln, um beliebig kom-               rung kann auch zu Performanz-Verbes-           mary/Foreign-Key-Constraints gibt es
plizierte Hierarchien zu bilden.                       serungen führen, wenn ein JSON-Zugriff         erst mal nicht, können in Oracle durch
    Anders als bei XML gibt es in der Re-              Joins über viele Tabellen erspart.             Virtual Columns jedoch nachgebildet
gel kein Schema, das JSON-Daten defi-                                                                 werden. In einer NoSQL-Datenbank
niert. Auch bietet die JSON-Syntax mehr           3. Einfache APIs: Entwickler mögen Daten-           hat man diese Lösung nicht und muss
Informationen als XML. Der Wert [„1“] be-            bank-Operationen direkt von der Pro-             versuchen, die Daten-Integrität im Ap-
schreibt eine Liste mit einem String. Beim           grammiersprache aufrufen, ohne erst              plikationscode zu gewährleisten.
XML-Äquivalent 1 müsste man ins                SQL Strings zusammenzubauen. Diese           •   NoSQL-Datenbanken haben oft wei-
XML-Schema schauen, um dieselben In-                 sogenannten ‚JSON Document Store‘                tere Einschränkungen: So fehlen oft
formationen zu bestimmen.                            APIs stammen von NoSQL-Produkten,                Transaktionen, Joins und andere Da-
                                                     die ihren Mangel einer deklarativen              tenbank-Basics, die dann von Hand im
                                                     Anfragesprache wie SQL so erfolgreich            Applikationscode nachgebaut werden
Warum JSON in der                                    als Vorteil verkaufen konnten.                   müssen.
Datenbank?

Das Speichern von JSON wurde durch
NoSQL-Produkte wie MongoDB populär.                   {
                                                      "firstName":"John",
Heute unterstützen viele relationale Da-
                                                         "lastName":"Smith",
tenbanken ebenfalls JSON, wenn auch in                   "age":25,
einem unterschiedlichen Maß. Die folgen-                 "address":{"street":"21 2nd Street",
den Gründe sprechen für JSON:                         			        "city":"New York", "state":"NY",
                                                      			        "postalCode":"10021", "isBusiness":false},
                                                         "phoneNumbers":[{"type":"home","number":"212 555-1234"},
1. Schema-Flexibilität: Änderungen der
                                                      					             {"type":"mobile","number":"646 555-4567"}],
   Anwendung lassen sich leicht mit JSON                 "lastUpdated":"2019-05-13T13:03:35+0000"
   realisieren: So lässt sich etwa ein ‚midd-         }
   leName‘ als Beispiel einfügen. Dies
   wäre mit einem Alter Table Add                 Listing 1: JSON-Objekt mit Daten einer Person
   Column relational noch leicht durchzu-
   führen – aber oft muss der Entwickler
   solch eine Änderung mit einem DBA              Wenngleich hier eine Menge Vorteile von         Was bietet Oracle?
   koordinieren. JSON ermöglicht auch             JSON gegenüber klassischen Tabellen
   Kardinalitäts-Änderungen – sollen im           genannt wurden, so müssen die Konse-            Oracle hat erkannt, dass JSON bei Ent-
   Beispiel mehrere Adressen pro Person           quenzen und Nachteile jedoch auch klar          wicklern sehr beliebt ist, aber dass es we-
   unterstützt werden, so wird aus dem            benannt werden. Diese sind häufig dem           nig Sinn ergibt, sich die Flexibilität von
   Wert für ‚address‘ einfach ein Array,          Entwickler nicht umfänglich bewusst (oder       JSON mit dem Verlust von wichtigen re-
   das beliebig viele Adressen beinhalten         zu Beginn der Entwicklung noch nicht rele-      lationalen Features zu erkaufen. Bereits
   kann. Dies wäre relational vermutlich          vant), können jedoch zu gravierenden Pro-       2013 haben Oracle und IBM den offe-
   mit einer neuen Tabelle verbunden,             blemen im späteren Betrieb führen:              nen SQL/JSON-Standard entworfen, der
   sodass Anfragen und Updates ange-                                                              später im SQL-2016-Standard aufging.
   passt werden müssten. JSON entkop-             •    Die Schema-Flexibilität von JSON be-       Oracle brachte 2014 mit Release 12.1.0.2
   pelt somit Änderungen an der Anwen-                 deutet nicht, dass kein Schema vor-        die erste Datenbank mit SQL/JSON-Funk-
   dung vom Datenbankschema.                           handen ist, sondern eher, dass das         tionen heraus. (Der Autor hatte nicht nur
                                                       Schema implizit im Applikationscode        die Ehre am Standard mitzuarbeiten, son-
2. Keine Normalisierung: Der Entwickler                verteilt ist. Schema-Änderungen wer-       dern auch – wie es bei Oracle üblich ist
   ‚denkt‘ häufig in Objekten der Anwen-               den jetzt nicht mehr von der Daten-        – die neuen Funktionen wie JSON_VALUE
   dung, zum Beispiel ‚Kunde‘, ‚Vertrag‘, ‚Be-         bank zentral ‚kontrolliert‘, sondern Ap-   oder JSON_TABLE in C zu implementie-
   stellung‘. Diese lassen sich meist leicht in        plikationscode muss gegebenenfalls         ren und die Bugs zu beheben.) In der ak-
   ein JSON-Objekt überführen, während                 angepasst werden, was Wartung nicht        tuellen Datenbankversion 19c gehen die
   bei einer Normalisierung oft mehrere                vermeidet, sondern nur verschiebt.         Funktionalitäten weit über die SQL/JSON-
   Tabellen benötigt werden. Folglich invol-      •    Ein Schema, das gut für einen Anwen-       Funktionen hinaus:
   vieren selbst einfache Operationen SQL              dungsfall geeignet ist (zum Beispiel           Oracles Ansatz ist es, JSON nicht als Al-
   über mehrere Tabellen, was von (jünge-              alle Daten eines Kunden finden), mag       ternative zum relationalen Modell zu etab-
   ren) Entwicklern häufig als unnötig kom-            schlecht für andere Fälle wie Reporting    lieren, sondern die Vorteile beider Model-

                                                                                                           Red Stack Magazin 01/2021              45
Datenbank

     le je nach Bedarf kombinieren zu können.         select id, jt.*
     Konkret bedeutet dies, a) dass JSON in           from custData, JSON_TABLE(jcol, '$' columns (
     normalen Tabellen gespeichert wird, b)             "first"					           path '$.firstName',
                                                        "age"    number			     path '$.age',
     dass relationale Spalten und JSON-Spal-
                                                        "state" varchar2(2)    path '$.address.state',
     ten beliebig kombinierbar sind und c) dass         NESTED PATH ‘$.phoneNumbers[*] columns(
     sich JSON-Daten ins relationale Modell           			       phone" path '$.number') )) jt;
     umwandeln lassen und sich umgekehrt
     aus relationalen Daten JSON generieren
                                                      ID first age state		 phone
     lässt. Listing 2 zeigt, wie das JSON-Beispiel
                                                      --------------------------
     mittels JSON_TABLE ins relationale Modell        1 John     25 NY		   212-555-1234
     überführt wird. Man beachte, dass aus ei-        1 John     25 NY		   646-555-4567
     ner JSON-Eingabe zwei Zeilen generiert
     werden, da über das Array mit den Tele-         Listing 2: JSON_Table mit Ergebnis
     fonnummern iteriert wird (Nested Path)
         Wie leicht es ist, aus relationalen Daten
     JSON zu erzeugen, illustriert Listing 3, das     SELECT JSON_ARRAYAGG (JSON_OBJECT (*))
                                                      from emp WHERE empno > 7900;
     zwei Zeilen der emp-Tabelle als zwei JSON-
     Objekte in einem Array zurückliefert:            [{"EMPNO":7902,"ENAME":"FORD","JOB":"ANALYST","MGR":7566,…},
         JSON und Tabellen lassen sich also            {"EMPNO":7934,"ENAME":"MILLER","JOB":"CLERK","MGR":7782,…}]
     leicht von einer Darstellung in die andere
     und zurück verwandeln, sodass man von           Listing 3: JSON-Erzeugung aus relationalen Daten
     verschiedenen Sichten auf dieselben Da-
     ten sprechen kann. JSON und relational
     sind somit kein Entweder-oder, sondern          wissen Document Store APIs zu schät-               DA-Treiber ersetzt diese dann mit einem
     lassen sich bedarfsgerecht kombinieren.         zen – insbesondere MongoDB hat hier das            äquivalenten SQL Statement, das an die
     Insbesondere ist der volle Umfang von           Bewusstsein für eine einfach zu nutzen-            Datenbank gesendet wird. SODA ist also
     SQL auf JSON-Daten anwendbar.                   de Datenbank-Schnittstelle geschaffen.             ein NoSQL-API auf einer SQL- Datenbank.
                                                     Oracle hat mit SODA (Simple Oracle Do-             Listing 4 zeigt, wie eine JSON-Collec-
                                                     cument Access) ein ähnliches API geschaf-          tion mit dem Namen ‚cities‘ ange-
     SODA Document Store API                         fen, das direkt in Java, Python, JavaScript        legt wird und wie zwei JSON-Daten-
                                                     (nodeJs), PL/SQL, aber auch REST und Sql-          sätze eingefügt werden. Die ‚soda
     Die im SQL/JSON-Standard definierten            Cl verfügbar ist. Die Idee von SODA ist            get‘-Operation hat einen Filterausdruck
     Funktionen wie JSON_TABLE oder JSON_            es, einfache Operationen (Finden, Ein-             ({„population“:{„$gt“:250000}})
     OBJECT sind Erweiterungen der SQL-Spra-         fügen, Löschen, Ersetzen) direkt von der           und selektiert alle Städte, deren Einwoh-
     che. Entwickler mit NoSQL-Hintergrund           Programmiersprache aufzurufen – der SO-            nerzahl größer als 250.000 ist.

46     www.aoug.at • www.doag.org • www.soug.ch
soda create cities;
 soda insert cities {"name":"San Jose","population":1021795,"county":"Santa Clara"}
 soda insert cities {"name":"Atlanta","population":506811,"county":["Fulton", "DeKalb"]}

 soda get cities -f {"population":{"$gt":250000}}

Listing 4: SODA-Operationen zum Erzeugen einer Collection, Einfügen von JSON-Daten und Suche mit JSON-Filterausdruck

    Hervorzuheben ist, dass SODA all die-        neue Entwickler anzuziehen. Im Gegen-            Über den Autor
se Operationen automatisch in äquiva-            zug ist AJD auf 20GB Nicht-JSON-Daten
lente SQL Statements übersetzt (CREATE           begrenzt, sodass rein relationale Wor-           Beda Hammerschmidt ist seit 2006 Ent-
TABLE, INSERT, SELECT.. WHERE). Das Bei-         kloads weiterhin ATP oder ADW nutzen.            wickler im Oracle-Datenbank-Team und
spiel nutzt SqlCl, die Syntax ist in anderen     Details und auch Performance-Verglei-            beschäftigt sich seit 2013 mit verschiede-
Sprachen wie Java oder JavaScript sehr           che mit MongoDB Atlas finden sich in [2],        nen JSON-Funktionalitäten und dem SQL/
ähnlich, sodass sich SODA-Kenntnisse             [3] und [4].                                     JSON-Standard.
leicht übertragen lassen. Die JSON-Coll-
ection ‚cities‘ ist nichts anderes als eine
System-generierte Tabelle mit einer JSON-        Fazit
Spalte – sie lässt sich ohne Weiteres mit
SQL (z.B. JSON_TABLE) abfragen.                  Während gerade (jüngere) Entwickler
                                                 sich von Tabellen abwenden und JSON
                                                 als primäres Datenmodell bevorzugen
JSON-Type mit Binärformat                        (JavaScript im Brower, NodeJs im Ser-
                                                 ver und JSON in der Datenbank), so geht
JSON ist in der Regel ein String (UTF8           es hingegen bei erfolgreichen Projek-
Unicode), der bei Datenbank-Zugriffen            ten vielmehr darum, die Stärken beider
erst geparst werden muss. Es gibt keine          Modelle zu kombinieren. SQL mag für
Möglichkeit, irrelevante Werte zu über-          einfache Operationen den Document
springen. Updates erfordern, dass der            Store APIs unterlegen sein, spätestens
JSON-String neu erstellt werden muss.            bei komplexeren Anfragen ist es jedoch
Aus diesem Grund hat Oracle in neue-             eindeutig besser (und dank Optimizer
ren Releases ein binäres JSON-Format             auch schneller). Bewährte relationa-
und einen neuen SQL-Datentyp ‚JSON‘              le Konzepte wie (Materialized) Views,
erstellt. Das Binärformat ist für schnel-        Partitionen, Transaktionen, Stored Pro-
le Anfragen und Updates optimiert: Off-          cedures sind natürlich auch relevant,
sets erlauben es, direkt zu selektierten         wenn die Daten im JSON-Format vorlie-
Daten zu springen; Updates können                gen. Mit Oracle als führende relationale
partiell durchgeführt werden und re-             JSON-Datenbank ist der Nutzer auf der
duzieren so IO und Logs. Aus Benut-              sicheren Seite: SQL und NoSQL-API las-
zersicht ändert sich wenig, da alle Opti-        sen sich gemeinsam mit denselben Da-
mierungen transparent stattfinden. Das           ten nutzen – ein von SODA eingefügtes
Binärformat (Format OSON) ist in al-             JSON-Dokument kann sofort mit SQL re-
len 19c-Cloud-Datenbanken verfügbar.             lational weiterverarbeitet werden und
JSON Type kann im 20c Preview Release            relationale Ergebnisse lassen sich per
evaluiert werden [1].                            JSON-Erzeugung auch SODA-Clients zur
                                                 Verfügung stellen. Ein Oracle-DBA kann
                                                 gesammeltes Wissen auch mit JSON
Autonomous JSON Database                         weiter anwenden.

Als neuestes Mitglied der Oracle Autono-
mous Databases gibt es seit August 2020          Quellen
die Autonomous JSON Database (AJD) –             [1] https://blogs.oracle.com/jsondb/20cpreview
einen für JSON Workloads optimierten             [2] https://www.oracle.com/autonomous-­
Cloud-Service. AJD hat denselben Funk-               database/autonomous-json-database/
                                                 [3] https://blogs.oracle.com/jsondb/­
tionsumfang wir Autonomous Transac-                  autonomous-json-database
tion Processing (ATP), wird jedoch preis-        [4] https://wikibon.com/oracle-­autonomous-               Beda Hammerschmidt
lich deutlich günstiger angeboten, um                json-takes-on-document-dbs/                     beda.hammerschmidt@oracle.com

                                                                                                            Red Stack Magazin 01/2021          47
Sie können auch lesen