JSON je jedním z nejpopulárnějších datových formátů a není překvapením, že moderní, vícemodelové databáze, jako je Oracle, nabízejí podporu JSON. V ideálním případě databázový stroj podporuje jak rozhraní API pro dokumenty podobné noSQL, tak relační model pro flexibilitu.Standard SQL byl v letech 2016 a 2023 vylepšen, aby vyhovoval zpracování SQL/JSON. S rizikem, že to bude znít jako Captain Obvious, je samozřejmé, že dokumentové API podporuje databáze dokumentů od prvního dne.
Objekty schématu JSON
Oracle Database 21c představila nativní datový typ JSON (pokud vás zajímají implementace JSON napříč mnoha databázovými stroji, podívejte se na toto video, kde najdete hloubkovou recenzi). Na základě tohoto datového typu lze vytvářet další objekty schématu. Podívejme se na některé z nich, jak se liší a jejich účel.
- Běžné, relační tabulky a sloupce JSON
- JSON Relační dualitní pohledy
- Tabulka kolekce JSON
- Zobrazení kolekce JSON
Kromě první položky na seznamu jsou všechny tři další položky nové a exkluzivní pro Oracle Database 23ai.
Stoly
Vytvoření tabulky se sloupcem JSON je jednoduché. Následující příklad byl převzat z JSON Developer’s Guide:
create table j_purchaseorder (
id varchar2(32) not null constraint pk_purchaseorder primary key,
date_loaded timestamp(6) with time zone,
po_document json
);
Stůl je přesně „jako každý jiný stůl“. Opravdu nemusíte dělat nic zvláštního. Obsah můžete ověřit pomocí schématu JSON a jakéhokoli dalšího zpracování, které chcete provádět. JavaScript, jak jej poskytuje Multilingual Engine (MLE), je skvělou možností pro práci s JSON.
JSON Relační dualitní pohledy
Duální pohledy označují první radikálně nový objekt schématu v Oracle Database 23ai z výše uvedeného seznamu. Umožňují vám spojit efektivitu relačního datového modelu se snadným používáním dokumentového API. Další informace o použití případu JSON Relational a výhodách Duality Views si můžete přečíst v jeho Příručce pro vývojáře.
Buď vytvořte JSON Relational Duality Views pomocí příkazu DDL (viz níže), nebo použijte Oracle SQL Developer Extension pro VSCode pro grafické uživatelské rozhraní pro návrh pohledu.
Zde je příklad pohledu JSON Relational Duality založeného na vzorovém schématu HR. Uvádí všechna oddělení spolu s jejich zaměstnanci. Na rozdíl od typických úložišť dokumentů, která vždy odhalují všechna pole v kolekci, bylo rozhodnuto vystavit pouze to, co bylo pro tento hypotetický příklad relevantní:
create or replace json relational duality view emp_dept as
hr.departments {
_id: department_id
name: department_name
employees: hr.employees @insert @update @delete [
{
id: employee_id
firstname: first_name
lastname: last_name
email
}
]
};
Dualitní pohled JSON relační je přímo aktualizovatelný, což znamená, že můžete přímo vkládat, aktualizovat a odstraňovat dokumenty a dotazovat se na ně (výše uvedený příklad vyžaduje, aby bylo možné zapisovat určité anotace). Dokumenty podporované dualitním zobrazením mají vždy pole identifikátoru dokumentu, _id
. Musíte jej zadat při vytváření Duálního zobrazení. Podkladové tabulky lze samozřejmě také aktualizovat – změny v obou směrech se okamžitě projeví ve všech klientech, relačních nebo NoSQL.
Když se podíváte na definici duálního zobrazení, všimnete si, že se vám vrátí DDL zobrazení, ale z pohledu databáze obsahuje jeden sloupec DATA
typu JSON
.
SQL> ddl emp_dept
CREATE OR REPLACE FORCE EDITIONABLE JSON RELATIONAL DUALITY VIEW "EMILY"."EMP_DEPT" AS
hr.departments {
_id: department_id
name: department_name
employees: hr.employees @insert @update @delete [
{
id: employee_id
firstName: first_name
lastName: last_name
email
}
]
};
SQL> desc emp_dept
Name Null? Type
_______ ________ _______
DATA JSON
K dokumentům JSON v zobrazení přistupujete stejně jako k jakémukoli jinému JSON v Oracle. Používejte funkce SQL/JSON, jednoduchou tečkovou notaci nebo NoSQL API – cokoli, co nejlépe vyhovuje vašim potřebám. Zde je příklad obsahující SQL:
select
-- pretty print the output using json_serialize( ... pretty)
json_serialize(dv.data pretty) data
from
emp_dept dv
where
dv.data."_id" = 10;
DATA
___________________________________________________
{
"_id" : 10,
"_metadata" :
{
"etag" : "6DF460935D50048D6DE64A71D015EBFD",
"asof" : "00000000003324C8"
},
"name" : "Administration",
"employees" :
[
{
"id" : 200,
"firstName" : "Jennifer",
"lastName" : "Whalen",
"email" : "JWHALEN"
}
]
}
Další podrobnosti o JSON Relational Duality View můžete získat ze slovníku:
select
collection_name,
collection_type
from
user_json_collections;
COLLECTION_NAME COLLECTION_TYPE
__________________ __________________
EMP_DEPT DUALITY VIEW
Mezi další zobrazení slovníku patří:
- USER_JSON_DUALITY_VIEWS
- USER_JSON_DUALITY_VIEW_LINKS
- USER_JSON_DUALITY_VIEW_TABS
- USER_JSON_DUALITY_VIEW_TAB_COLS
O duálních zobrazeních je však třeba říci mnohem více, jako je nová funkce Flex Column a další. Podrobnosti naleznete v příručce JSON Developer’s Guide a JSON-Relational Duality Developer’s Guide.
Kolekční tabulky JSON
Tabulka kolekce JSON je běžná tabulka s jedním sloupcem DATA
typu JSON. S největší pravděpodobností je vytvořen pomocí noSQL API, jako je Simple Oracle Document Access (SODA) nebo Mongo DB API. Existuje také příkaz DDL, pokud jej potřebujete použít.
S největší pravděpodobností uvidíte tabulky kolekce JSON vytvořené jako výsledek tohoto kódu:
import { MongoClient } from "mongodb";
/**
* simple function using the MongoDB API under the covers to create a new
* collection and insert a document into it.
*/
export async function demo() {
// use the Mongo DB URI, as per the ADB-S "Tool Configuration",
// or the output of `ords serve...`. Store the DB_URI in an .env
// file, and pass this to node using --env-file. Make sure _not_
// to store the .env file in git!
const client = new MongoClient(
process.env.DB_URI, {
tlsAllowInvalidCertificates: true,
},
);
await client.connect();
console.log('successfully connected');
// define which Mongo Database to use
const db = client.db("EMILY");
// open/create the (new) collection
const collection = db.collection("myCollection");
// this document is based on the Administration department
// retrieved earlier from the Duality View
const adminDepartment = {
name: "Administration",
employees: [
{
id: 200,
firstName: "Jennifer",
lastName: "Whalen",
email: "JWHALEN",
},
],
};
// insert the new document
await collection.insertOne(adminDepartment);
// close the connection
await client.close();
}
Pokud bylo nakonfigurováno MongoDB API a vaše schéma je povoleno ORDS (Oracle REST Data Services), můžete tento úryvek JavaScriptu spustit proti Oracle beze změn (kromě URI databáze v případě, že jste použili jiné úložiště dokumentů). Na konci provádění funkce se vytvoří tabulka kolekce JSON:
select
collection_name,
collection_type
from
user_json_collections;
COLLECTION_NAME COLLECTION_TYPE
__________________ __________________
myCollection TABLE
EMP_DEPT DUALITY VIEW
Skutečnost, že tabulka je základem, myCollection
je z pohledu Mongo DB API irelevantní. Dokument API se zabývá dokumenty, nikoli tabulkami; JSON Collection stůl je pouhé vozidlo.
Protože je to v konečném důsledku „jen tabulka“, můžete tabulku kolekce JSON používat většinou způsobů, jakými používáte běžnou tabulku (srov. JSON Developer’s Guide). Můžete vytvořit sloupce výrazů (pro rozdělení tabulek), omezení dat a mnoho dalších věcí. Všechny dobré věci, které se stávají tabulkám (replikace, zálohování atd.), platí také pro tabulky kolekce JSON.
Neduální zobrazení kolekce JSON
Představte si neduální pohled na kolekce jako běžný pohled přístupný pro API dokumentu a pragmatický přístup k externalizaci dat do dokumentu API. Můžete jej definovat na základě jakékoli funkce SQL/JSON, pokud vrací jeden objekt JSON. Zobrazení kolekce JSON, které není duální, nelze přímo aktualizovat. Pomocí API dokumentu nebo SQL můžete dotazovat pouze jeho dokumenty. Veškeré požadované změny dat musí být zacíleny na podkladové tabulky zobrazení.
Tyto pohledy obvykle definujete ručně, například:
create json collection view empview as
select
json {
'_id' : employee_id,
last_name,
'contactinfo' : {email, phone_number},
hire_date,
salary
}
from
hr.employees;
V aktuálním schématu skončíte s neduálním zobrazením kolekce JSON:
COLLECTION_NAME COLLECTION_TYPE
__________________ __________________
myCollection TABLE
EMP_DEPT DUALITY VIEW
EMPVIEW VIEW
Takové zobrazení může být užitečné, pokud chcete externalizovat konkrétní data ze schématu nebo podmnožinu polí z kolekce bez udělení přístupu pro čtení a zápis.
Shrnutí
Oracle Database 23ai nabízí několik nových objektů schémat, včetně (ale nejen) relačních duálních pohledů JSON, neduálních pohledů kolekce JSON a tabulek kolekce JSON.
Tabulky jsou součástí relačních databází od samého počátku. Motory jsou neustále vylepšovány a pravidelně jsou přidávány nové datové typy, jako je JSON.
Duální pohledy jdou nad rámec usnadnění integrace frontend/backend nebo podpory migrací z úložiště dokumentů. Poskytují výkonný model, kde se relační integrita snoubí s flexibilitou JSON. Ať už je vaším úkolem vytvářet rozhraní API nebo aktivovat platformy s nízkým kódem, jako je APEX, Duality Views nabízí jednotný, transakční a výkonný přístup. Každý, kdo migruje z jednoúčelových úložišť dokumentů na Oracle, může také chtít zvážit Duality Views jako součást strategie migrace. V příručce JSON-Relational Duality Developer’s Guide je celá kapitola věnovaná migracím.
Tabulky kolekce JSON jsou často vytvářeny pomocí rozhraní API ve stylu noSQL, která se připojují k Oracle, jako je MongoDB API. Pokud rádi vyvíjíte pomocí SODA, jeho API také vytvoří tabulky kolekce JSON.
Nakonec můžete pragmaticky vystavit podmnožinu svého schématu rozhraní API dokumentu pomocí neduálních pohledů kolekce JSON.