Domanda

Perché sono i database relazionali più comuni di database orientati agli oggetti?

Se il paradigma Object Oriented Programming è così diffusa, non dovremmo vedere un sacco di OODBMS? Non sarebbero risultati migliori rispetto alla RDBMS + OR / M?

È stato utile?

Soluzione

Uno dei motivi che RDBMS ha mantenuto popolarità è che è una tecnologia consolidata, ben compresa e ha un linguaggio standard (SQL) che più fornitori supportano. Essa ha anche un paio di buone interfacce come ODBC e JDBC che rendono connettersi con diversi linguaggi abbastanza bene. Un API stabile è un forte fattore nel mantenere una tecnologia dominante.

Al contrario, non esiste un modello chiaro per OODBMS, né v'è un linguaggio standard, né v'è un'API standard. Non c'è nemmeno uno standard de facto per avere un'implementazione dei principali vendor.

Il concetto OODBMS potrebbe un rendimento migliore rispetto RDBMS + ORM. Essa dipende interamente l'attuazione. Ma è anche vero che OODBMS non risolvono lo stesso insieme di problemi che RDBMS sono bravi a risolvere. Alcune attività di gestione dei dati sono molto più facile se si dispone di integrità referenziale e le intestazioni relazionali imposti dalla soluzione di gestione dei dati. Queste caratteristiche sono assenti nel modello OODBMS (almeno finora).

C'è un sacco di rumore sui blog che i database relazionali sono obsoleti, ma RDBMS sono comunque la migliore soluzione general-purpose per la grande maggioranza delle attività di gestione dei dati.

Altri suggerimenti

Il problema più grande che ho visto è la mancanza di standardizzazione. Nel mondo RDBMS, è possibile ottenere abbastanza lontano con qualsiasi database casuale se si sa SQL. Si tratta fondamentalmente tutti attuarlo, con lievi variazioni. Non conosco un solo RDBMS esistente che non fa SQL:. Si può quasi usare "RDBMS" e "SQL" in modo intercambiabile

La cosa più vicina a un OODBMS è forse OQL, che è stato un totale fallimento.

Nessun database ha mai implementato molto di esso. Ho usato un bel bel OODBMS commerciale un paio di anni fa, ma (a partire dal 2007 o giù di lì, ed è stato il principale versione 8 o 9) non ha nemmeno fare interrogazioni per un oggetto con il suo nome. Il manuale ha detto semplicemente che questa parte del OQL non avevano ancora ottenuto intorno ad. (Non sono sicuro, ma potrebbe essere stato in grado di cadere giù in una chiamata nativo per farlo.)

La maggior parte dei database degli oggetti che ho visto di recente hanno interfacce madrelingua, piuttosto che un linguaggio di query come OQL. Il sistema che ho usato, per esempio, supportata (solo!) Perl e VB, IIRC. Limitare il pubblico a solo un paio di lingue (o costringendoli a scrivere wrapper, come abbiamo fatto noi) non è il modo per vincere amici.

A causa di questo, non c'è concorrenza, e quindi non piano di backup facile. Se si mettono i dati in MS-SQL e Microsoft smesso di sostenere che, probabilmente si può scaricare i dati in Postgres e la porta le vostre domande, senza troppi problemi. (Potrebbe essere un sacco di lavoro, se hai un sacco di domande, ma io non dubito che si possa fare è. È un dolore, ma non tecnicamente impegnativo.) O Oracle o MySQL, o molti altri, sia commerciali e gratuito.

Una cosa simile esiste con un OODBMS: se quello che si sta utilizzando va a pancia in su, o se la prendono in una direzione che non è utile a voi, o si trova manca una caratteristica fondamentale è necessario, si puo' t appena discarica i dati in un OODBMS concorrenti e porta le vostre domande. Invece, si sta parlando di cambiare una libreria di base e di apportare modifiche di architettura di massa. Così realisticamente, si è limitato ad un OODBMS commerciali chi sei veramente fiducia (si può nominare anche uno solo?), O di un open-source OODBMS cui ti fidi la tua squadra da mantenere quando le cose vanno male.

Se questo suona come FUD, mi dispiace, non mi intendo questo. Ma io ci sono stato, e dal punto di vista di gestione del progetto che avrei esitato a tornare indietro, anche se l'ambiente di programmazione può essere meraviglioso. Un altro modo di pensare che è: sguardo a programmazione funzionale come popolare è oggi, nonostante quello che una buona idea è. OODBMS sono così, ma peggio, dal momento che non è solo il codice, ma il codice e dati. Mi piacerebbe molto iniziare un importante progetto in Erlang oggi, ma mi piacerebbe ancora esitato a usare un OODBMS.

OODBMS fornitori: per cambiare questo, devi rendono facile lasciare voi per i vostri concorrenti . Si potrebbe scavare OQL ed effettivamente attuare tale, o farlo a livello di API come ODBC, o qualsiasi altra cosa. Anche un formato discarica standard (utilizzando JSON?), E gli strumenti per l'importazione / esportazione in / da quello per diversi OODBMSs, sarebbe un ottimo inizio.

I dati spesso vive più a lungo ed è più importante del programma. Quindi, anche se si avvia uno sviluppo greenfield oggi è necessario considerare il quadro generale. Ci sono più strumenti, processi e persone con esperienza che lavorano con sistemi RDBM. Pensare al di là del programma, come circa la pianificazione della capacità, data mining, reporting, ETL, l'integrazione con altre fonti di dati, ecc Come circa la vostra azienda di un'altra società e portando tutti i loro dati relazionali nel programma in tal modo. RDBMS e strumenti associati sono così radicate, collaudato e potente che faccio non c'è alcun senso strategico nell'uso di qualsiasi altra cosa. In qualche piccola nicchia forse, ma non in generale.

database degli oggetti hanno una bella nicchia per problemi come rappresentare la geometria per esempio sistemi CAD, dove oggetti grafici possono essere effettivamente molto profonda. ISCRIVITI prestazioni degrada rapidamente per circa 7 tavoli nella maggior parte dei sistemi relazionali, in modo da strutture profondamente autoreferenziali in CAD rendimento migliore nei database degli oggetti.

ma le applicazioni importanti come i dati finanziari si prestano ad una rappresentazione relazionale. Il modello relazionale ha una base matematica ferma, e SQL è un linguaggio popolare e di successo. Non v'è uno scarso incentivo per le istituzioni finanziarie come banche, broker e compagnie di assicurazione per passare lontano da RDBMS.

Per esempi OODBs e RDB trival possono essere molto diverse. Soprattutto se si sta lavorando con una piccola quantità sufficiente di dati che è possibile banalmente leggerlo tutto in memoria in una sola volta e scrivere fuori tutto in una volta. Ma alla fine il bisogno di OODB per salvare i dati in un formato molto RDB-simile -. Non sono così diversi

Si consideri un grafo arbitrario di oggetti come potrebbe essere utilizzato in un'applicazione. Ogni oggetto può essere indicata da diversi altri oggetti. Quando si salva un grafo di oggetti, non si vuole salvare gli oggetti più volte ogni volta che si fa riferimento. Per prima cosa, se si ha alcun tipo di loop o autoreferenzialità tuo metodo save-oggetto sta per andare in un ciclo infinito. Ma nel caso generale, si tratta di uno spreco di spazio. Invece, qualsiasi archivio dati significativi ha bisogno di dichiarare un identificatore univoco per ogni oggetto che viene memorizzato (una chiave, di solito una chiave surrogata in termini RDBMS). Ogni altro oggetto che fa riferimento salva il tipo di oggetto e la chiave, non salva l'intero oggetto più volte. Quindi qui abbiamo ricreato chiavi esterne nel nostro non RDB oggetto-store.

Avanti, finta che vogliamo memorizzare un elenco di oggetti (A1, A2, A3 ...) che sono legati a un altro oggetto (B). Abbiamo già stabilito che saremo memorizzare le chiavi invece di salvare gli oggetti stessi due volte. Ma si fa a memorizzare le chiavi di oggetti A1, A2, A3 ... su oggetto B, o non si memorizza la chiave di opporsi B su A? Se si memorizzarli il primo modo, e hai tutto la A che si desidera, si può rapidamente prendere il relativo B. Il secondo modo è vero il contrario. Ma in entrambi i casi è un affare a senso unico. Se si desidera eseguire una query il contrario di ciò che è stato salvato e gli oggetti vengono memorizzati come XML o JSON, che è un sacco di analisi inefficiente con la maggior parte informazioni irrilevanti per trovare la chiave in ogni file. Non sarebbe meglio per memorizzarli in un formato in cui ogni campo è stato separato, come colonne di una tabella?

In una relazione molti-a-molti, o di un caso in cui è necessario trovare un gran numero di oggetti in entrambe le direzioni, questa strategia diventa molto inefficiente. L'unica soluzione performante è quello di rendere un oggetto helper per memorizzare il rapporto, con un file per ogni rapporto in modo che il file è costituito della chiave di A e il tasto di B in modo che possano essere consultati velocemente. Abbiamo appena reinventato la tabella di riferimento incrociato.

Tabelle con colonne, identificatori univoci (chiavi), tabelle di correlazione incrociata ... Queste sono le esigenze di base per la memorizzazione di oggetti in un modo che essi possono essere recuperati in modo efficiente. Hmm ... Suona come niente familiare? Un database relazionale fornisce esattamente questa funzionalità. Inoltre, più fornitori hanno gareggiato per decenni per fornire il più veloce di archiviazione e recupero dei dati con i migliori strumenti per il backup, la replica, clustering, l'interrogazione, ecc Questo è molto per una nuova tecnologia per competere con. E alla fine io sto dicendo che RDBMS sono fondamentalmente una buona soluzione al problema dello stoccaggio oggetto efficiente.

Questo è il motivo per cui esiste qualcosa come Hibernate - di mettere un'interfaccia orientata agli oggetti su un sistema di storage RDBMS efficiente. Dove vedete altri tipi di stoccaggio davvero brillare sono diverse aree problematiche:

  • Per qualsiasi tipo di archiviazione non strutturato di documenti (blog, controllo del codice sorgente, o qualsiasi cosa che non può mappare a righe e colonne), diversi database NoSQL sono ideali
  • Mantenere una storia facile da interrogare ancora significativa delle modifiche (come diff in controllo del codice sorgente) non è davvero carina in RDB. Qualcosa di simile può essere Datomic forgiando un nuovo territorio qui.
  • Ogni volta che il vostro oggetto grafico è semplice o piccolo, il sovraccarico di un database può non essere necessario.

OODBs non può eseguire meglio di RDB, perché non sono fondamentalmente diversi.
RDB sono qui per restare perché risparmiando grandi grafici di oggetti in un modo che è spazio-efficiente e in tempi rapidi sia per il salvataggio e recupero, e anche fault tolerant e ha una certa garanzia dei datintegrity è il problema che RDB sono stati progettati per risolvere in primo luogo. Questo è il motivo JPA e Hibernate sono qui per rimanere così - perché colmano il divario tra l'oggetto e modelli relazionali di dati. modello di oggetti per facilità di manipolazione in memoria, e per la persistenza relazionale.

In una parola Interoperabilità (parola grossa in una notte di Venerdì )

La maggior parte delle imprese devono lavorare con i sistemi legacy in esecuzione su RDBMS. Se dovessero usare OODBMS, avrebbero ancora bisogno di accedere ai RDBMS per determinate funzioni. E 'più facile mantenere un modo di accesso ai dati di due.

Quando si dispone di grandi nomi come Oracle e SQL Server nel mondo OODBMS e comprovata prestazioni in una varietà di ambienti, poi vedrete più progetti che li utilizzano.

Credo che sia un caso di

  

Se non è rotto non cambiarlo.

I database relazionali sono estremamente radicata.

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