20

Al lavoro, abbiamo recentemente avviato un progetto utilizzando CouchDB (un database orientato ai documenti). Ho avuto difficoltà a non imparare tutta la mia conoscenza db relazionale.Come smettere di pensare "relazionalmente"

Mi chiedevo come alcuni di voi hanno superato questo ostacolo? Come hai smesso di pensare in termini relazionali e di iniziare a pensare in modo documentale (mi scuso per aver inventato quella parola).

Qualche suggerimento? Suggerimenti utili?

Modifica: Se fa alcuna differenza, stiamo utilizzando Ruby & CouchPotato per connettersi al database.

Modifica 2: SO mi ha importunato di accettare una risposta. Ho scelto quello che mi ha aiutato a imparare di più, penso. Tuttavia, non c'è una vera risposta "corretta", suppongo.

+5

È improbabile che tu abbia mai imparato la conoscenza del DB relazionale. È uno di quegli argomenti che ha un sacco di disinformazione su ciò che viene passato come legittimo. Hai mai letto un libro di Chris Date? se lo avessi, probabilmente non staresti cercando di usare CouchDB. Lo sapresti meglio – Breton

+0

Detto questo, immagina di avere una singola tabella chiamata "documenti" con tutte le colonne generate automaticamente di cui hai bisogno, e penso che tu abbia una buona approssimazione di cosa si tratta: un DB specifico del dominio (blog Think) – Breton

+0

@Brenton - Ehi, ehi! Ottieni i tuoi dati corretti. Questo è C J Date to you. :) –

risposta

12

Credo che, dopo aver accuratamente circa su un paio di pagine su questo argomento, tutto dipende il tipo di dati che si sta trattando.

RDBMS rappresentano un approccio top-down, dove, lo sviluppatore del database, affermi la struttura di tutti i dati che esisteranno nel database. Si definisce che una persona ha un primo, ultimo, secondo nome e un indirizzo di casa, ecc. È possibile far rispettare questo utilizzando un RDBMS. Se non hai una colonna per l'HomePlanet di Person, vuoi essere la persona che ha un diverso HomePlanet rispetto alla Terra; dovrai aggiungere una colonna in una data successiva o i dati non possono essere memorizzati nell'RDBMS. La maggior parte dei programmatori fa comunque ipotesi come questa nelle loro app, quindi questa non è una cosa stupida da assumere e far rispettare. Definire le cose può essere buono. Ma se è necessario registrare ulteriori attributi in futuro, sarà necessario aggiungerli. Il modello di relazione presuppone che gli attributi dei dati non cambieranno molto.

banche dati di tipo "cloud" usando qualcosa come MapReduce, nel tuo caso CouchDB, non fanno l'ipotesi di cui sopra, e invece guardano i dati dal basso verso l'alto. I dati sono inseriti nei documenti, che potrebbero avere un numero qualsiasi di attributi variabili. Presume che i tuoi dati, per la sua stessa definizione, siano diversi nei tipi di attributi che potrebbe avere. Si dice, "so solo che ho questo documento Persona database che dispone di un attributo homeplanet di 'Eternium' e un FirstName di 'Signore Nibbler' ma no Cognome." Questo modello si adatta le pagine web: tutte le pagine web sono un documento, ma il contenuto/tags/chiavi effettivi del documento variano ampiamente soo che non è possibile inserirsi nella struttura rigida che il DBMS pontifica upon alta. Questo è il motivo per cui Google pensa che i modelli di MapReduce siano più sassosi, perché il set di dati di Google è così vario da dover creare ambiguità fin dall'inizio e, grazie ai massivi set di dati, è possibile utilizzare l'elaborazione parallela (che MapReduce rende banale) . Il modello del database del documento presuppone che gli attributi dei tuoi dati possano cambiare molto o essere molto diversi con "lacune" e molte colonne scarsamente popolate che si potrebbero trovare se i dati sono stati archiviati in un database relazionale. Mentre è possibile utilizzare un RDBMS per archiviare dati come questo, diventerebbe brutto molto velocemente.

Per rispondere alla tua domanda, allora: non si può pensare "relazionale" a tutti quando guardando un database che utilizza il paradigma MapReduce. Perché, in realtà, non ha una relazione forzata. È una gobba concettuale che dovrai solo superare.


Un buon articolo mi sono imbattuto in che confronta e contrappone i due database abbastanza bene è MapReduce: A Major Step Back, che sostiene che i database paradigma MapReduce sono un passo tecnologico all'indietro, e sono inferiori a RDBMS. Non sono d'accordo con la tesi dell'autore e vorrei dire che il progettista del database dovrebbe semplicemente selezionare quello giusto per la sua situazione.

+2

Un sacco di critiche che l'articolo indirizza verso i database basati su MapReduce sembrano essere affrontati in CouchDB. CouchDB utilizza gli indici B-tree, supporta le viste (infatti, CouchDB sembra avere maggiore enfasi sulle visualizzazioni rispetto a MySQL), consente aggiornamenti, rende facile la replica, ecc. – Chuck

+0

@Chuck: ha più enfasi sulle viste perché ci sono nessuna domanda, solo visualizzazioni. –

2

può essere si dovrebbe leggere questo http://books.couchdb.org/relax/getting-started

io stesso appena sentito ed è interessante, ma non hanno idea di come implementato che nell'applicazione mondo reale;)

+0

dopo aver letto quell'articolo ho scoperto che ogni dato è un documento. non ha relazioni come i dettagli principali ... ogni dato è un documento indipendente. ad esempio un post sul blog contiene tag, contenuti, autore e commenti. nel database delle relazioni definiamo alcune tabelle come tag, post, commenti e autori e ogni tabella correlata tra loro. i post hanno molti tag. gli autori hanno molti post ecc. in couchdb .. non hai post, tag ecc. tutto in uno. cmmiiw – nightingale2k1

1

Una cosa si può provare è ottenere una copia di firefox e firebug e giocare con la mappa e ridurre le funzioni in javascript. sono in realtà piuttosto fresco e divertente, e sembrano essere la base di come fare le cose in CouchDB

ecco piccolo articolo di Joel sul tema: http://www.joelonsoftware.com/items/2006/08/01.html

+0

Penso che Joel parli di chiusura (in termini groovy) o blocchi (in ruby). non ha nulla a che fare con couchDB – nightingale2k1

+2

Quindi penso che tu abbia un caso molto grosso di sindrome da TLDR. L'articolo parla di Map/Reduce – Breton

+0

Che penso, troverete che è * molto * rilevante. – Breton

9

E 'tutta una questione di dati. Se si dispone di dati che hanno più senso in relazione, un archivio di documenti potrebbe non essere utile. Un tipico sistema basato su documenti è un server di ricerca, si dispone di un enorme set di dati e si desidera trovare un articolo/documento specifico, il documento è statico o versione.

In una situazione di tipo di archivio, i documenti potrebbero essere letteralmente documenti, che non cambiano e hanno strutture molto flessibili. Non ha senso archiviare i loro metadati in un database relazionale, dato che sono tutti molto diversi e quindi pochissimi documenti potrebbero condividerli. I sistemi basati su documenti non memorizzano valori nulli.

I dati non relazionali/documentali hanno senso quando denormalizzati. Non cambia molto o non ti importa tanto di coerenza.

Se il tuo caso d'uso si adatta bene a un modello relazionale, probabilmente non vale la pena di comprimerlo in un modello di documento.

Ecco un buon articolo su non relational databases.

Un altro modo di pensarci è che un documento è una riga. Tutto ciò che riguarda un documento è in quella riga ed è specifico per quel documento. Le righe sono facili da suddividere, quindi il ridimensionamento è più semplice.

5

In CouchDB, come Lotus Notes, non si dovrebbe pensare a un documento come analogo a una riga.

Invece, un documento è una relazione (tabella).

Ogni documento ha un numero di righe - i valori del campo:

ValueID(PK) Document ID(FK) Field Name  Field Value 
======================================================== 
92834756293 MyDocument  First Name  Richard 
92834756294 MyDocument  States Lived In TX 
92834756295 MyDocument  States Lived In KY 

ogni vista è una query incrociati che seleziona attraverso una massiccia UNION ALL di di ogni documento.

Quindi, è ancora relazionale, ma non nel senso più intuitivo, e non nel senso che conta di più: buone pratiche di gestione dei dati.

4

I database orientati ai documenti non rifiutano il concetto di relazioni, a volte lasciano che le applicazioni denotino i collegamenti (CouchDB) o abbiano anche un supporto diretto per le relazioni tra i documenti (MongoDB). La cosa più importante è che i DODB non hanno schemi. Negli archivi basati su tabelle questa proprietà può essere ottenuta con un overhead significativo (vedi risposta di richardtallent), ma qui è fatto in modo più efficiente. Quello che dovremmo davvero imparare quando passiamo da un RDBMS a un DODB è quello di dimenticare le tabelle e iniziare a pensare ai dati. Questo è quello che sheepsimulator chiama l'approccio "dal basso verso l'alto".È uno schema in continua evoluzione, non un letto di Procuste predefinito. Ovviamente questo non significa che gli schemi debbano essere completamente abbandonati in qualsiasi forma. La tua applicazione deve interpretare i dati, in qualche modo vincolare la sua forma - questo può essere fatto organizzando i documenti in collezioni, creando modelli con metodi di validazione - ma questo è ora il lavoro dell'applicazione.

Problemi correlati