JSON Type in der Oracle-Datenbank und Autonomous JSON Database - DOAG
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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
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