SQL è inefficiente dal momento che deve analizzare tutto?

-3

Come sai, SQL non ha array. Quindi, se crei un "articolo" per la tabella e desideri avere commenti sui tuoi articoli presumo che tu faccia un altro "commento" sulla tabella. Nella tabella "commenti" hai il contenuto e una chiave esterna chiamata "article_id" che rimanda all'ID dell'articolo.

Quindi per ottenere tutti i commenti dell'articolo si dovrebbe eseguire questa query:

SELECT comment.content 
FROM comment
WHERE ${specific article id} = comment.article_id

Questo è il modo in cui penso che lo faresti.

Quindi, poiché l'articolo non ha riferimenti ai suoi commenti, il database cercherà di ripetere il commento di ogni singolo pubblicato sul sito Web, indipendentemente dall'articolo, per scoprire se il commento corrisponde all'articolo. Quindi se hai migliaia di articoli e ogni articolo ha decine di commenti, il database deve passare attraverso decine di migliaia di commenti per trovare quelli che corrispondono al tuo articolo.
La mia domanda è non è davvero inefficiente? Non c'è davvero modo di memorizzare dinamicamente gli ID di commento all'interno della tabella degli articoli?

    
posta korri123 16.07.2016 - 05:45
fonte

1 risposta

2

the database has to go through tens of thousands of comments to find the few ones that match your article

No, non è così. Questo concetto è chiamato indici . In termini di base, quando si prevede di eseguire una ricerca per qualcosa all'interno di una tabella, in base a una colonna specifica, si definisce questa colonna come indice. Successivamente, quando chiedi al tuo database di restituire tutti gli elementi in cui article_id è uguale a 123 , il database non deve passare attraverso tutte le righe della tabella; invece, attraverso l'indice, determina le corrispondenze e legge solo quelle corrispondenze.

Ecco perché gli indici sono cruciali in termini di prestazioni del database. Quando inizierai a leggerli, leggi numerosi casi in cui le persone sono passate da una query che impiegava giorni alla stessa query eseguendo in pochi secondi dopo l'aggiunta degli indici appropriati.

So since the article doesn't itself have references to it's comments

Perché no? Questo concetto è chiamato chiavi esterne . Una chiave esterna ti consente di dire che i valori di questa colonna specifica di una tabella corrispondono ai valori di quella colonna di un'altra (o marginalmente la stessa) tabella.

Il vantaggio delle chiavi esterne è che non è possibile inserire dati che non hanno una corrispondenza all'interno della tabella correlata. Nel tuo caso, sarebbe impossibile avere un commento con article_id impostato su 456 se non ci sono articoli con una chiave primaria 456 .

As you know SQL doesn't have arrays.

No, non lo so. Vedi matrici PostgreSQL .

Altri database ti consentono di memorizzare anche XML (e di attraversarlo).

La maggior parte dei database SQL ti consente anche di memorizzare nvarchar(max) che potrebbe contenere un JSON del tuo array (o qualsiasi altra rappresentazione testuale).

Prova queste alternative e confronta le loro prestazioni con un database correttamente normalizzato con indici appropriati e guarda da solo che è più veloce da interrogare.

    
risposta data 16.07.2016 - 09:38
fonte

Leggi altre domande sui tag