Qual è la differenza tra un "record" e una "riga" in SQL Server?


56

C'è stata una domanda piuttosto innocua sull'aggiunta di date e orari in SQL Server che ha scatenato un dibattito tassonomico piuttosto affascinante.

Quindi, come possiamo distinguere tra questi termini correlati e come li usiamo correttamente?

Riga

Disco


32
Uno spinge un velivolo, l'altro è usato dai
pantaloni a vita bassa

1
Un post correlato su SO mostra chiaramente che questa è una domanda importante.
dezso

Nota che in Postgres e Oracle una singola riga può contenere più record ...
a_horse_with_no_name

Risposte:


69

Per citare Joe Celko (non solo puoi trovare questo riferimento in tutto il web e nella sua voce di Wikipedia , ma lo vedrai anche su magliette in alcune conferenze):

Le righe non sono record.

Molte persone lo indicano come un idiota pedante a cui piace solo umiliare e abusare verbalmente dei neofiti, e ammetterò che è così che si imbatte. Ma l'ho anche incontrato di persona - ho persino condiviso un pasto con lui - e non posso dirti quanto sia diverso il suo personaggio nella vita reale dal suo fronte online. Una volta l'ho anche sorpreso a chiamare i file delle righe ed era molto imbarazzato ( retroscena completa qui ).

In realtà ho indossato questa maglietta alla conferenza PASS di Grapevine, in Texas, nel 2006

In ogni caso, dì quello che vuoi sul personaggio online del ragazzo, ma ha scritto lo standard e il fatto che tale autorità imponga che ci sia una distinzione dovrebbe dirti qualcosa. E tanto quanto si arrabbia quando qualcuno chiama una riga un record, così fanno molti dei miei colleghi, che sono anche esperti nel mondo di SQL Server. E quelli di noi in quel campo credono che abbia ragione.

Ad esempio, Itzik Ben-Gan, un ovvio guru di SQL Server. Ecco una citazione dalla prima lezione del suo kit di formazione (esame 70-461): query su Microsoft SQL Server 2012 :

Come esempio di termini errati in T-SQL, le persone usano spesso i termini "campo" e "record" per fare riferimento a ciò che T-SQL chiama rispettivamente "colonna" e "riga". I campi e i record sono fisici. I campi sono ciò che hai nelle interfacce utente nelle applicazioni client e i record sono ciò che hai nei file e nei cursori. Le tabelle sono logiche e hanno righe e colonne logiche.

E, conoscendo Itzik, se gli invii un'e-mail o lo sottoponi a una conferenza, te lo dirà felicemente. Se chiami una riga un record, a suo avviso, non stai usando correttamente la terminologia.

Ora, essendo un settore pieno di gente di tutti i tipi, è probabile che tu trovi materiale (come gli articoli sui target tecnologici pubblicati in un'altra risposta) che sembrano fare delle distinzioni molto sottili tra i due, e troverai molte persone nel settore considerali allo stesso modo (conosco diverse persone di Microsoft e altre persone come Brent Ozar, che lo chiameranno sempre un record). Questo non li rende giusti, è solo il loro modo di vederlo: vedono lo stesso logico e fisico come lo stesso (almeno in questo contesto) e molti di loro probabilmente pensano che il resto di noi sia solo ritentivo anale che trascorre troppo tempo sulla semantica.

Dal momento che nessun venditore può dire "li chiamerai {records | righe}", ci occuperemo per sempre di questo argomento, perché ci sarà sempre qualcuno che non ottiene il logico contro il fisico, o che è stato insegnato in modo diverso, o provengono da Access o da background di programmazione, ecc. Proprio come alcune persone dicono di domani e altre persone dicono di tomah, ci sarà sempre una varietà di persone che vanno da "sono uguali" a "completamente diverse" "- e molte sfumature nel mezzo. Ancora una volta, ciò non rende nessuno di loro giusto, perché nessuno può essere l'autorità suprema su questo. Ma nello spazio di SQL Server, c'è sicuramente la maggioranza.


Detto questo, IMHO, quando parli di dati contenuti in una tabella, li chiami una riga. Quando si esegue un inserimento, si inserisce una riga in una tabella. Quando si esegue un aggiornamento, si sta aggiornando una riga che si trova in una tabella. E quando si esegue un SELECT, si stanno recuperando righe da una tabella.

Sentiti libero di chiamarlo un record una volta che l'applicazione lo ha bloccato. Ma non arrabbiarti se dici "Ho inserito un documento" e qualcuno ti corregge.


33

Microsoft ha in diversi punti della propria organizzazione a condizione che il nome ufficiale per l'archiviazione tabellare dei dati per voce di tabella (per coniare una definizione tassonomica che serva al mio scopo) sia chiamato "ROW". Io sostengo come prova ROW_NUMBER, ROWCOUNT, ROWVERSIONe la DataTable.Rowsproprietà, in cui una DataTableè una rappresentazione C # di un oggetto TSQL "tavolo". In questo caso, le proprietà MSDN nel loro insieme incoraggiano l'uso di rowfare riferimento a una raccolta di dati che è una voce in una tabella. (nota che sto cercando di evitare l'uso di "record" o "row" per definire questo, essendo questo il punto di domanda)

Tuttavia, il problema è che un'applicazione si occupa dei "record" degli utenti. Qualcosa di unico in un record che potrebbe non essere rappresentato direttamente da una singola riga di memoria è il fatto che un record può avere sottoregistrazioni. È vero, una tabella può avere tabelle molti-a-uno correlate, ma quelle non sono memorizzate in modo contiguo, ma sono archiviate in modo logico.

Quindi, una riga è la cosa in una tabella e un record è la cosa con cui lo sviluppatore lavora nell'uso pratico.


8
Si può sostenere che ROW è l'entità logica, mentre RECORD è l'entità fisica. Una ROW può avere più record: uno nell'indice cluster, molti negli indici NC. Una riga che non rientra nella pagina può essere suddivisa tra il record nella pagina e i record di overflow nella memoria SLOB. Un valore BLOB di un campo di una riga può estendersi su più record TEXT nella memoria BLOB. Una riga in un heap può essere costituita da un record stub e un record forward. Ecc. Ecc.
Remus Rusanu,

Quindi avresti rimosso completamente l'uso del record di parole dal dominio dell'app, o avresti completamente confuso le acque e ci avresti portato lontano da termini definibili e nel regno della progettazione del database teorico e dei dettagli di implementazione. Sollevi buoni punti, ma dalla convenzione di app vs database, che è dove l'80% dei nostri lettori si sentirà a proprio agio, la mia risposta è ancora valida.
jcolebrand

4
Non sto contraddicendo la tua risposta, forse ho sbagliato le parole. Ho presentato solo come vengono visualizzate le cose dallo stesso motore SQL, in cui il livello di accesso fisico le chiama "record" rispetto al livello di elaborazione delle query (linguaggio) che gestisce le "righe".
Remus Rusanu,

Vedo. Sento ancora che confonde le acque. Senza offesa, te lo assicuro.
jcolebrand

31

Ho appena cercato nel documento "Tecnologia dell'informazione - Linguaggi del database - SQL Parte 2: Foundation (SQL / Foundation)", che definisce lo standard ANSI per SQL come implementato da tutti i principali RDBMS.

La parola rowè usata principalmente nel documento diverse centinaia di volte, come previsto.

La parola è recordstata utilizzata solo per descrivere un record simile a un record utilizzato in Oracle PL / SQL (che descrive in modo specifico i tipi di dati dei record ADA). 6 menzioni nel documento.

Penso che questo chiarisca questa domanda e risponda ai vari argomenti di entrambe le parti.


informazioni addizionali

Da una copia di uno standard SQL (versione bozza dell'ultimo disponibile gratuitamente), che può essere trovato su wiscorp.com (la pagina SQL Standards ha diverse altre versioni e revisioni precedenti).

La ricerca nel 7IWD2-02-Foundation-2011-12.pdf , con una data del 21-12-2011 rivela che la riga di parole appare 2277 volte nel documento mentre il record di parole appare solo 21 volte, sia come verbo "record" o in alcune appendici alla fine, nelle specifiche delle corrispondenze dei tipi di dati per i tipi di dati SQL e i tipi di lingue host (Ada, Pascal).

Inoltre, lo stesso documento ha a pagina 57 (sottolineatura mia):

4.15.1 Introduzione alle tabelle

Questo Subclause è modificato dal Subclause 4.10.1, "Introduzione alle tabelle", in ISO / IEC 9075-9.

Una tabella è una raccolta di zero o più righe in cui ogni riga è una sequenza di uno o più valori di colonna. Il tipo più specifico di una riga è un tipo di riga. Ogni riga di una determinata tabella ha lo stesso tipo di riga, chiamata tipo di riga di quella tabella. Il valore dell'i-esimo campo di ogni riga di una tabella è il valore dell'i-esima colonna di quella riga della tabella. La riga è la più piccola unità di dati che può essere inserita in una tabella ed eliminata da una tabella.

Il grado di una tabella e il grado di ciascuna delle sue righe è il numero di colonne di quella tabella. Il numero di righe in una tabella è la sua cardinalità. Una tabella la cui cardinalità è 0 (zero) si dice che sia vuota.

Una tabella è una tabella di base , una tabella derivata o una tabella temporanea .


Per quanto riguarda i DBMS che utilizzano SQL:

Le righe non sono record , i campi non sono colonne, le tabelle non sono file!


14

Poiché i database relazionali sono usati raramente in isolamento, al fine di evitare confusione tra altre parti dei sistemi, mi riferisco sempre a tabelle, righe e colonne. Nelle applicazioni client, in genere abbiamo altri costrutti, inclusi i datareader, i set di dati, i datarows, i database, ecc. Ad esempio "field" viene spesso utilizzato per l'immissione dei dati sullo schermo e Pascal ha un tipo di dati Record simile a una struttura in C .

A volte nella progettazione di un sistema, l'idea di un "Record" potrebbe essere usata per significare qualcosa di più ampio di una singola riga. Potrebbe essere una riga ed è storia. Proprio come quando parliamo di una riga eliminata, potremmo significare una riga che è semplicemente contrassegnata come eliminata con una colonna o "spostata" in una tabella eliminata (e non semplicemente l'assenza di una riga che, inesistente, è piuttosto difficile da fissare). C'è solo un uso più vario del termine Record.

Le tabelle, le righe e le colonne sono generalmente accettate come terminologia per riferirsi a queste entità nei database relazionali, inclusi documenti e lavori di Codd e Date, e la maggior parte dei professionisti del database preferisce questa terminologia poiché è più chiara.

Di solito non c'è ambiguità quando si parla di righe e colonne - altre persone capiscono che stai parlando della progettazione fisica del database sottostante e non di qualsiasi altro tipo di artefatto da una progettazione logica prima della progettazione fisica o di eventuali entità di sistema emergenti successive come campi in un schermo.


9

Anche se la tua domanda ha già ricevuto una risposta molto buona. Vorrei aggiungere anche i miei punti. Potrebbe essere utile fino a un certo punto. Inoltre la mia risposta non è specifica per SQL Server

Queste parole sono usate in modo intercambiabile.

 1          2         3              4 
--------------------------------------------------------------------
Row    =  Record  =  Tuple        =  Entity 

Column =  Field   =  Attribute    =  Attribute

table  =  File    =  Relation     =  Entity Types(or Entity Set)
  • 4 terminologia utile da utilizzare quando apprendiamo i moduli ER
  • 3 utilizzare quando Modello relazionale
  • 2 scena generale, DataBase books start with these terminologyperché sono molto comunemente usati dalle persone nella vita reale, anche nel file system.

Record è l'unità di base nel sistema di archiviazione che ha un significato implicito. In DBMS la parola recorduse nel capitolo descrive come le tabelle del database vengono archiviate su blocchi del disco. In DBMS a record-oriented file-systemè un file system in cui i file sono archiviati come raccolte di record.


9

La lingua continua ad evolversi. Qualche decennio fa le persone alfabetizzate usavano "indici" anziché semplici "indici". Passando agli "indici", abbiamo eliminato una complicazione non necessaria e reso la lingua più utile. La necessità di memorizzare un plurale per "indice" era un puro sovraccarico: non ci aiutava in alcun modo a comunicare. Non commettere errori, c'erano i grammatici nazisti a cui piaceva correggere coloro che passavano agli "indici". Certo, la grammatica nazista perse. Questo è il modo in cui il rasoio di Occam elimina i dettagli inutili se l'intera cosa rimane rilevante abbastanza a lungo.

Quindi prendiamolo semplice: conoscere la differenza tra righe e record non aggiunge assolutamente nulla alla nostra capacità di sviluppare e mantenere database. Molti eccellenti professionisti usano file e record in modo intercambiabile, ma sviluppano sistemi fantastici. Come tale, il rasoio di Occam alla fine dovrebbe eliminare la distinzione e la prossima generazione dovrà imparare un fatto meno inutile. Se, ovviamente, SQL è ancora rilevante in quel momento.


5

Per citare il libro di CJ Date "Un'introduzione ai sistemi di database" " Le righe di tale tabella possono essere pensate come i record del file ... "

Quindi, per i database, è Row.


4

Risposta breve :

  • Un record è un pezzo di dati memorizzati (o raccolti).
  • Una riga è un record memorizzato linearmente.
  • Ove possibile, usa il termine più specifico.

Nota: le tabelle memorizzano i record in modo lineare e le query restituiscono i risultati in modo lineare

Supporto :

Definizioni aggiuntive da tutto il Web:

  • "Riga" SQL ( 1 , 2 )
  • "Record" SQL ( 1 , 2 )
  • "record" ( 1 , 2 , 3 , 4 )
  • "riga" ( 1 , vedere anche 2 , 3 , 4 )
  • Row vs Record on StackOverflow ( 1 , 2 )

È da notare che le definizioni SQL generalmente seguono la definizione inglese.

Se hai una definizione che ritieni dovrebbe essere qui, ti preghiamo di aggiungerla ai commenti.
Sono particolarmente interessato alle definizioni dallo standard SQL o alla documentazione di un'implementazione.

La citazione è stata sollevata "Le righe non sono record". Tolto dal contesto questo sembrerebbe contraddire le mie affermazioni precedenti (e quelle di molti professionisti del database). Ma, se leggi l'intero post ( 1 Cerca la citazione) di Joe Celko (aka - Celko -) diventa chiaro che Joe Celko sta cercando di correggere un'idea sbagliata di un individuo che Joe Celko crede che derivi dalla persona " ... background nell'elaborazione dei dati con file system tradizionali ... ". In breve Joe Celko sta dicendo che le righe SQL non funzionano allo stesso modo dei record in altri sistemi. Joe Celko non rivendica il diritto / privilegio di definire un termine, sta cercando di chiarire una mancata comprensione derivante dall'applicazione errata di principi da un modello di archiviazione a un altro.


3
Apprezzo il lavoro e ho pensato che ci hai messo dentro. Noterò che la differenziazione di Celko ha lo scopo di evidenziare le differenze tra i sistemi RDBMS e i file flat COBOL che hanno preceduto il RDBMS. Ergo, sta enfatizzando la "riga" come parte di uno schema RDBMS e un "record" come parte costituente di un file flat.
Scambio
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.