Qual é a diferença entre um "registro" e uma "linha" no SQL Server?

56

Havia uma pergunta bastante inócua sobre a adição de datas e horas no SQL Server que desencadeou um debate taxonômico bastante fascinante.

Então, como diferenciamos esses termos relacionados e como os usamos corretamente?

Linha

Registro

swasheck
fonte
32
Um impulsiona um ofício, o outro é usado por descolados sujos para tocar música
billinkc
11
Uma publicação relacionada ao SO mostra claramente que essa é uma questão importante.
Dezso
Observe que no Postgres e Oracle uma única linha pode conter vários registros ...
a_horse_with_no_name

Respostas:

69

Para citar Joe Celko (não apenas você pode encontrar essa referência em toda a web e em sua entrada na Wikipedia , mas também a verá em camisetas em algumas conferências):

Linhas não são registros.

Muitas pessoas o apontam como um idiota pedante que gosta de humilhar e abusar verbalmente de novatos, e eu admito que é assim que ele se apresenta. Mas também o conheci pessoalmente - até compartilhei uma refeição com ele - e não posso dizer o quão diferente a personalidade dele da vida real é da frente online. Eu até o peguei chamando registros de filas, e ele ficou muito envergonhado ( história completa aqui ).

Na verdade, eu vesti essa camisa na conferência PASS em Grapevine, Texas, em 2006

De qualquer forma, diga o que quiser sobre o personagem on-line do cara, mas ele escreveu o padrão , e o fato de que essa autoridade dita que há uma distinção deve lhe dizer algo. E, por mais que se arrependa quando alguém chama uma fila de registro, o mesmo acontece com muitos de meus colegas - que também são especialistas no mundo do SQL Server. E aqueles de nós naquele campo acreditam que ele está certo.

Por exemplo, Itzik Ben-Gan, um óbvio guru do SQL Server. Aqui está uma citação da primeira lição de seu Kit de treinamento (Exame 70-461): Consultando o Microsoft SQL Server 2012 :

Como exemplo de termos incorretos no T-SQL, as pessoas costumam usar os termos "campo" e "registro" para se referir ao que o T-SQL chama de "coluna" e "linha", respectivamente. Campos e registros são físicos. Os campos são o que você possui nas interfaces com o usuário nos aplicativos clientes e os registros são os que você possui nos arquivos e cursores. As tabelas são lógicas e possuem linhas e colunas lógicas.

E, conhecendo Itzik, se você enviar um e-mail ou encurralá-lo em uma conferência, ele contará o mesmo com prazer. Se você chama uma linha de registro, na opinião dele, não está usando a terminologia corretamente.

Agora, sendo um setor cheio de pessoas de todos os tipos, é provável que você encontre materiais (como os artigos sobre tecnologia alvo publicados em outra resposta) que parecem fazer distinções muito sutis entre os dois, e você encontrará muitas pessoas no setor considere-os da mesma forma (conheço várias pessoas na Microsoft e outras como Brent Ozar, que sempre chamarão isso de registro). Isso não os torna certos, é apenas a maneira deles de encarar - eles vêem lógico e físico como o mesmo (pelo menos nesse contexto) e muitos deles provavelmente pensam que o resto de nós somos apenas retentores analistas que passam muito tempo em semântica.

Como nenhum fornecedor pode dizer "chamá-los-á {registros | linhas}", sempre estaremos lidando com esse argumento, porque sempre haverá alguém que não entende o lógico versus o físico ou que foi ensinado de maneira diferente, ou vieram do Access ou da programação, etc. Assim como algumas pessoas dizem tomay-to e outras dizem tomah-to, sempre haverá várias pessoas que variam de "são iguais" a "completamente diferentes "- e muitos tons no meio. Novamente, isso não os torna certos, porque ninguém pode ser a autoridade máxima sobre isso. Mas no espaço do SQL Server, há definitivamente uma maioria.


Dito isto, IMHO, quando você está falando sobre dados que estão em uma tabela, você chama isso de uma linha. Ao executar uma inserção, você está inserindo uma linha em uma tabela. Ao executar uma atualização, você está atualizando uma linha que está em uma tabela. E quando você executa um SELECT, está recuperando linhas de uma tabela.

Sinta-se à vontade para chamá-lo de registro assim que seu aplicativo tiver acesso a ele. Mas não fique bravo se você disser "inseri um registro" e alguém o corrigir.

Aaron Bertrand
fonte
33

A Microsoft possui em vários locais da organização, desde que o nome oficial do armazenamento de dados tabulares por entrada na tabela (para cunhar uma definição taxonômica que atenda a meu próprio propósito) seja chamado de "ROW". Submeto como prova ROW_NUMBER, ROWCOUNT, ROWVERSIONea DataTable.Rowspropriedade, onde um DataTableé uma representação C # de um objeto TSQL "mesa". Nesse caso, as propriedades do MSDN como um todo incentivam o uso de rowpara se referir a uma coleção de dados que é uma entrada em uma tabela. (note que estou tentando evitar o uso de "registro" ou "linha" para definir isso, esse é o ponto de interrogação)

No entanto, a linguagem é que um aplicativo lida com os "registros" do usuário. Algo único sobre um registro que pode não ser diretamente representado por uma única linha de armazenamento é o fato de um registro poder ter sub-registros. É verdade que uma tabela pode ter tabelas muitos-para-um relacionadas, mas essas não são armazenadas de forma contígua, mas são armazenadas logicamente.

Portanto, uma linha é a coisa em uma tabela e um registro é a coisa com a qual o desenvolvedor trabalha no uso prático.

jcolebrand
fonte
8
Pode-se argumentar que a ROW é a entidade lógica, enquanto a RECORD é a entidade física. Uma ROW pode ter vários registros: um no índice clusterizado, vários nos índices NC. Uma linha que não cabe na página pode ser dividida entre o registro na página e os registros excedentes no armazenamento SLOB. Um valor BLOB de um campo de uma linha pode abranger vários registros TEXT no armazenamento BLOB. Uma linha em um heap pode consistir em um registro de stub e um registro de encaminhamento. Etc etc.
Remus Rusanu
Em seguida, você removeria completamente o uso do registro de palavras do domínio do aplicativo ou turvaria completamente as águas e nos afastaria de termos definíveis e entraria no reino dos detalhes teóricos do design e da implementação do banco de dados. Você levanta bons pontos, mas a partir da convenção de aplicativos x bancos de dados, que é onde 80% de nossos leitores se sentirão à vontade, minha resposta ainda é válida.
jcolebrand
4
Não estou contradizendo sua resposta, talvez eu tenha errado as palavras. Eu apenas apresentei como as coisas são vistas pelo próprio mecanismo do SQL, onde a camada de acesso físico as chama de 'registros' versus a camada de processamento (linguagem) de consulta que lida com 'linhas'.
Remus Rusanu 13/01
Eu vejo. Eu ainda sinto que isso turva as águas. Sem ofensa, garanto.
Jcolebrand
31

Acabei de pesquisar no documento "Tecnologia da informação - Linguagens de banco de dados - SQL Parte 2: Foundation (SQL / Foundation)", que define o padrão ANSI para SQL conforme implementado por todos os principais RDBMSes.

A palavra rowé usada principalmente em todo o documento várias centenas de vezes, conforme o esperado.

A palavra recordfoi usada apenas para descrever um registro semelhante a um registro usado no Oracle PL / SQL (descrevendo especificamente os tipos de dados do registro ADA). 6 menções no documento.

Eu acho que isso esclarece essa pergunta e responde aos vários argumentos de ambos os lados.


informação adicional

A partir de uma cópia do padrão SQL (versão preliminar do mais recente disponível gratuitamente), que pode ser encontrada em wiscorp.com (a página Padrões SQL tem várias outras versões e revisões mais antigas).

A pesquisa no 7IWD2-02-Foundation-2011-12.pdf , com uma data de 2011-12-21, revela que a palavra linha aparece 2277 vezes no documento enquanto o registro de palavras aparece apenas 21 vezes, como o verbo "registro" ou em alguns apêndices no final, nas especificações das correspondências de tipo de dados para tipos de dados SQL e tipos de idioma do host (Ada, Pascal).

Além disso, o mesmo documento tem na página 57 (grifo meu):

4.15.1 Introdução às tabelas

Esta subcláusula é modificada pela subcláusula 4.10.1, “Introdução às tabelas”, na ISO / IEC 9075-9.

Uma tabela é uma coleção de zero ou mais linhas, em que cada linha é uma sequência de um ou mais valores de coluna. O tipo mais específico de uma linha é um tipo de linha. Cada linha de uma determinada tabela possui o mesmo tipo de linha, chamado tipo de linha dessa tabela. O valor do i-ésimo campo de cada linha de uma tabela é o valor da i-ésima coluna dessa linha da tabela. A linha é a menor unidade de dados que pode ser inserida em uma tabela e excluída de uma tabela.

O grau de uma tabela e o grau de cada uma de suas linhas é o número de colunas dessa tabela. O número de linhas em uma tabela é sua cardinalidade. Uma tabela cuja cardinalidade é 0 (zero) é considerada vazia.

Uma tabela é uma tabela base , uma tabela derivada ou uma tabela transitória .


No que diz respeito aos DBMSs que usam SQL:

Linhas não são registros , campos não são colunas, tabelas não são arquivos!

Philᵀᴹ
fonte
14

Como os bancos de dados relacionais raramente são usados ​​isoladamente, para evitar confusão entre outras partes dos sistemas, sempre me refiro a tabelas, linhas e colunas. Em aplicativos clientes, normalmente temos outras construções, incluindo datareaders, datasets, datarows, datatables, etc. .

Às vezes, em um design de sistema, a idéia de um "Registro" pode ser usada para significar algo mais amplo que uma única linha. Pode ser uma briga e é história. Assim como quando falamos de uma linha excluída, podemos significar uma linha que é simplesmente marcada como excluída com uma coluna ou "movida" para uma tabela excluída (e não simplesmente a ausência de uma linha que, por não existir, é bastante difícil de fixe). Há apenas um uso mais variado do termo Registro.

Tabelas, linhas e colunas são geralmente terminologia aceita para se referir a essas entidades em bancos de dados relacionais, incluindo documentos e trabalhos de Codd e Date, e a maioria dos profissionais de banco de dados prefere essa terminologia por ser mais inequívoca.

Geralmente, não há ambiguidade quando se fala em linhas e colunas - outras pessoas entendem que você está falando sobre o design físico do banco de dados subjacente e não qualquer outro tipo de artefato de um design lógico antes do design físico ou de quaisquer entidades emergentes do sistema posteriores, como campos em um tela.

Cade Roux
fonte
9

Embora sua pergunta já esteja respondida muito bem. Eu também gostaria de acrescentar meus pontos. Pode ser que você ache útil até certo ponto. Além disso, minha resposta não é específica para o SQL Server

Essas palavras são usadas de forma intercambiável.

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

Column =  Field   =  Attribute    =  Attribute

table  =  File    =  Relation     =  Entity Types(or Entity Set)
  • 4 terminologia boa para usar quando aprendemos módulos ER
  • 3 uso quando o Modelo Relacional
  • 2 cena geral, DataBase books start with these terminologyporque essas são muito comumente usadas pelas pessoas na vida real, também no sistema de arquivos.

Registro é a unidade básica no sistema de armazenamento que possui significado implícito. No DBMS, a palavra recorduse no capítulo descreve como as tabelas do banco de dados são armazenadas em blocos de disco. No DBMS, a record-oriented file-systemé um sistema de arquivos em que os arquivos são armazenados como coleções de registros.

Grijesh Chauhan
fonte
9

A linguagem continua evoluindo. Algumas décadas atrás, as pessoas alfabetizadas usavam "índices" em vez de "índices" mais simples. Ao mudarmos para "índices", eliminamos uma complicação desnecessária e tornamos a linguagem mais útil. A necessidade de memorizar um plural para "índice" era pura sobrecarga - de forma alguma nos ajudou a nos comunicar. Não se engane, costumava haver nazistas de gramática que gostavam de corrigir aqueles que mudavam para "índices". Claro, a gramática nazista perdeu. É assim que a navalha da Occam elimina detalhes inúteis se tudo permanecer relevante por tempo suficiente.

Portanto, vamos com calma - saber que a diferença entre linhas e registros não acrescenta absolutamente nada à nossa capacidade de desenvolver e manter bancos de dados. Muitos profissionais excelentes usam linhas e registros de maneira intercambiável, mas desenvolvem sistemas impressionantes. Como tal, a lâmina de Occam acabará por eliminar a distinção, e a próxima geração terá que aprender um fato menos inútil. Se, é claro, o SQL ainda for relevante naquele momento.

AK
fonte
5

Para citar o livro de CJ Date "Uma Introdução aos Sistemas de Banco de Dados" " As linhas dessa tabela podem ser consideradas os registros do arquivo ... "

Então, para bancos de dados, é Row.

Andrew Peterson
fonte
4

Resposta curta :

  • Um registro é um pedaço de dados armazenados (ou coletados).
  • Uma linha é um registro armazenado linearmente.
  • Sempre que possível, use o termo mais específico.

Nota: as tabelas armazenam registros linearmente e as consultas retornam resultados linearmente

Suporte :

Definições adicionais de toda a web:

  • "Linha" do SQL ( 1 , 2 )
  • "Registro" SQL ( 1 , 2 )
  • "registro" ( 1 , 2 , 3 , 4 )
  • "linha" ( 1 , veja também 2 , 3 , 4 )
  • Linha vs Registro no StackOverflow ( 1 , 2 )

É notável que as definições de SQL geralmente sigam a definição em inglês.

Se você tem uma definição que acha que deveria estar aqui, adicione-a aos comentários.
Estou especialmente interessado nas definições do padrão SQL ou na documentação de uma implementação.

A cotação foi apresentada "Linhas não são registros". Tirado do contexto, isso parece contradizer minhas afirmações anteriores (e as de muitos profissionais de banco de dados). Mas, se você ler o post completo ( 1 Procure a citação) de Joe Celko (também conhecido como --CELKO--), fica claro que Joe Celko está tentando corrigir um equívoco de um indivíduo que Joe Celko acredita que surja da pessoa " ... experiência em processamento de dados com sistemas de arquivos tradicionais ... ". Em resumo, Joe Celko está dizendo que as linhas SQL não funcionam da mesma maneira que os registros em outros sistemas. Joe Celko não está reivindicando o direito / privilégio de definir um termo, ele está tentando esclarecer uma falta de entendimento causada pela aplicação incorreta dos princípios de um modelo de armazenamento para outro.

Trisped
fonte
3
Agradeço o trabalho e pensei que você colocasse nisso. Observarei que a diferenciação da Celko visa extrair as diferenças entre os sistemas RDBMS e COBOL de arquivos simples que precederam o RDBMS. Portanto, ele está enfatizando a "linha" como parte de um esquema RDBMS e um "registro" como parte constituinte de um arquivo simples.
swasheck