Il mio team ha paura delle entità di database relazionali con relazioni di chiave esterna e non capisco perché


12

Sono relativamente appena uscito dal college, quindi la maggior parte della mia familiarità con i database relazionali proviene dal mio corso di database in cui tutto ciò che non è in BCNF o 3NF è una parodia. Certamente questa è un'estremità dell'estremo, ma la mia squadra al lavoro sembra davvero portarla all'estremità opposta.

Nei nostri schemi di microservizi db, le entità raramente hanno più di una singola tabella. Tutto ciò che normalmente si dovrebbe normalizzare in un'altra tabella viene archiviato in una colonna JSON. Se in seguito viene scoperto che è necessario eseguire una query su una delle proprietà di questo json, viene aggiunta una nuova colonna e i dati vengono archiviati in entrambe le posizioni (sì, in due colonne diverse nella stessa tabella).

In molti casi queste colonne JSON hanno sicuramente un vantaggio. Se non hai mai bisogno di fare una query su quei dati e se non devi mai apportare una modifica unilaterale a quei dati (che è qualcosa che ovviamente non puoi prevedere), non è una cattiva idea. Inoltre molti dei nostri servizi non vedono il server o sono ospitati su macchine con una quantità oscena di spazio su disco per ciò di cui avevano bisogno, quindi la duplicazione dei dati non è un grosso problema. (Anche se qualcosa che in genere vorrei evitare per filosofia)

Attualmente stiamo creando un servizio che corrisponda alle regole in base a una serie di condizioni di loro proprietà e quindi eseguirà una serie di azioni associate a tali regole quando le regole sono vere (ad es. Tutte le condizioni sono vere). Il mio team secondario che sta costruendo questo servizio più immediatamente ritiene che ci sia un sostanziale vantaggio nel normalizzare azioni e condizioni lontano dalle regole nello schema. Ovviamente queste tabelle mantengono relazioni di chiave esterna con l'id regola. Dal nostro punto di vista possiamo evitare la duplicazione dei dati sulle condizioni che ci consentono di assicurarci che vengano valutati una sola volta ed è facile trovare le condizioni e le regole di cui abbiamo bisogno quando ne abbiamo bisogno senza dover estrarre ogni singola regola ed eseguire le ricerche in memoria.

Parlando con uno dei nostri principali ingegneri oggi ha tentato di spingermi lontano da questo schema. Cercare di discutere in tutti i modi in cui non ne abbiamo realmente bisogno causerà problemi di prestazioni in futuro, facendo riferimento a un vecchio monolito che possediamo che è una parodia del design. Si riferiva a quello che stiamo facendo come "alla vecchia maniera" e ai tavoli piatti con json come "alla nuova maniera". Ha sostenuto che nei luoghi in cui voglio l'atomicità non ne abbiamo bisogno e che invece di interrogazioni dovremmo fare più cose in memoria. Questo è un principio progettuale che molti dei nostri servizi seguono ora. Non prevediamo che il volume dei nostri dati aumenterà in modo sostanziale, il che dovrebbe mantenere le nostre query rapide. Ciò che anticipiamo è molto tempo speso nella valutazione delle regole e nell'esecuzione di azioni.

Capisco che i database non relazionali siano diventati più popolari negli ultimi anni ma anche quando cerco attivamente informazioni sulle implicazioni in termini di prestazioni delle relazioni con le chiavi esterne, non vedo molte informazioni nel suo caso. Suppongo che potrebbero tendere a introdurre transazioni di grandi dimensioni che potrebbero causare problemi, ma sembra un problema indipendente dalla chiave esterna stessa.

È questa la mia ingenuità? O c'è davvero qualcosa che manca a me e al mio sotto-team? Non ho esplicitamente fornito informazioni dettagliate sul nostro problema perché non sto necessariamente cercando una soluzione a questo. Dato che questa è una tendenza comune nel nostro team più grande, sono davvero curioso di sapere se ci sono.


La risposta alla tua domanda nel titolo sarebbe "Hanno paura a causa del vecchio monolite nella tua compagnia". Ma il corpo della tua domanda sembra porre qualcosa di completamente diverso, vale a dire "Le chiavi esterne introducono problemi di prestazioni?"
Christian Hackl

2
Mi chiedo quale% di un RDBMS abbia incorporato il codice "app"
Caleth

Se l'approccio è buono o no dipende dal tipo di applicazione che stai costruendo, dalle sue esigenze e dalla direzione in cui va (requisiti, vincoli architettonici) - qualcosa che non possiamo davvero valutare qui. Per quanto riguarda NoSQL, l'intera questione riguardava il supporto della salabilità orizzontale massiccia e il riconoscimento che non tutte le applicazioni richiedono i rigorosi vincoli di RDBMS. Per saperne di più, usa le prime 3 risposte qui come punto di partenza (la seconda e la terza vanno più in profondità).
Filip Milovanović

2
Se posso offrire qualche consiglio non tecnico: attenualo un po '. Stai giudicando molto ("sì, in due colonne diverse nella stessa tabella", "parodia del design") sul lavoro in cui non hai avuto alcun coinvolgimento nelle decisioni di progettazione e lo fai da una posizione di minima esperienza nel mondo reale . Non posso dire che hai ragione o torto perché non ho visto il progetto, ma i sistemi tendono ad essere una serie di compromessi con il risultato che il prodotto finito è funzionale ma meno che concettualmente puro. Ciò diventerà più chiaro man mano che la tua carriera avanza e prendere quelle decisioni diventa parte del tuo lavoro.
Blrfl

@Blrfl Ottima posizione
Robbie Dee

Risposte:


8

La parola chiave qui per capire da dove proviene la tua squadra è "microservizi". Vale la pena leggere prima questo concetto, in particolare per le seguenti informazioni:

  • Come devono essere archiviati i dati?
  • Principi di progettazione?
  • Come sono progettati per adattarsi?

Come con qualsiasi modo relativamente nuovo di fare le cose (e 5-10 anni è relativamente nuovo quando si tratta di architettura software), scoprirai che gli ideali e la realtà sono un po 'diversi.

Uno degli ideali è che ogni microservizio dovrebbe avere il proprio archivio dati. NOTA: ho detto archivio dati, non database. Esistono casi in cui si desidera semplicemente un motore di ricerca, un archivio BLOB o una semplice memorizzazione nella cache anziché un normale database. A seconda di chi parli, quell'ideale potrebbe persino andare in un archivio dati per istanza di microservizio!

In conclusione, quando si parla di accesso a Internet, la sicurezza e la familiarità delle transazioni ACID (Atomicità, Coerenza, Isolamento e Durabilità) non si ridimensionano quando si hanno milioni di utenti su un database. Con l'avvento di NoSQL, il paradigma si è spostato maggiormente verso BASE (Fondamentalmente disponibile, Stato morbido, Eventuale coerenza). ( riferimento )

La modifica del PH di come gestisci i dati ha un impatto:

  • Le cose che il database ha usato per prendersi cura di te devono essere gestite nel codice ora
  • È più facile ridimensionare generando un numero maggiore di istanze di microservizi rispetto ad aggiungere risorse "infinite" a un server
  • Aumenta l'affidabilità al costo di una maggiore complessità

Non posso rispondere per i dettagli della tua squadra o per quanto intendono ottenere la soluzione, ma in genere non devi avere una soluzione completa o nulla. Non mi siedo qui e giudico se la squadra sta facendo le scelte giuste. Ti sto solo fornendo un po 'di contesto in modo che tu possa almeno capire da dove provengono.


+1 Roba fantastica: ci sono molte sottigliezze nei microservizi, questo significa che non si tratta solo di scambiare database.
Robbie Dee

@RobbieDee, d'accordo. C'è molta complessità in quel mondo, e non tutti sono d'accordo sui dettagli.
Berin Loritsch

Questa dovrebbe essere la risposta. Il fatto che ogni microservizio abbia un proprio archivio dati è davvero il fattore di differenziazione. Ciò comporta un grande cambiamento nelle esigenze e nelle soluzioni di archiviazione dei dati e un archivio di dati conforme ACID non è tanto un vantaggio come in passato.
Greg Burghardt

7
È una buona risposta e l'ho votata. Vorrei solo sottolineare che ciò che si definisce "scala Internet" si applica solo alla più grande delle società; per la stragrande maggioranza dei database e dei siti Web aziendali (direi il 95% di essi), i database SQL normalizzati "convenzionali" sono ancora perfettamente praticabili.
Robert Harvey

@RobertHarvey, sono d'accordo con tutto il cuore. Ho letto più articoli sui microservizi che specificano ciò di cui ho scritto. Nei nostri progetti utilizziamo un database SQL con normalizzazione e vincoli adeguati. Farebbe male al cuore del purista, ma la realtà è che la nostra base di utenti è piuttosto piccola (centinaia o utenti) e il database non è stato un problema di prestazioni per noi.
Berin Loritsch

3

OK, non essendo il principale ingegnere del progetto devi davvero seguire le sue indicazioni per questo progetto.

Ti incoraggio a lavorare attraverso la tua progettazione del sistema e prototiparlo a casa in modo da capire eventuali compromessi. Fallo per la tua educazione e menzionalo sul lavoro solo quando puoi dimostrare esempi di lavoro.

La mia esperienza è stata che si afferma che i vincoli causano un rallentamento delle prestazioni del database. E sì, lo sarà, devi controllare quei vincoli. Tuttavia, è un problema molto più grande quando il database è incoerente e questo ti farà scrivere SQL e più codice per compensare, spesso aumentando la complessità del sistema e rallentandolo.

3nf, se eseguito in modo appropriato, renderà il database più veloce perché può essere memorizzato nella cache un numero maggiore di esso poiché sono archiviati meno dati ridondanti. Tuttavia, nel lavoro corrente, potrebbe non esserci un set di dati abbastanza grande da vedere effettivamente la differenza di prestazioni tra un database normalizzato e uno non normalizzato.


+1 Ottima idea. E se i volumi sono troppo grandi per una macchina di sviluppo, un campione 1 in N può spesso fornire grandi intuizioni.
Robbie Dee

2

Penso che abbiano paura di ricreare la stessa vecchia "parodia" che c'era prima, piuttosto che la stessa integrità referenziale.

Ha sostenuto che nei luoghi in cui voglio l'atomicità non ne abbiamo bisogno ...

Se riesci a formulare un caso solido (noto anche come Requisito non funzionale) per la necessità di atomicità, allora avranno bisogno di un valido e solido controprogramma per evitare di fornirlo.

... invece di domande dovremmo fare più cose in memoria. Questo è un principio di progettazione ... Non prevediamo che il volume dei nostri dati crescerà sostanzialmente ...

Diamo sperano che tu abbia ragione. Suggerirei che fare affidamento sul fatto che i dati rimangano "abbastanza piccoli" per rimanere performanti sia rischioso.

Inoltre, qual è il tasso di variazione in queste Regole? Più duplicati hai, più tempo (aka denaro) sprecherai ad aggiornare la stessa cosa in più punti.


1

I concetti chiave alla base degli RDBMS hanno oltre 40 anni. Allora l'archiviazione era molto costosa e ogni tipo di ridondanza era disapprovato. Mentre i concetti alla base degli RDBMS sono ancora validi, l'idea di denormalizzazione delle prestazioni (per ridurre i join) è stata comunemente accettata negli ultimi decenni.

Quindi, per un RDBMS di una determinata dimensione, in genere hai il tuo design logico (senza ridondanza) e il tuo design fisico (con ridondanza) per le prestazioni.

Velocemente fino ad oggi, dove lo storage è economico e i processori sono più veloci che mai, alcune di queste pressioni di progettazione non sono così importanti. Alla fine si tratta di un appello al giudizio se ti importa della ridondanza e dei record orfani. Per alcuni settori come quello bancario, la correttezza dei dati è fondamentale, quindi è difficile capire come si allontaneranno mai dagli RDBMS. Per altri settori, i nuovi attori entrano continuamente nel mercato, quindi le scelte sono innumerevoli.

Quanto al fatto che il tuo team sia a disagio con le restrizioni che un RDBMS può portare - chi lo sa? Certamente gli sviluppatori junior che vedo non hanno il nous RDBMS che avevano gli sviluppatori delle generazioni precedenti, ma questo probabilmente ha più a che fare con la proliferazione di tecnologie di sviluppo e piattaforme di database.

Non c'è fine alle tecnologie che uno sviluppatore può imparare e può essere difficile fare il punto giusto per la tua carriera. Certamente i giorni in cui gli sviluppatori sono diventati un tuttofare sono ormai lontani - c'è davvero troppo che si può imparare.

Ma - alla domanda in questione. Per tua stessa ammissione, non ti aspetti che i volumi di dati crescano e il sistema funziona bene. Sarebbe abbastanza estendibile per te vendere l'idea di riprogettare le cose senza alcun beneficio percepibile. Forse se potessi fare una prova del concetto in cui un approccio RDBMS ha ottenuto benefici, sarebbe una storia diversa.


1
perché questo è downvoted? questa è una risposta equilibrata. pragmatismo +1
Dirk Boer

Il pragmatismo è buono, ma devi ancora stare attento. La denormalizzazione dei dati in nome della prestazione all'inizio di un progetto puzza di ottimizzazione prematura. Non riprogettare un vecchio sistema che funziona è ovviamente una buona scelta pragmatica, ma rifiutare di progettare un nuovo sistema fino agli standard del settore nel nome di "abbiamo sempre fatto il contrario e funziona" è tutt'altro che una buona argomentazione .
Vincent Savard

Denormalizzazione dei dati in nome della performance all'inizio di un progetto ... Suggerimento: non è vero :)
Robbie Dee

1
Il valore di un RDBMS non deriva dall'efficienza del disco.
TehShrike

0

Dipende dal database che stai utilizzando.

In un RDBMS tradizionale, hai ragione. La duplicazione dei dati è un abominio. Le colonne e la loro equivalenza json inevitabilmente andranno fuori sincronia perché non c'è nulla che la imponga. Il supporto per le chiavi esterne è ben noto, fa un ottimo lavoro nel descrivere e far rispettare le relazioni. E l'atomicità è vitale per fare quasi tutto con i dati.

In una sorta di installazione nosql, è meno chiaro. Poiché non vi sono relazioni solide, l'applicazione delle relazioni diventa meno importante. Quel tipo di contenuto json con indice di colonna è molto più comune su questi sistemi perché nessuna relazione significa che è meno probabile che esca dalla sincronizzazione. E l'atomicità è vincolata alla singola tabella perché è così che funziona nosql.

La cosa migliore dipende da cosa stai effettivamente facendo e da cosa hai effettivamente bisogno.

Ma sembra che i tuoi colleghi siano in una setta mercantile. Sono stati morsi da vecchie cose cattive, quindi ora le cose devono essere la nuova cosa brillante. Tra qualche anno, una volta che saranno stati morsi dalla nuova cosa brillante, si spera che realizzeranno che SQL vs noSQL è un insieme di compromessi.

Ma non lo faranno. Spero che lo farai comunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.