JavaRush /Java Blog /Random-IT /Intervista allo sviluppatore: analisi delle domande del d...

Intervista allo sviluppatore: analisi delle domande del database

Pubblicato nel gruppo Random-IT
Ciao a tutti! Stiamo tutti lavorando per un unico obiettivo: diventare sviluppatori Java . Forse la tappa più importante nel percorso per diventare un professionista è il colloquio tecnico. Di norma, l'intervistatore esamina gli argomenti principali, ponendo un paio di domande. In questo articolo parleremo di uno di questi argomenti chiave: i database . Diamo un'occhiata alle domande più frequenti e proviamo a rispondere senza immergerci profondamente nella materia, perché in questo caso il volume del libro non ci basterà! Quindi andiamo.Intervista allo sviluppatore: analisi delle domande del database - 1

1. Cosa sono i database? In quali tipologie si dividono?

Cosa si intende per DBMS?

Intervista allo sviluppatore: analisi delle domande del database - 2Un database (DB) è una struttura organizzata progettata per archiviare, modificare ed elaborare informazioni correlate, principalmente grandi volumi. In altre parole, un database è un archivio di dati strutturato. Ad esempio, una rubrica.

Tipi di database

  1. Un database relazionale è una raccolta di dati con relazioni predefinite tra loro. I dati vengono archiviati come un insieme di tabelle costituite da colonne e righe. Le tabelle memorizzano informazioni sugli oggetti rappresentati nel database. Ogni colonna della tabella memorizza un tipo di dati specifico e ogni cella memorizza un valore di attributo.
  2. I sistemi non relazionali (NoSQL) sono sistemi progettati per modelli di dati specifici con schemi flessibili. In altre parole, si tratta di database che memorizzano i dati non sotto forma di schemi tabulari, righe e colonne, ma in altri formati.
Puoi leggere ulteriori informazioni sui database non relazionali in questo articolo: A Guide to NoSQL for Developers . Un sistema di gestione di database (DBMS) è un insieme di software con cui l'utente può creare database (DB) ed eseguire varie operazioni su di essi: integrare, aggiornare, cancellare, selezionare, ecc. Il DBMS garantisce la sicurezza, l'integrità, la protezione dei dati archiviazione e consente di concedere l'accesso all'amministrazione del database. Ad esempio, MySql è un DBMS che fornisce l'accesso a un database relazionale o MongoDB per uno non relazionale.

2. Cos'è la normalizzazione? Forma normalizzata? Quante forme di normalizzazione esistono? Nomina i primi tre.

La normalizzazione è il processo di organizzazione e strutturazione dei dati in un database, che fornisce una maggiore flessibilità del database eliminando la ridondanza e l'incoerenza delle dipendenze. La forma normale è una proprietà di una tabella, considerata nel contesto della normalizzazione, che caratterizza la tabella in termini di semplicità e correttezza della struttura. La forma normale è definita come un insieme di requisiti che una tabella deve soddisfare. Esistono sei forme normali in totale, ma in pratica non vengono utilizzate più delle prime tre:
  1. Prima forma normale:
    • Tutti gli attributi sono semplici (cioè atomici e indivisibili);
    • Tutti i dati sono scalari (ovvero positivi);
    • Non ci sono righe duplicate (per questo viene creata una chiave primaria per ogni riga).
  2. Seconda forma normale:
    • Le condizioni della prima forma normale sono soddisfatte;
    • Ogni attributo non chiave fa riferimento a una chiave primaria.
  3. Terza forma normale:
    • Le condizioni del secondo gruppo normale sono soddisfatte;
    • I campi non chiave sono indipendenti da altri campi non chiave: possono essere associati solo ad una chiave primaria.

3. Denormalizzazione

La denormalizzazione è la riduzione o violazione deliberata delle forme di normalizzazione del database, solitamente per accelerare la lettura dal database aggiungendo dati ridondanti. In generale, questo è un processo inverso alla normalizzazione. Ciò accade perché la teoria delle forme normali non è sempre applicabile nella pratica. Ad esempio, i valori non atomici non sono sempre “cattivi”: a volte anche il contrario. In alcuni casi, sono necessari join aggiuntivi durante l'esecuzione di query, soprattutto quando si elaborano grandi quantità di informazioni. Ciò può in definitiva migliorare le prestazioni. I database destinati all'analisi vengono spesso denormalizzati per accelerare l'esecuzione delle query. Ad esempio, utilizzerai spesso alcuni dati per i report in cui le colonne non chiave saranno correlate tra loro. Rimuovi intenzionalmente la terza forma di normalizzazione e combini tutto in un'unica tabella per facilitare il campionamento, in modo da non dover effettuare ulteriori query su altre tabelle.

4. Indici

Un indice è un insieme ordinato di valori associati a una tabella o vista con una colonna specifica che accelera il recupero dei dati. Cioè si tratta di una sorta di indice: come l'alfabeto in un elenco telefonico, che ci aiuta nella ricerca per cognome. Se utilizzata correttamente, questa funzionalità può migliorare notevolmente le prestazioni quando si lavora con database di grandi dimensioni. Oppure puoi abbassarlo molto. Per velocizzare la ricerca, tali chiavi vengono memorizzate in una struttura ad albero bilanciata attraverso la quale viene effettuata la ricerca. Di norma, è necessario inserire gli indici nei campi che vengono cercati più spesso. Dovresti pensare a creare un indice non prima di quando hai almeno 10mila record. Altrimenti non vedrai un risultato evidente, perché l'ottimizzazione prematura è MALE . E in che modo un indice può influire sulle prestazioni del sistema, chiedi? Quando si inseriscono nuovi dati o si cancellano dati vecchi, la struttura ad albero bilanciata verrà ricalcolata. In realtà, maggiore è il numero di dati e indici, maggiore è il numero di alberi da contare. Immagina la situazione: hai circa 20.000 record e 7 indici su questa tabella. Cioè, quando si inseriscono i dati, è necessario ricalcolare 7 alberi, ciascuno con 20.000 record. A rigor di termini, l'utilizzo degli indici per le tabelle in cui i dati verranno aggiunti/eliminati frequentemente non è affatto consigliato. Infine, vorrei sottolineare che gli indici per le colonne in cui si trova spesso il valore nullnon saranno altrettanto efficaci, quindi non vale la pena aggiungerli a tali colonne.

Qual è la differenza tra indici cluster e non cluster in SQL?

Raggruppato:

  • Fornisce l'ordine fisico per il campo selezionato;
  • Se una tabella ha un indice cluster, si dice che sia clusterizzata;
  • Non è necessario più di un indice per tabella;
  • In MySQL, un indice cluster non è specificato esplicitamente dall'utente, perché se non definisci una CHIAVE PRIMARIA sulla tua tabella, MySQL trova il primo indice UNIQUEdove sono tutte le colonne chiave NOT NULLe InnoDB lo utilizza come indice cluster.

Non in cluster:

  • Sono possibili fino a 999 indici non cluster per tabella;
  • Contiene un puntatore alle righe con dati reali nella tabella;
  • Non fornisce l'ordine fisico;
  • Per gli indici non cluster esistono tabelle separate con dati ordinati, ovvero una tabella per una colonna su cui si trova l'indice, pertanto, quando si richiedono dati che non fanno parte di un determinato campo, la query verrà eseguita prima sul campo in questa tabella e solo successivamente la query aggiuntiva su una riga nella tabella originale.
Creazione di un indice non cluster:

CREATE INDEX index_name ON table_name(column_name)

6. Cos'è un indice composito?

Indice composito : creato con l'invio a più colonne contemporaneamente. In altre parole, è un indice complesso composto da più colonne. Tali indici vengono utilizzati quando in una query viene visualizzata più di una colonna. Creazione di un indice composito:

CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
In genere, questi indici vengono utilizzati quando i dati in più colonne sono logicamente correlati.

7. Cos'è un indice di copertura? Indice unico?

Un indice di copertura è un indice sufficiente per rispondere a una query senza accedere alla tabella stessa. Utilizzando questo indice, puoi ottenere l'intera riga di dati, ma in realtà semplicemente non è necessario. Poiché non è necessario accedere direttamente alla tabella di origine e è possibile rispondere utilizzando solo l'indice, gli indici di copertura sono leggermente più veloci da utilizzare. Allo stesso tempo, non dimenticare che più colonne sono, più ingombrante e lento diventa l'indice stesso. Quindi non dovresti abusarne. Sopra abbiamo parlato di indici clusterizzati e non cluster, che possono essere univoci . Ciò significa che non esistono due campi con lo stesso valore per la chiave dell'indice. In caso contrario, l'indice non sarà univoco, poiché più righe potrebbero contenere lo stesso valore. Un esempio di creazione di un indice univoco non cluster:

CREATE UNIQUE INDEX index_name ON table_name(column_name)

8. Cos'è una chiave primaria

La chiave primaria è un campo in una tabella che identifica ogni riga in una tabella di database. Può essere presente un solo campo di questo tipo in una tabella e tutti i valori devono essere univoci. Non ti ha ricordato niente? Intervista allo sviluppatore: analisi delle domande del database - 3Dopotutto, una chiave primaria non è altro che un indice univoco cluster . Di norma, le chiavi primarie vengono create durante la creazione di una tabella:

CREATE TABLE table_name(
column_name int PRIMARY KEY,..)
Una restrizione verrà aggiunta automaticamente a questa colonna: NOT NULL. Puoi anche impostare una chiave per una tabella già creata:

ALTER TABLE table_name ADD PRIMARY KEY (column_name);
Se viene aggiunta una chiave primaria nel modo sopra descritto, i valori dei campi specificati come chiave primaria ( column_name) vengono controllati per garantire che non contengano valori nulli (verrà aggiunto anche un vincolo - NOT NULL).

Cos'è una chiave esterna?

Una chiave esterna è una proprietà creata per fornire una relazione tra tabelle. In genere, una chiave esterna viene impostata sulle colonne di una sottotabella e punta a una delle colonne della tabella principale. Può essere specificato come durante la creazione di una tabella:

CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
Quindi dopo aver creato la tabella:

ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
È possibile impostare il comportamento di una chiave esterna durante la manipolazione del campo a cui fa riferimento. Le manipolazioni possono essere dei seguenti ON DELETEtipi ON UPDATE: Possibili opzioni di comportamento:
  • CASCADE— con questa proprietà, le righe della tabella dipendente verranno automaticamente eliminate o modificate quando le righe correlate vengono eliminate o modificate nella tabella principale;
  • SET NULL— con questa proprietà, quando una riga correlata viene eliminata o aggiornata dalla tabella principale, NULLverrà impostato il valore per la colonna della chiave esterna;
  • NO ACTION— rifiuta i tentativi di eliminare o modificare righe nella tabella principale se sono presenti righe correlate nella tabella dipendente;
  • RESTRICT- equivalente a NO ACTION;
  • SET DEFAULT- con questa proprietà, quando una riga correlata viene eliminata o aggiornata dalla tabella principale, verrà impostato il valore predefinito (se presente) per la colonna della chiave esterna.
Esempio di utilizzo:

 CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) ON UPDATE CASCADE ON DELETE CASCADE }
ON DELETESe il comportamento per e non è impostato esplicitamente ON UPDATE, il comportamento verrà impostato su RESTRICT.

10. Tipi di connessioni tra tabelle (Join)

La connessione tra le tabelle viene fornita in base a dati comuni (campi). Ciò avviene utilizzando un operatore JOIN, un'operazione che abbina le righe di una tabella con le righe di un'altra. La mappatura viene eseguita in modo che le colonne di entrambe le tabelle siano adiacenti, sebbene possano essere ottenute da tabelle separate. E se abbiamo campi comuni per tre tabelle, possiamo visualizzare i relativi dati come un'unica tabella comune. Tuttavia, è opportuno considerare che minore è il numero di tabelle unite, più veloce sarà l'esecuzione della query. Quindi, i tipi JOIN:
  • INNER JOIN- una connessione che mostra solo i dati della prima tabella che corrispondono ad alcuni dati della seconda tabella. Il resto va giù.Intervista allo sviluppatore: analisi delle domande del database - 4
  • LEFT JOIN- una connessione che mostri tutti i dati della prima tabella ed i corrispondenti dati della seconda, se presente. Se non ci sono dati corrispondenti, i campi per i dati della seconda tabella saranno vuoti.Intervista allo sviluppatore: analisi delle domande del database - 5
  • RIGHT JOIN- un collegamento che mostri tutti i dati della seconda tabella ed i corrispondenti dati della prima, se presenti. Se non ci sono dati corrispondenti, i campi per i dati della prima tabella saranno vuoti.Intervista allo sviluppatore: analisi delle domande del database - 6
  • FULL JOIN- una connessione che mostra tutti i dati della prima e della seconda tabella. Se non sono presenti dati correlati nell'altra tabella, i campi relativi a tali dati saranno vuoti.Intervista allo sviluppatore: analisi delle domande del database - 7
  • CROSS JOIN- un cross join in cui ogni riga della prima tabella è unita a ciascuna riga della seconda tabella (ciascuno a ciascuno). Cioè, se due tabelle hanno 3 righe ciascuna, dopo questa unione otterremo un risultato di 9 righe.Intervista allo sviluppatore: analisi delle domande del database - 8
Esempio Join(inner):

SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column

11. Cos'è una proprietà ACID in un database?

A - Atomicità , garantisce che nessuna transazione sia parzialmente impegnata nel sistema. Vengono eseguite tutte le operazioni secondarie oppure nessuna. Ad esempio, trasferire denaro da una banca a un altro conto prevede due operazioni:
  1. Trasferisci denaro su un conto bancario.
  2. Trasferisci denaro da un conto bancario a un conto specifico.
Ma tutto può succedere. Ad esempio, andranno in banca e poi si verificherà un errore e la seconda operazione non verrà completata. O viceversa: verrà eseguita solo la seconda operazione. Pertanto, queste azioni vengono eseguite all'interno di una transazione e il risultato è tutto o niente. C - Coerenza : ogni transazione riuscita registra sempre solo risultati risolvibili. Ciò garantisce che tutte le restrizioni siano soddisfatte (ad esempio NOT NULL), altrimenti la transazione verrà annullata. E - isolamento : durante l'esecuzione di una transazione, le transazioni parallele non dovrebbero influenzarne il risultato. Questo ci dà la possibilità di nascondere a tutti gli stati dei dati non finali. In realtà, questo è il motivo per cui le transazioni non riuscite non possono rompere nulla. Un po' più in basso faremo conoscenza con i livelli di isolamento delle transazioni. D - Durabilità : se una transazione viene completata, puoi essere sicuro che le modifiche apportate non verranno annullate a causa di qualche errore.

12. Livelli di isolamento delle transazioni

Ciascun livello di isolamento consente/vieta determinate azioni (opportunità):
  • lettura fantasma : all'interno della stessa transazione, la stessa richiesta di dati fornisce risultati diversi, il che si verifica a causa dell'aggiunta di dati da parte di un'altra transazione (parallela).
  • lettura non ripetuta : all'interno della stessa transazione, la stessa richiesta di dati fornisce risultati diversi, che si verificano a causa della modifica o della cancellazione dei dati da parte di un'altra transazione (parallela).
  • Lettura "sporca" : lettura dei dati aggiunti o modificati da una transazione che non verrà successivamente ripristinata;
  • aggiornamento perso - quando diverse transazioni modificano lo stesso blocco di dati contemporaneamente, tutte le modifiche tranne l'ultima vengono perse (simile a una "race condition" in multithreading).
Per comodità, consideriamo i livelli di isolamento e le loro capacità nella tabella:
Livelli di isolamento Lettura fantasma Lettura non ripetitiva Lettura “sporca”. aggiornamento perso
SERIALIZZABILE + + + +
RIPETIBILE_READ - + + +
READ_COMMITTED - - + +
READ_UNCOMMITTED - - - +

13. Cos'è l'iniezione SQL?

L'iniezione SQL è uno dei metodi di hacking di un sito Web, la cui essenza è l'iniezione di codice SQL nei dati tramite GETquery POSTo cookie. Se un sito web esegue tali iniezioni, è possibile accedere al database e hackerare l'applicazione. Ad esempio, conosciamo il nome di alcune variabili. Diciamo column_namecon type boolean. Se il sistema è suscettibile alle iniezioni, possiamo aggiungere OR column_name=truee poi scrivere tutto ciò di cui abbiamo bisogno dal database. ORcreerà una condizione OR e la nostra espressione successiva sarà sempre true, il che ci porterà oltre. Un attacco a un sito web come l'SQL injection è possibile a causa dell'elaborazione impropria dei dati in entrata utilizzati nelle query SQL. Quando ci si connette a un database utilizzando JDBC , si utilizzano vari file Statements. Per aumentare la sicurezza, è necessario utilizzare PreparedStatemental posto del solito Statement, poiché quando vengono utilizzati, Statementle stringhe di query e i valori vengono semplicemente sommati, rendendo possibili le iniezioni. A sua volta, esiste PreparedStatementun modello di richiesta specifico e i dati vengono inseriti al suo interno tra virgolette. Di conseguenza, le SQL injection verranno percepite solo come una rappresentazione di stringa di alcuni campi. Per proteggersi dalle SQL injection, puoi utilizzare i controlli basati sulle espressioni regolari (puoi leggere ulteriori informazioni sulle espressioni regolari in questo articolo ). Intervista allo sviluppatore: analisi delle domande del database - 9Un'altra opzione è impostare un limite al numero di caratteri dei parametri in entrata: ad esempio, se dovessi ricevere un numero non superiore a 9999, andrà bene un limite di quattro caratteri in entrata. Ridurrà il rischio di hacking utilizzando SQL injection. Puoi saperne di più sulla sicurezza in Java dall'articolo "Sicurezza in Java: migliori pratiche" .

14. Cosa sono le procedure memorizzate? Funzioni memorizzate? Grilletto?

Le procedure memorizzate in SQL sono un'entità nel database, ovvero un insieme di istruzioni SQL che vengono compilate una volta e archiviate sul server. In una parola, questo è un analogo dei metodi in Java. Le procedure memorizzate possono eseguire azioni sui dati, sia query normali che alcune azioni che non sono disponibili per le query normali. Una procedura è un'entità SQL creata una volta e quindi richiamata passando argomenti. Il vantaggio di questo approccio è che queste istruzioni possono essere riutilizzate più di una volta. Le procedure archiviate migliorano le prestazioni, migliorano le capacità di programmazione e supportano le funzionalità di sicurezza dei dati. Consideriamo la creazione di una procedura:

CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
 begin
……...
 end
Chiamare la procedura:

CALL procedure_name (first_param, second_param…..);
Una funzione memorizzata è un tipo di procedura memorizzata. La differenza tra una funzione è che restituisce sempre un solo valore, mentre una procedura restituisce sempre un insieme di valori. Le procedure memorizzate non possono essere mescolate con il normale SQL, mentre una funzione memorizzata può - e questo è il suo vantaggio. D'altra parte, le funzioni memorizzate hanno molte più limitazioni delle procedure. Creazione di una funzione memorizzata:

CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
 begin
……...
RETURN some_value; 
end
Chiamare una funzione memorizzata:

SELECT function_name(first_param, second_param…..);
Un trigger è un altro tipo di procedura memorizzata che non viene chiamata direttamente dall'utente, ma viene attivata quando i dati vengono modificati. Cioè, questa procedura viene attivata quando vengono soddisfatte determinate condizioni, come, INSERTo DELETE, o UPDATEdati in una determinata colonna di una determinata tabella. Il momento in cui viene attivato un trigger viene determinato utilizzando le parole chiave BEFORE(il trigger si attiva prima dell'evento associato) o AFTER(dopo l'evento).

CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
 begin
……...
 end

15. Pratica

Comunque sia, la domanda SQL più comune durante un colloquio sarà la pratica: la risoluzione dei problemi. Non ha senso cercare di indovinare quali compiti ti imbatterai, perché tutto dipende dalla raffinatezza dell'immaginazione della persona di fronte. Pertanto, l'unica opzione funzionante sarebbe quella di migliorare le query SQL di varia complessità. sql-ex.ru può servire come risorsa per esercitarsi su vari compiti . Dopo le prime venti attività completate, sarà abbastanza difficile per il tuo interlocutore spaventarti con qualsiasi attività SQL. Intervista allo sviluppatore: analisi delle domande del database - 11Per oggi è tutto: spero che dopo la lettura di questo articolo le domande sui database non causino difficoltà o problemi. Grazie per l'attenzione e ci vediamo di nuovo!
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION