Database
 sql >> Database >  >> RDS >> Database

FrankenQueries:quando SQL e NoSQL si scontrano

IBM pureXML, un database XML proprietario costruito su un meccanismo relazionale (progettato per giochi di parole) che offre linguaggi di query sia relazionali (SQL/XML) che non strutturati (XQuery), e MarkLogic, un database creato da scratch sulla base di un nuovo paradigma di database (chiamalo NoSQL se vuoi) che comprende i dati non strutturati e offre un linguaggio di query non strutturato ( XQuery ).

Un'altra informazione importante è la nuova tendenza tra i provider di database NoSQL per l'implementazione di SQL (o interfacce simili a SQL). Un esempio è la recente promozione di Cassandra con CQL o interfacce SQL ancora più mature basate su Hadoop.

Quando due mondi si scontrano

NoSQL su No SQL . Per me, questo significa spostare l'enfasi su alternative di database non relazionali, che possono anche esplorare diverse interfacce del database (e non si preoccupano della correttezza politica). Questa è una buona cosa! Ammettere ciecamente la debolezza di SQL per il business? Bene, anche se SQL è la scelta giusta per il tuo prodotto, devi comunque pensare alle conseguenze e assicurarti che le cose siano ben allineate tra i due mondi. In altre parole, significa rimuovere la parte "cieca" e ridurre lo "zoppo" a un minimo accettabile per i tuoi sviluppatori.

Modello di dati

In relazionale hai:

RowSet -> SQL -> RowSet

RowSet è qualcosa del genere:

RowSet -> Item+
Item -> INT | VARCHAR n | ...

Ti parlerò del modello di dati XPath:

XDM -> XPath/XQuery -> XDM

E XDM è qualcosa del genere:

XDM -> Item+
Item -> AtomicType | Tree
AtomicType -> integer | string | ...
...

(Entrambi sono semplificati, ma servono a uno scopo) .

Una caratteristica distintiva del modello dati per il documento è che gli alberi non sono piatti:

{
"namespace": "person-2.0",
"comments": "This guy asked me for a dinosaur sticker. What a nutter!",
"person": {
"handle": "dscape",
"comments": "Please do not send unsolicited mail."
}
}

Pertanto, ci sono molte interpretazioni di ciò che questo può significare:

SELECT comments from PERSON where handle = "dscape"

A quale elemento del “commento” si riferisce la richiesta? Se guardi SQL / XML, la tua query sarà simile a questa:

SELECT XMLQuery('$person/comments')
FROM PERSON
WHERE XMLExists('$person/person/handle')

Questo porta a questa ovvia conclusione:gli alberi hanno bisogno di un modo per navigare. In XML è XPath, in JSON potrebbe essere JSONSelect, forse qualcos'altro. Ma in primo luogo hai ancora bisogno del metodo di navigazione standard.

Ciò che rende questo compito ancora più interessante è il controllo della versione e lo sviluppo del circuito. Nonostante questo sia stato ignorato per anni nel mondo relazionale (con gravi conseguenze per il business dovute ai tempi morti in questi divertenti momenti di cambio tavola). , questo in effetti non deve essere ignorato per i documenti. Pensa a Microsoft Word:quante diverse versioni di documenti supportano? Parola 2003, 2005, ecc.

Nessuno schema, flessibilità, destrutturato:scegli la tua parola, ma sono tutti soggetti alla rapida evoluzione dei formati dei dati. In questa query, assumiamo che il descrittore sia un bambino umano e che i commenti che sono un idiota siano un discendente diretto dell'albero. Questo cambierà sicuramente. E SQL non supporta il controllo delle versioni dei documenti, quindi dovrai estenderlo per farlo funzionare.

Il vero linguaggio di query per i dati non strutturati deve tenere conto della versione. In XQuery possiamo esprimere questa query come qualcosa del genere:

declare namespace p = "person-2.0" ;

for $person in collection('person')
let $comments-on-person := $person/p:comments
where $person/p:handle = "dscape"
return $comments-on-person

Frankenquery, per esempio

Qualcuno una volta mi ha menzionato (parlando di SQL / XML) come questi Frankenquery. Il termine mi è rimasto in testa finora. Diamo un'occhiata un po' più lontano a questa analogia e cerchiamo i punti in cui parti organiche e bulloni si uniscono.

Presentiamo due liste della spesa, una per Joe e una per Mary.

marys-shopping.json
{"fruit": {
"apples": 2
}, "apples": 5 }

joes-shopping.json
{"fruit": {
"apples": 6,
"oranges": 1
} }

Ora con la mia estensione SQL / JSON "immaginaria", faccio:

SELECT apples
FROM LISTS

Cosa restituisce? Ricordi, RowSet entra, RowSet esce?

2, 5
---
6

Pertanto, anche se richiedi esplicitamente un elenco di numeri di mela, ottieni due serie di righe anziché tre e una delle serie di righe avrà un elenco di numeri. Se invece scegli di restituire tre cose, otterrai due set RowSet e tre set RowSet. Non sono un matematico, ma non suona bene.

Ancora una volta, non è un problema se utilizzi qualcosa che potrebbe gestire informazioni non strutturate. Non hai questo problema in javascript e, naturalmente, non sarà in XQuery. Sia in javascript che in XQuery è tutto organico.

Conclusione:linguaggi straordinari per dati non strutturati, unicorni e polvere di folletti!

Sebbene XQuery sia un eccellente linguaggio per informazioni non strutturate, il mio punto di vista qui non ne protegge l'uso. Il punto che sto cercando di sottolineare è la necessità di un vero linguaggio per i dati non strutturati, indipendentemente da come (leggi:sviluppatori) lo scegli.

Ma chiedo a voi (gli sviluppatori) di non riprendervi lo "zoppo SQL". Se n'è andata e tu hai un nuovo appuntamento caldo chiamato NoSQL. Dagli un po' di tempo e crescerà su di te. È anche molto divertente scrivere codice JavaScript che funzioni nei database:non lasciare che te lo portino via.

SQL per dati non strutturati avrà esito negativo. Quindi PL-SQL per dati non strutturati fallirà. Quindi se il venditore insiste su ciò di cui hai bisogno, non accettare niente di meno che un linguaggio di programmazione completo:puoi scrivere la tua applicazione completa in javascript e salvarla in CouchApp, oppure puoi scrivere la tua applicazione completa in XQuery e salvarla in MarkLogic . E così dovrebbe essere!

Ecco un elenco di controllo di cosa cercare nel linguaggio di query per informazioni non strutturate:

  • La lingua di navigazione
  • Modello di dati
  • Espressioni normali
  • Lambda
  • Funzioni di alto livello
  • Fragranza funzionale
  • Buona elaborazione della linea
  • Moduli per creare le tue librerie
  • Il server delle applicazioni è a conoscenza:ha funzioni che servono REST

Potresti ignorare questo consiglio, ma alla fine potresti sentirti frustrato dallo sviluppatore Silverlight. E noi, i ragazzi a cui piace innovare nei database, saremo delusi dal fatto che gli sviluppatori abbiano deciso di tornare indietro!

Spiegazione SQL vs NoSQL