stringtranslate.com

Registro (informática)

En informática , un registro (también llamado estructura , estructura o datos compuestos ) es una estructura de datos básica . Los registros de una base de datos u hoja de cálculo suelen denominarse " filas ". [1] [2] [3] [4]

Un registro es una colección de campos , posiblemente de diferentes tipos de datos, normalmente en un número y secuencia fijos. [5] Los campos de un registro también pueden denominarse miembros , particularmente en programación orientada a objetos ; Los campos también pueden denominarse elementos , aunque esto corre el riesgo de confusión con los elementos de una colección .

Por ejemplo, una fecha podría almacenarse como un registro que contenga un campo numérico de año , un campo de mes representado como una cadena y un campo numérico de día del mes . Un registro de personal puede contener un nombre , un salario y un rango . Un registro de círculo puede contener un centro y un radio ; en este caso, el centro mismo podría representarse como un registro de punto que contiene las coordenadas xey .

Los registros se distinguen de las matrices por el hecho de que su número de campos se determina en la definición del registro y por el hecho de que los registros son un tipo de datos heterogéneos; no todos los campos deben contener el mismo tipo de datos. [6]

Un tipo de registro es un tipo de datos que describe dichos valores y variables. La mayoría de los lenguajes informáticos modernos permiten al programador definir nuevos tipos de registros. La definición incluye especificar el tipo de datos de cada campo y un identificador (nombre o etiqueta) mediante el cual se puede acceder. En teoría de tipos , los tipos de productos (sin nombres de campos) generalmente se prefieren debido a su simplicidad, pero los tipos de registros adecuados se estudian en lenguajes como System F-sub . Dado que los registros de teoría de tipos pueden contener campos tipificados con funciones de primera clase además de datos, pueden expresar muchas características de la programación orientada a objetos .

Los registros pueden existir en cualquier medio de almacenamiento, incluida la memoria principal y los dispositivos de almacenamiento masivo , como cintas magnéticas o discos duros . Los registros son un componente fundamental de la mayoría de las estructuras de datos, especialmente de las estructuras de datos vinculados . Muchos archivos informáticos están organizados como conjuntos de registros lógicos , a menudo agrupados en bloques o registros físicos más grandes para mayor eficiencia.

Los parámetros de una función o procedimiento a menudo pueden verse como los campos de una variable de registro; y los argumentos pasados ​​a esa función se pueden ver como un valor de registro que se asigna a esa variable en el momento de la llamada. Además, en la pila de llamadas que se utiliza a menudo para implementar llamadas a procedimientos, cada entrada es un registro de activación o marco de llamada , que contiene los parámetros del procedimiento y las variables locales, la dirección del remitente y otros campos internos.

Un objeto en lenguaje orientado a objetos es esencialmente un registro que contiene procedimientos especializados para manejar ese registro; y los tipos de objetos son una elaboración de los tipos de registros. De hecho, en la mayoría de los lenguajes orientados a objetos, los registros son sólo casos especiales de objetos y se conocen como estructuras de datos antiguas (PODS), para contrastar con los objetos que utilizan características OO.

Un registro puede verse como el análogo informático de una tupla matemática , aunque una tupla puede considerarse o no un registro, y viceversa, según las convenciones y el lenguaje de programación específico. En la misma línea, un tipo de registro puede verse como el análogo en lenguaje informático del producto cartesiano de dos o más conjuntos matemáticos , o la implementación de un tipo de producto abstracto en un lenguaje específico.

Llaves

Un registro puede tener cero o más claves . Una clave asigna una expresión a un valor o un conjunto de valores en el registro. Una clave primaria es única en todos los registros almacenados; Sólo existe una de esta clave. [7] En otras palabras, no puede existir ningún duplicado para ninguna clave primaria. Por ejemplo, un archivo de empleado puede contener el número, nombre, departamento y salario del empleado. El número de empleado será único en la organización y sería la clave principal. Dependiendo del medio de almacenamiento y la organización del archivo, el número de empleado puede indexarse , lo que también se almacena en un archivo separado para agilizar la búsqueda. El código de departamento no es necesariamente único; también puede estar indexada, en cuyo caso se consideraría una clave secundaria o clave alternativa . [8] Si no está indexado, se tendría que escanear todo el expediente del empleado para producir una lista de todos los empleados de un departamento específico. Las claves generalmente se eligen de una manera que minimice las posibilidades de que una clave pueda asignar múltiples valores. Por ejemplo, el campo salario normalmente no se consideraría utilizable como clave, ya que es probable que muchos empleados tengan el mismo salario. La indexación es un factor que se considera al diseñar un archivo.

Historia

Hoja de diario del censo de Estados Unidos de 1880 , que muestra datos tabulares con filas de datos, cada una de las cuales es un registro correspondiente a una sola persona.

El concepto de registro se remonta a varios tipos de tablas y libros de contabilidad utilizados en contabilidad desde tiempos remotos. La noción moderna de registros en informática, con campos de tipo y tamaño bien definidos, ya estaba implícita en las calculadoras mecánicas del siglo XIX, como la máquina analítica de Babbage . [9] [10]

Tarjeta perforada de Hollerith (1895)

El medio original legible por máquina utilizado para los datos (a diferencia del control) fue la tarjeta perforada utilizada para los registros del censo de Estados Unidos de 1890 : cada tarjeta perforada era un registro único. Compárese la entrada del diario de 1880 y la tarjeta perforada de 1895. Los registros estaban bien establecidos en la primera mitad del siglo XX, cuando la mayor parte del procesamiento de datos se realizaba mediante tarjetas perforadas. Normalmente, cada registro de un archivo de datos se registraría en una tarjeta perforada, con columnas específicas asignadas a campos específicos. Generalmente, un registro era la unidad más pequeña que podía leerse desde un almacenamiento externo (por ejemplo, un lector de tarjetas, una cinta o un disco). El contenido de los registros estilo tarjeta perforada se llamó originalmente "registros unitarios" porque las tarjetas perforadas tenían longitudes de documento predeterminadas. [11] Cuando los sistemas de almacenamiento se volvieron más avanzados con el uso de discos duros y cintas magnéticas , los registros de longitud variable se convirtieron en el estándar. Un registro de longitud variable es un registro en el que el tamaño del registro en bytes es aproximadamente igual a la suma de los tamaños de sus campos. Esto no era posible antes de que se inventara el hardware de almacenamiento más avanzado porque todas las tarjetas perforadas tenían que ajustarse a longitudes de documentos predeterminadas que la computadora podía leer, ya que en ese momento las tarjetas tenían que introducirse físicamente en una máquina.

La mayoría de las implementaciones de lenguaje de máquina y los primeros lenguajes ensambladores no tenían una sintaxis especial para los registros, pero el concepto estaba disponible (y se usaba ampliamente) mediante el uso de registros de índice , direccionamiento indirecto y código automodificable . Algunas de las primeras computadoras, como la IBM 1620 , tenían soporte de hardware para delimitar registros y campos, e instrucciones especiales para copiar dichos registros.

El concepto de registros y campos fue central en algunas de las primeras utilidades de clasificación y tabulación de archivos , como el Generador de programas de informes (RPG) de IBM .

COBOL fue el primer lenguaje de programación generalizado que admitía tipos de registros,[12]y sus funciones de definición de registros eran bastante sofisticadas en ese momento. El lenguaje permite la definición de registros anidados con campos alfanuméricos, enteros y fraccionarios de tamaño y precisión arbitrarios, así como campos que dan formato automáticamente a cualquier valor que se les asigne (por ejemplo, inserción de signos de moneda, puntos decimales y separadores de grupos de dígitos). ). Cada archivo está asociado con una variable de registro donde se leen o escriben datos. COBOL también proporciona unaMOVE CORRESPONDINGdeclaración que asigna los campos correspondientes de dos registros según sus nombres.

Los primeros lenguajes desarrollados para computación numérica, como FORTRAN (hasta FORTRAN IV ) y Algol 60 , no tenían soporte para tipos de registros; pero versiones posteriores de esos lenguajes, como FORTRAN 77 y Algol 68 , los agregaron. El lenguaje de programación Lisp original también carecía de registros (a excepción de la celda de contras incorporada ), pero sus expresiones S proporcionaron un sustituto adecuado. El lenguaje de programación Pascal fue uno de los primeros lenguajes en integrar completamente los tipos de registros con otros tipos básicos en un sistema de tipos lógicamente consistente. El lenguaje de programación PL/I proporcionó registros de estilo COBOL. El lenguaje de programación C inicialmente proporcionó el concepto de registro como una especie de plantilla ( struct) que podía colocarse encima de un área de memoria, en lugar de un verdadero tipo de datos de registro. Estos últimos se proporcionaron finalmente (mediante la typedefdeclaración), pero los dos conceptos aún son distintos en el lenguaje. La mayoría de los lenguajes diseñados después de Pascal (como Ada , Modula y Java ) también admitían registros.

Aunque los registros ya no se utilizan con frecuencia en su contexto original (es decir, se utilizan únicamente con el fin de contener datos), los registros influyeron en los lenguajes de programación orientados a objetos más nuevos y en los sistemas de gestión de bases de datos relacionales . Dado que los registros proporcionaban más modularidad en la forma en que se almacenaban y manejaban los datos, son más adecuados para representar conceptos complejos del mundo real que los tipos de datos primitivos proporcionados por defecto en los idiomas. Esto influyó en lenguajes posteriores como C++ , Python , JavaScript y Objective-C , que abordan las mismas preocupaciones de modularidad de los programadores. [13] Los objetos en estos lenguajes son esencialmente registros con la adición de métodos y herencia , que permiten a los programadores manipular la forma en que se comportan los datos en lugar de solo el contenido de un registro. Muchos programadores consideran que los registros están obsoletos ahora, ya que los lenguajes orientados a objetos tienen características que superan con creces lo que los registros son capaces de hacer. Por otro lado, muchos programadores argumentan que la baja sobrecarga y la capacidad de usar registros en lenguaje ensamblador hacen que los registros sigan siendo relevantes cuando se programa con bajos niveles de abstracción . Hoy en día, los lenguajes más populares en el índice TIOBE , un indicador de la popularidad de los lenguajes de programación, se han visto influenciados de alguna manera por los registros debido a que están orientados a objetos. [14] Los lenguajes de consulta como SQL y el lenguaje de consulta de objetos también se vieron influenciados por el concepto de registros. Estos lenguajes permiten al programador almacenar conjuntos de datos, que son esencialmente registros, en tablas. [15] Estos datos se pueden recuperar utilizando una clave primaria . Las tablas en sí también son registros que pueden tener una clave externa : una clave que hace referencia a datos de otra tabla.   

Operaciones

La selección de un campo de un valor de registro produce un valor.

Algunos idiomas pueden proporcionar funciones que enumeran todos los campos de un registro, o al menos los campos que son referencias. Esta función es necesaria para implementar ciertos servicios como depuradores , recolectores de basura y serialización . Requiere cierto grado de polimorfismo de tipo .

En sistemas con subtipificación de registros, las operaciones sobre valores de tipo de registro también pueden incluir:

En tales entornos, un tipo de registro específico implica que está presente un conjunto específico de campos, pero los valores de ese tipo pueden contener campos adicionales. Por lo tanto , un registro con los campos x , y y z pertenecería al tipo de registros con los campos x e y , al igual que un registro con los campos x , y y r . La razón es que pasar un registro ( x , y , z ) a una función que espera un registro ( x , y ) como argumento debería funcionar, ya que esa función encontrará todos los campos que requiere dentro del registro. Muchas formas de implementar registros en la práctica en lenguajes de programación tendrían problemas para permitir tal variabilidad, pero la cuestión es una característica central de los tipos de registros en contextos más teóricos.

Asignación y comparación

La mayoría de los idiomas permiten la asignación entre registros que tienen exactamente el mismo tipo de registro (incluidos los mismos tipos de campos y nombres, en el mismo orden). Sin embargo, dependiendo del idioma, dos tipos de datos de registro definidos por separado pueden considerarse tipos distintos incluso si tienen exactamente los mismos campos.

Algunos idiomas también pueden permitir la asignación entre registros cuyos campos tienen nombres diferentes, haciendo coincidir cada valor de campo con la variable de campo correspondiente según sus posiciones dentro del registro; de modo que, por ejemplo, un número complejo con campos llamados realy imagpueda asignarse a una variable de registro de puntos 2D con campos Xy Y. En esta alternativa, todavía se requiere que los dos operandos tengan la misma secuencia de tipos de campo. Algunos idiomas también pueden requerir que los tipos correspondientes tengan el mismo tamaño y codificación, de modo que todo el registro pueda asignarse como una cadena de bits no interpretada . Otros lenguajes pueden ser más flexibles a este respecto y requieren únicamente que cada campo de valor pueda asignarse legalmente al campo variable correspondiente; de modo que, por ejemplo, un campo de entero corto pueda asignarse a un campo de entero largo , o viceversa.

Otros lenguajes (como COBOL ) pueden hacer coincidir campos y valores por sus nombres, en lugar de por sus posiciones.

Estas mismas posibilidades se aplican a la comparación de dos valores récord para determinar la igualdad. Algunos idiomas también pueden permitir comparaciones de orden ('<'y '>'), utilizando el orden lexicográfico basado en la comparación de campos individuales. [ cita necesaria ]

PL/I permite los dos tipos de asignación anteriores y también permite expresiones de estructura , como a = a+1;donde "a" es un registro o estructura en la terminología de PL/I.

Selección de campo distributivo de Algol 68

En Algol 68, si Ptsera una matriz de registros, cada uno con campos enteros Xy Y, se podía escribir para obtener una matriz de números enteros, que constaba de los campos de todos los elementos de . En consecuencia, las declaraciones y tendrían el mismo efecto.Y of PtsYPtsY of Pts[3] := 7(Y of Pts)[3] := 7

La declaración "con" de Pascal

En el lenguaje de programación Pascal , el comando with R do Sejecutaría la secuencia de comandos Scomo si todos los campos del registro Rhubieran sido declarados como variables. De manera similar a ingresar un espacio de nombres diferente en un lenguaje orientado a objetos como C# , ya no es necesario usar el nombre del registro como prefijo para acceder a los campos. Entonces, en lugar de escribir, Pt.X := 5; Pt.Y := Pt.X + 3se podría escribir .with Pt do begin X := 5; Y := X + 3 end

Representación en la memoria

La representación de registros en memoria varía según los lenguajes de programación. Normalmente los campos se almacenan en posiciones consecutivas en la memoria, en el mismo orden en que se declaran en el tipo de registro. Esto puede dar como resultado que dos o más campos se almacenen en la misma palabra de memoria; de hecho, esta característica se utiliza a menudo en la programación de sistemas para acceder a fragmentos específicos de una palabra. Por otro lado, la mayoría de los compiladores agregarán campos de relleno, en su mayoría invisibles para el programador, para cumplir con las restricciones de alineación impuestas por la máquina; por ejemplo, que un campo de punto flotante debe ocupar una sola palabra.

Algunos lenguajes pueden implementar un registro como una matriz de direcciones que apuntan a los campos (y, posiblemente, a sus nombres y/o tipos). Los objetos en lenguajes orientados a objetos a menudo se implementan de maneras bastante complicadas, especialmente en lenguajes que permiten herencia de clases múltiples .

Registros autodefinidos

Un registro autodefinido es un tipo de registro que contiene información para identificar el tipo de registro y localizar información dentro del registro. Puede contener desplazamientos de elementos; Por lo tanto, los elementos pueden almacenarse en cualquier orden o pueden omitirse. [16] La información almacenada en un registro autodefinido puede interpretarse como metadatos para el registro, que es similar a lo que uno esperaría encontrar en los metadatos de UNIX con respecto a un archivo, que contiene información como la hora de creación del registro y el tamaño. del registro en bytes . Alternativamente, varios elementos del registro, cada uno de los cuales incluye un identificador de elemento, pueden simplemente sucederse unos a otros en cualquier orden.

Ver también

Referencias

  1. ^ "Definiciones del Diccionario de Ciencias de la Computación". Estudiantes de Computación . Consultado el 22 de enero de 2018 .
  2. ^ Radványi, Tibor (2014). Sistemas de gestión de bases de datos. Colegio Eszterházy Károly. pag. 19. Archivado desde el original el 23 de septiembre de 2018 . Consultado el 23 de septiembre de 2018 .
  3. ^ Kahate, Atul (2006). Introducción a los Sistemas Gestores de Bases de Datos. Pearson. pag. 3.ISBN _ 978-81-317-0078-5. Consultado el 23 de septiembre de 2018 .
  4. ^ Connolly, Thomas (2004). Soluciones de bases de datos: una guía paso a paso para crear bases de datos (2ª ed.). Pearson. pag. 7.ISBN _ 978-0-321-17350-8.
  5. ^ Felleisen, Matías (2001). Cómo diseñar programas . Prensa del MIT. págs.53, 60. ISBN 978-0262062183.
  6. ^ Pape, Tobías; Kirilichev, Vasily; Bolz, Carl Friedrich; Hirschfeld, Robert (13 de enero de 2017). "Estructuras de datos de registro en raqueta: análisis y optimización de uso". Revisión de Computación Aplicada ACM SIGAPP . 16 (4): 25–37. doi :10.1145/3040575.3040578. ISSN  1559-6915. S2CID  14306162.
  7. ^ "Agregar o cambiar la clave principal de una tabla en Access". soporte.microsoft.com . Consultado el 1 de marzo de 2022 .
  8. ^ "Clave alternativa: preguntas frecuentes de Oracle". www.orafaq.com . Consultado el 1 de marzo de 2022 .
  9. ^ Bromley, Allan (octubre de 1998). "Máquina analítica de Charles Babbage, 1838". Anales IEEE de la historia de la informática . 20 (4): 29–45. doi : 10.1109/85.728228. S2CID  2285332 . Consultado el 23 de septiembre de 2018 .
  10. ^ Swade, Doron. "Computación automática: Charles Babbage y el método computacional". El diario de Rutherford . Consultado el 23 de septiembre de 2018 .
  11. ^ Edwin D. Reilly; Antonio Ralston; David Hemmendinger, eds. (2003). Enciclopedia de informática (4ª ed.). Chichester, Reino Unido: Wiley. ISBN 978-1-84972-160-8. OCLC  436846454.
  12. ^ Sebesta, Robert W. (1996). Conceptos de lenguajes de programación (Tercera ed.). Addison-Wesley Publishing Company, Inc. pág. 218.ISBN _ 0-8053-7133-8.
  13. ^ Levaduras, Gary T.; Weihl, William E. (1990). "Razonamiento sobre programas orientados a objetos que utilizan subtipos". Actas de la conferencia europea sobre programación orientada a objetos en sistemas, lenguajes y aplicaciones de programación orientada a objetos - OOPSLA/ECOOP '90. Nueva York, Nueva York, Estados Unidos: ACM Press. págs. 212-223. doi :10.1145/97945.97970. ISBN 0-201-52430-9. S2CID  46526.
  14. ^ "índice | TIOBE - La empresa de calidad del software". www.tiobe.com . Consultado el 1 de marzo de 2022 .
  15. ^ "¿Qué es una base de datos relacional (RDBMS)?". Oráculo . Consultado el 28 de febrero de 2022 .
  16. ^ Kraimer, Martin R. "Guía del desarrollador de aplicaciones del controlador de entrada/salida (IOC) EPICS". Laboratorio Nacional Argonne . Consultado el 25 de noviembre de 2015 .