Domanda

Un sacco di s "BAW" (grossi culi-siti web) utilizzano tecniche di archiviazione e recupero dei dati che si basano su enormi tabelle con gli indici, e l'utilizzo di query che non lo faranno / non possono utilizzare unisce a loro query (BigTable, HQL , ecc) per affrontare con i database scalabilità e sharding. Come funziona quando si hanno un sacco di dati che è molto correlati?

Posso solo ipotizzare che gran parte di questo unire deve essere fatto sul lato applicazione delle cose, ma non significa che iniziare a ottenere costosi? Che cosa succede se si deve fare diverse query a più tabelle diverse per ottenere informazioni per compilare? non è colpire il database che molte volte di partenza per ottenere più costoso che usare si unisce, in primo luogo? Immagino che dipende dalla quantità di dati che hai?

E per comunemente disponibili ORM, come si tende a fare con l'incapacità di usare si unisce? C'è il supporto per questo nella ORM che si trovano in un utilizzo intenso di oggi? O fanno la maggior parte dei progetti che hanno per avvicinarsi a questo livello di dati tendono a rotolare loro comunque?

Quindi questo non è applicabile a qualsiasi progetto in corso che sto facendo, ma è qualcosa che è stato in testa per diversi mesi ora che posso solo speculare su ciò che le "buone pratiche" sono. Non ho mai avuto la necessità di affrontare questo in nessuno dei miei progetti, perché non hanno mai raggiunto una scala in cui esso è necessario. Speriamo che questa domanda aiuta altre persone come pure ..

Come qualcuno ha detto di seguito, ORM "non funzionano" senza unisce. Ci sono altri livelli di accesso ai dati che sono già a disposizione degli sviluppatori che lavorano con i dati a questo livello?

Modifica Per alcuni chiarimenti, Vinko Vrsalovic ha detto:

  

"Credo ghigno si vuole parlare   merito NO-SQL, dati dove transazionale   viene denormalizzato e utilizzato in Hadoop o   BigTable o Cassandra schemi ".

Questo è davvero quello di cui sto parlando.

I punti di bonus per coloro che prendono il riferimento xkcd.

È stato utile?

Soluzione

Il modo in cui lo guardo, un database relazionale è uno strumento di uso generale per coprire le vostre scommesse. I computer moderni sono abbastanza veloce, e RDBMS' sono abbastanza che si può crescere a una dimensione di tutto rispetto su una singola scatola ben ottimizzato. Scegliendo un RDBMS lei si attribuisce l'accesso molto flessibile ai dati, e la possibilità di avere potenti vincoli di correttezza che lo rendono molto più facile da codice contro i dati. Tuttavia il RDBMS non sta andando a rappresentare una buona ottimizzazione per qualsiasi problema particolare, appena ti dà la flessibilità di cambiare facilmente i problemi.

Se si avvia in rapida crescita e rendersi conto che si sta andando ad avere per scalare al di là della dimensione di un singolo server DB, improvvisamente hanno scelte molto più difficile da fare. Avrete bisogno di iniziare ad individuare i colli di bottiglia e la loro rimozione. Il RDBMS sarà un brutto nodo ringhiò di codependency che dovrete prendere in giro a parte. Il più interconnesso i dati più lavoro che dovrete fare, ma forse non dovrà districarsi completamente il tutto. Se stai leggere-pesanti forse si può ottenere con la replica semplice. Se si sta saturando il mercato e la crescita si mantiene stabile forse si può parzialmente denormalizzare e frammento al numero fisso di DB server. Forse basta una manciata di tavoli problematiche che possono essere spostati in un archivio dati più scalabile. Forse il tuo profilo di utilizzo è molto gentile nella cache e si può solo eseguire la migrazione del carico da un cluster memcached gigante.

Dove scalabili negozi chiave-valore come BigTable sono disponibili in è quando nessuno dei precedenti può funzionare, e si dispone di così tanti dati di un solo tipo, che anche quando è denormalizzato una singola tabella è troppo per un solo server. A questo punto è necessario essere in grado di partizionare arbitrariamente e hanno ancora un'API pulito per accedervi. Naturalmente, quando i dati sono sparsi in tutta tante macchine non si può avere algoritmi che richiedono queste macchine a parlare tra di loro tanto, che molti degli algoritmi relazionale standard richiederebbe. Come lei suggerisce, questi algoritmi che interrogano distribuiti hanno il potenziale per richiedere più potenza di elaborazione totale che l'equivalente di registrazione in un database relazionale correttamente indicizzato, ma perché sono parallelizzati le prestazioni in tempo reale sono ordini di grandezza meglio di qualsiasi singola macchina potrebbe fare (supponendo una macchina in grado di contenere l'intero indice anche disponibile).

Ora, una volta è possibile scalare i vostri dati di massa impostati in orizzontale (semplicemente collegando più server), la parte più difficile di scalabilità è fatto. Beh, non dovrei dire Fine , in quanto le operazioni in corso e lo sviluppo di questa scala sono molto più difficile di quanto l'applicazione server singolo, ma il punto è application server sono in genere banali in scala tramite una quota-nothing architettura fintanto che possono ottenere i dati di cui hanno bisogno in modo tempestivo.

Per rispondere alla tua domanda su come ORM comunemente usati gestire l'impossibilità di utilizzare JOIN, la risposta breve è che non . ORM acronimo di Object Relational Mapping, e la maggior parte del lavoro di un ORM è solo traducendo il potente paradigma relazionale di semplici strutture di dati object-oriented logica dei predicati. La maggior parte del valore di ciò che ti danno non è semplicemente andando ad essere possibile da un negozio di valori-chiave. In pratica si avrà probabilmente bisogno di costruire e mantenere il proprio livello di accesso ai dati che è adatto alle vostre esigenze particolari, perché i profili dati a queste scale stanno andando a variare notevolmente e credo che ci sono troppi compromessi per uno strumento general purpose ad emergere e diventare dominante il modo RDBMS hanno. In breve, avrete sempre a fare di più noia a questa scala.

Detto questo, sarà sicuramente interessante vedere che tipo di funzionalità di aggregazione relazionale o altro può essere costruito sulla parte superiore del negozio primitive chiave-valore. Io in realtà non ho abbastanza esperienza qui per commentare nello specifico, ma c'è un sacco di conoscenze in azienda computing su questo corso molti anni fa (ad es. Oracle), un sacco di conoscenze teoriche non sfruttato nel mondo accademico, un sacco di conoscenze pratiche di Google, Amazon, Facebook, et al, ma la consapevolezza che ha filtrato fuori nella comunità di sviluppo più ampia è ancora piuttosto limitata.

Tuttavia, ora che un sacco di applicazioni si stanno muovendo per il web, e sempre più della popolazione mondiale è in linea, inevitabilmente sempre più applicazioni dovranno scalare, e le migliori pratiche inizieranno a cristallizzarsi. Il gap di conoscenza sarà whittled giù da entrambi i lati da servizi cloud come AppEngine e EC2, così come i database open source come Cassandra. In un certo senso questo va di pari passo con il calcolo parallelo e asincrona che è anche nella sua infanzia. Sicuramente un tempo affascinante per essere un programmatore.

Altri suggerimenti

Si sta partendo da un presupposto errato.

Data warehousing non normalizzare i dati nello stesso modo che un'applicazione di transazione normalizza. Non ci sono "un sacco" di join. Ci sono relativamente pochi.

In particolare secondo e terzo violazioni forma normale non sono un "problema", dal momento che i data warehouse sono raramente aggiornati. E quando vengono aggiornati, è in genere solo un cambiamento di stato di bandiera per fare una dimensione righe come "corrente" contro "non corrente".

Dal momento che non dovete preoccuparvi di aggiornamenti, non si decompongono le cose fino al livello 2NF in cui un aggiornamento non può portare a rapporti anomali. Nessun aggiornamento significa anomalie; e non si decompone e non si unisce. È possibile pre-iscriversi tutto.

In generale, i dati DW è decomposto secondo uno schema a stella. Questa guida di scomporre i dati nelle tabelle numerici "fatto" che contengono le misure - numeri con unità -. E riferimenti chiave esterna alla dimensione

Una dimensione (o "entità di business") è meglio pensato come una cosa del mondo reale con gli attributi. Spesso, questo include cose come la geografia, il tempo, prodotto, cliente, ecc Queste cose hanno spesso complesse gerarchie. Le gerarchie sono di solito arbitrari, definito da diverse esigenze di reporting di business, e non modellato come tabelle separate, ma semplicemente le colonne nella dimensione utilizzato per l'aggregazione.


Per affrontare alcune delle vostre domande.

"questo unendo deve essere fatto sul lato applicazione delle cose". Tipo. Il dato è "pre-uniti" prima di essere caricati. La Dimension Data è spesso un join dei dati sorgente rilevanti circa quella dimensione. E abbinato e caricato come una struttura relativamente piatta.

E non è aggiornato. Invece di aggiornamenti, vengono inseriti documenti storici aggiuntivi.

"ma non fa che iniziare a ottenere costosi?". Tipo. Ci vuole una certa cura per ottenere i dati caricati. Tuttavia, non ci sono un sacco di reporting / analisi si unisce. I dati sono pre-unito.

Le questioni ORM sono in gran parte discutibile dal momento che i dati sono pre-unito. Il tuo ORM mappe al fatto e dimensione a seconda dei casi. Salvo casi particolari, dimensioni tendono ad essere piccole-ish e si adattano completamente nella memoria. L'eccezione è quando sei in Finanza (bancaria o assicurativa) o Public Utilities e hanno enormi database dei clienti. Questi dimensione cliente misura raramente in memoria.

Un JOIN è un termine relazionale puro e non tutti i database sono relazionali.

Altri modelli di database hanno altri modi per costruire relazioni.

database di rete utilizzano le catene infinite di find a key - fetch the reference - find a key che devono essere programmati con un linguaggio di programmazione comune.

Il codice può essere eseguito sul lato applicazione o sul lato server, ma non è SQL e nemmeno turni set.

Se progettato correttamente, un database di rete può bу molto più veloce di uno relazionale.

Per esempio, un database di rete in grado di memorizzare un riferimento a un'altra entità come un puntatore diretto a un offset in un file o addirittura un blocco su un disco in cui sono memorizzate le informazioni su questa entità.

Questo rende l'attraversamento delle reti più veloci -. Se hai scritto un codice efficiente per farlo

Un database relazionale può solo riferimenti deposito come coppie di valori di base come numeri interi (o triple o tuple di ordine superiore).

Per trovare quei valori nel database relazionale motore dovrebbe fare le seguenti cose:

  • Scopri dove la tupla contenente risiede il primo valore
  • Trova il secondo valore
  • Trova l'indirizzo della radice in un B-Tree contenente i dati del secondo numero si riferisce a
  • Traverse questo albero
  • Trova il puntatore alla tabella effettiva (che può essere memorizzato come un B-Tree stessa, nel qual caso il puntatore è il valore della PRIMARY KEY della fila che cerchiamo)
  • Trova riga della tabella da parte del puntatore o attraversare la tabella
  • Infine, ottenere il risultato.

E si può controllare questo solo in una certa misura. Dopo che, basta emettere la query SQL e aspettare.

Modello relazionale fatto per semplificare la vita dello sviluppatore, non per ottenere la super velocità sempre e non importa cosa.

Questo è lo stesso assemblaggio vs. linguaggi ad alto livello, modello relazionale essendo un linguaggio ad alto livello.

Si consiglia di leggere l'articolo nel mio blog

, in cui cerco di spiegare le differenze tra i vari modelli di database di uso comune.

Quando si denormalise i dati in questo modo, lo si fa per evitare il costo di unire elementi disparati; si accetta che alcuni dati possono essere duplicati e che certi modi di combinare può essere difficile, per il miglioramento delle prestazioni di utilizzo di query semplici.

Se hai a che fare qualsiasi grande quantità di unirsi a livello di applicazione, ciò implica che non si è denormalizzato abbastanza.

Idealmente, sarete in grado di fare una query per qualsiasi insieme di dati che si desidera. In pratica, non si dovrebbe usare più di due o tre query per qualsiasi aspetto della vostra applicazione, e di qualsiasi livello di applicazione unendo sarà più di un recupero banale di roba dai gruppi di risultati separati per l'inserimento nella vista.

Questo genere di cose è veramente solo necessario per i set di dati veramente enormi, e ci sono tutti i tipi di compromessi coinvolti. Per fare solo un esempio: BigTable non può fare query di aggregazione, come ad esempio dando un conteggio. Può essere usato per darvi una cifra che è più o meno precisa -, nel senso che se si hanno, per esempio, 12,149,173 record di cui 23.721 sono stati aggiunti nelle ultime ore, in realtà non importa se il meglio che si può scoprire è che si dispone di "circa 12.100.000 record". Se l'applicazione dipende dal conoscere la cifra esatta in ogni momento, allora non dovrebbe usare BigTable per esso, è l'atteggiamento generale.

Le applicazioni come Facebook hanno pochissime modifiche dei dati, il più delle volte gli utenti postando nuovi elementi. Quindi il fatto che i documenti si moltiplicano devono essere aggiornate quando un elemento è cambiato è un problema minore.

  

In questo modo permette i dati non siano   normalizzata senza colpire comune   problemi con gli aggiornamenti.

Applicazioni come Amazon può permettersi di caricare tutti i dati per un singolo utente nella RAM (quanto è grande un carrello della spesa, dopo tutto?), Quindi aggiornare i dati nella RAM e scrivere fuori come un unico elemento di dati.

  

Ancora una volta eliminando la necessità di avere   maggior parte dei dati normalizzati.

sono negoziazione di scala per la facilità di sviluppo delle applicazioni, quindi se non avete bisogno di scalare a grandi altezze si potrebbe desiderare di mantenere la facilità di sviluppo di applicazioni che forniscono RDBMS.

Credo che in queste situazioni che si sta per essere più o meno da soli e si sta per avere a rotolare tutto da soli. Io non ci sono stato ma ho considerato per alcuni dei nostri progetti. È possibile ottenere abbastanza grande con DB relazionali (come dimostra SO) cercherò quindi di continuare a godere della bontà relazionale per ora.

In generale, data warehousing è costruito intorno utilizzando unisce e dati divisi in dimensioni e tabelle dei fatti (con i cosiddetti "schemi a stella", ecc)

I join spesso essere pre-calcolati e memorizzati come tabelle de-normalizzati.

Io non sono a conoscenza di strumenti ORM che lavorano con sistemi di database che non permettono unisce, in quanto questi non sono generalmente visti come database relazionali tradizionali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top