Esiste sicuramente un'impedenza relazionale dell'oggetto. Ho dovuto occuparmene per anni su un prodotto che teneva i suoi dati su un database ma era OO quando funzionava.
Come esempio ampiamente semplificato, prendi in considerazione tre tabelle DB. Due sono solo elenchi, uno contenente persone e uno contenente lavori . Il terzo è un collegamento tra persone e lavori , con una colonna per ciascuno. (E tutti e tre hanno un sacco di colonne per molti dati sussidiari.)
Nell'interfaccia utente, un utente desidera esaminare i dati in termini di lavoro e le persone che ci lavorano. Uno sguardo al DB, se è grande, sarà inutile: troppe informazioni disorganizzate. Ma nell'interfaccia utente, un oggetto lavoro può fungere da base per una buona visualizzazione. Anche se l'utente ha una lista di un milione di lavori, può scorrere fino a quello che vuole e vedere tutte le informazioni rilevanti: chi ci sta lavorando e quando e quanto e con quali abilità, ecc.
Quindi sul DB ci sono 3 tabelle. Nel programma OO, hai oggetti job , persone e i loro collegamenti. Gli elenchi lavori e persone si riferiscono direttamente alle tabelle DB, ma non esiste un elenco di collegamenti . I collegamenti fanno parte o, in ogni caso, sono legati agli oggetti lavoro . Per creare una tabella di collegamento dai dati OO, devi lavorare attraverso tutti i lavori. Per creare un oggetto lavori appropriato, devi leggere la tabella dei link e fare qualche riorganizzazione dei dati.
Questa è l'essenza dell'impedenza. Questo esempio è semplice per essere facilmente compreso, ma sottovaluta drasticamente la difficoltà nel mondo reale di tradurre tra i due concetti.
OO è molto più veloce. È più facile usare una volta che è stato impostato . Tuttavia, forza una certa organizzazione sui dati. Se questa organizzazione non è fatta bene, o non è adeguata, ci possono essere problemi. Ad esempio, nel mio esempio l'oggetto chiave è il lavoro . Se vuoi sapere che lavoro sta facendo un individuo, non va bene. In questo esempio semplice , è ovvio che ci deve essere un oggetto persone che contenga tutto il lavoro che una persona sta facendo, ma in un sistema reale il numero di strutture possibili si avvicinerà all'infinito; devi scegliere di fare quel numero limitato che permetterà al programma di il suo lavoro.
Tornei OO quando l'aspetto di accesso casuale della memoria diventa lento. OO dipende da molti collegamenti diretti tra i bit di dati. Come dovrebbe funzionare un grande database OO? Un Database di documenti ha più senso, ma dovrà essere davvero un OO DB o duplicare grandi quantità di dati: si noti che un oggetto lavoro include oggetti persone e quelli Gli oggetti persone includono l'oggetto lavoro .
I dati relazionali sono molto più lenti, ma senza pregiudizi. Un po 'di SQL e puoi guardare i dati come preferisci. L'altro, travolgente, il vantaggio che ha è che la memoria lenta, non casuale, che porterà l'OO ad una battuta d'arresto, non lo infastidisce. Quindi, se hai terrabyte di dati, vuoi che i tuoi dati siano memorizzati in relazione, non orientati agli oggetti.
Quindi penso che siamo bloccati con database relazionali e programmi orientati agli oggetti e stiamo facendo un sacco di giri per ottenere dati dall'uno all'altra e viceversa.
Inoltre: ho recentemente lavorato su un sistema che utilizza dati relazionali in memoria. È molto lento, ma non così lento da essere seriamente fastidioso (non è un gioco per computer!) E gli sviluppatori originali, mentre dovevano progettare un DB, hanno dovuto saltare preoccuparsi di un design OO. Ho considerato OO un po ', ma ciò significava molta programmazione rispetto alla scrittura solo un po' di fantasia SQL (LINQ, in realtà). Mi ha fatto capire che a volte le relazioni possono competere con OO sul proprio terreno.
Sottolinea inoltre che OO forza l'organizzazione sui dati. Se gli sviluppatori originali avessero saputo cosa dovevo fare e usato OO per farlo, il programma sarebbe stato eseguito più velocemente e avrei potuto modificarlo con molto meno sforzo. (SQL è complicato.) Ma se non lo avessero fatto, il modo in cui avevo bisogno di farlo, sarei stato esattamente dove ero ma senza il DB relazionale in memoria.
Riepilogo: OO e relazionale sono due cose diverse e la conversione tra di loro implica l'impedenza: è un dolore. Ognuno ha i suoi usi, e penso che spesso saremo bloccati usando entrambi.