Szerkesztő:Olahadam98/Rekord (számítástechnika)

A Wikipédiából, a szabad enciklopédiából

Számítástechnikában a rekord (amit néha struktúrának, structnak vagy összetett adatnak is neveznek) egy alapvető adatszerkezet. Rekordokat adatbázisokban vagy táblázatokban általában "soroknak" neveznek. [1] [2] [3] [4]

A rekord egy mezők gyűjteménye, amelyek lehetnek különböző adattípusúak, általában fix számúak és sorrendben vannak elhelyezve. [5] A rekord mezőit néha tagoknak is nevezik, különösen az objektumorientált programozásban; a mezőket elemeknek is nevezhetjük, bár ez összetéveszthető a gyűjtemény elemeivel.

Például egy dátumot tárolhatunk egy rekordban, amely tartalmaz egy numerikus évszám mezőt, egy stringként ábrázolt hónapmezőt és egy numerikus hónapnap mezőt. Egy személyi rekord tartalmazhat nevet, fizetést és rangot. Egy kör rekord tartalmazhat egy középpontot és egy sugarat - ebben az esetben a központot maga is egy pont rekordként ábrázolhatjuk, amely tartalmazza az x és y koordinátákat.

A rekordok megkülönböztethetők tömböktől azzal a jellemzővel, hogy mezőik száma a rekord definíciójában van meghatározva, és a rekordok egy heterogén adattípusok; nem minden mezőnek kell ugyanolyan típusú adatot tartalmaznia. [6]

A rekord típus egy olyan adattípus, amely leírja az ilyen értékeket és változókat. A legtöbb modern számítógépes nyelv lehetővé teszi a programozó számára, hogy definiáljon új rekord típusokat. A definíció magában foglalja minden mező adattípusának és azonosítójának (név vagy címke) meghatározását, amelyen keresztül hozzáférhetők. A típuselméletben általában a termék típusokat (amelyeknek nincsenek mezőneveik) részesítik előnyben egyszerűségük miatt, de a megfelelő rekord típusokat tanulmányozzák olyan nyelvekben, mint például a System F-sub. Mivel a típuselméleti rekordok adatok mellett elsőrendű funkciókkal rendelkező mezőket is tartalmazhatnak, képesek kifejezni az objektumorientált programozás számos jellemzőjét.

Rekordok létezhetnek bármely tárolóeszközön, beleértve a főmemóriát és a tömeges tárolóeszközöket, például a mágnesszalagokat vagy merevlemezeket. A rekordok alapvető komponensei a legtöbb adatszerkezetnek, különösen a kapcsolt adatszerkezeteknek. Sok számítógépes fájl logikai rekordok tömbje formájában van szervezve, gyakran hatékonyabbá téve azokat nagyobb fizikai rekordokba vagy blokkokba csoportosítással.

Egy függvény vagy eljárás paramétereit gyakran úgy lehet tekinteni, mint egy rekordváltozó mezőit; és a függvénynek átadott argumentumok tekinthetők úgynevezett rekordértéknek, amelyet a híváskor a változónak rendelnek. Ezenkívül, a gyakran használt hívások implementálásához használt hívási veremben minden bejegyzés egy aktivációs rekord vagy hívási keret, amely tartalmazza az eljárás paramétereit és helyi változóit, a visszatérési címet és egyéb belső mezőket.

Egy objektum az objektumorientált nyelvekben lényegében egy rekord, amely eljárásokat tartalmaz a rekord kezelésére; és az objektumtípusok a rekordtípusok bővítése. Valójában a legtöbb objektumorientált nyelvben a rekordok csak az objektumok speciális esetei, és egyszerű adatstruktúráknak (PODSs) nevezik őket az objektumoktól megkülönböztetve, amelyek OO funkciókat használnak.

Egy rekordot tekinthetünk a számítógépes analógjának egy matematikai tuple-nek, bár egy tuple-t lehet vagy nem lehet tekinteni rekordnak, és fordítva, a konvencióktól és a konkrét programozási nyelvtől függően. Hasonlóan, egy rekord típust tekinthetünk a számítógépes nyelv analógjának két vagy több matematikai halmaz Descartes-szorzatának, vagy az absztrakt terméktípus megvalósításának egy adott nyelvben.

Kulcsok[szerkesztés]

Egy rekordnak lehet nullánál több kulcsa. Egy kulcs kifejezést vagy értéket, illetve érték halmazt képez a rekordban. Egy elsődleges kulcs egy olyan kulcs, amely egyedülálló az összes tárolt rekordon belül; csak egy ilyen kulcs létezik. [7] Más szóval, egyetlen elsődleges kulcshoz sem lehet duplikátum. Például egy alkalmazott fájl tartalmazhat alkalmazott számot, nevet, osztályt és fizetést. Az alkalmazott szám egyedülálló lesz a szervezetben, és ez lesz az elsődleges kulcs. A tárolóeszköztől és a fájl szervezésétől függően az alkalmazott szám lehet indexelve - azaz külön fájlban is tárolódik, hogy gyorsabban lehessen keresni. Az osztály kódja nem feltétlenül egyedi; indexelve is lehet, ilyen esetben másodlagos kulcsnak vagy alternatív kulcsnak számít. [8] Ha nincs indexelve, akkor az alkalmazott fájl teljes tartalmát át kell szkennelni az összes adott osztályban dolgozó alkalmazott listázásához. A kulcsok általában úgy vannak kiválasztva, hogy minimalizálják annak a lehetőségét, hogy több érték ésszerűen leképezhető legyen egy kulcsra. Például a fizetés mezőt általában nem tekintik kulcsnak, mivel sok alkalmazottnak valószínűleg ugyanaz a fizetése van. Az indexelés egy tényező, amelyet figyelembe vesznek egy fájl tervezésekor.

Történelem[szerkesztés]

1880-as Egyesült Államok népszámlálási lapja, amely táblázatos adatokat mutat, adatsorokkal, minden adatsor egy rekordnak felel meg, ami egyetlen személyhez tartozik.

A rekord fogalmát különféle típusú táblázatok és könyvelőkönyvek használatáig lehet visszavezetni, amelyek az idők kezdete óta használatosak a számvitelben. A modern rekord fogalma a számítástechnikában, jól meghatározott típusú és méretű mezőkkel, már implicit módon jelen volt a 19. századi mechanikus számológépekben, például Babbage Analitikus Gépében. [9] [10]

Hollerith lyukkártya (1895)

Az eredeti gépi olvasható adathordozó (ellentétben a vezérléssel) a lyukkártya volt, amelyet rekordokhoz használtak az 1890-es Egyesült Államok népszámlálásakor: minden lyukkártya egyetlen rekordot tartalmazott. Hasonlítsuk össze az 1880-as naplóbejegyzést és a 1895-ös lyukkártyát. A rekordok jól kialakultak voltak a 20. század első felében, amikor a legtöbb adatfeldolgozás lyukkártyák segítségével történt. Általában egy adatfájl rekordja egy lyukkártyára került rögzítésre, ahol meghatározott oszlopok lettek kijelölve a különböző mezőkhöz. Általában egy rekord volt a legkisebb egység, amelyet külső tárolóból be lehetett olvasni (például lyukkártyaolvasóval, szalag vagy lemez segítségével). A lyukkártya stílusú rekordok tartalma eredetileg "egység rekordoknak" nevezték el, mivel a lyukkártyáknak előre meghatározott dokumentumhosszúságuk volt.[11] Amikor az adattároló rendszerek fejlettebbé váltak a merevlemezek és a mágneses szalagok használatával, a változó hosszúságú rekordok váltak az új szabvánnyá. Egy változó hosszúságú rekord olyan rekord, amelynek a mérete byte-okban körülbelül megegyezik a mezői méreteinek összegével. Ez nem volt lehetséges korábban, amíg nem találtak ki fejlettebb tároló hardvereket, mert minden lyukkártyának meg kellett felelnie előre meghatározott dokumentumhosszúságoknak, amelyeket a számítógép tudott olvasni, mivel akkoriban a kártyákat fizikailag be kellett adagolni egy gépbe.

A legtöbb gépi kód és korai assemblynyelv nem rendelkezett különleges szintaxissal a rekordokhoz, de a fogalom elérhető volt (és széles körben használták) indexregiszterek, közvetett hivatkozások és önmoduláló kód használatával. Néhány korai számítógép, mint például az IBM 1620, hardveres támogatással rendelkezett a rekordok és mezők elhatárolásához, valamint különleges utasításokkal a rekordok másolásához.

A rekordok és mezők fogalma központi szerepet játszott néhány korai fájl rendezési és táblázatolási segédprogramban, például az IBM Report Program Generator (RPG) nevűben.

A COBOL volt az első elterjedt programozási nyelv, amely támogatta a rekord típusokat,[12] és a rekorddefiníciós lehetőségei akkoriban elég kifinomultak voltak. A nyelv lehetővé teszi a beágyazott rekordok meghatározását alfanumerikus, egész és tört mezőkkel, tetszőleges méretű és pontosságúak lehetnek, valamint olyan mezőkkel, amelyek automatikusan formázzák az értéket, amit hozzárendelünk (például pénznem jelek, tizedes pontok és számjegycsoport-elválasztók beillesztése). Minden fájlhoz egy rekordváltozó van társítva, amelybe az adatok beolvasódnak vagy kiíródnak. A COBOL továbbá biztosít egy MOVE CORRESPONDING utasítást, amely a megfelelő nevek alapján hozzárendeli két rekord megfelelő mezőit.

A numerikus számításokhoz fejlesztett korai nyelvek, mint például a FORTRAN (FORTRAN IV-ig) és az Algol 60, nem támogatták a rekord típusokat. Azonban a későbbi verziók, mint például a FORTRAN 77 és az Algol 68, hozzáadták ezeket a lehetőségeket. Az eredeti Lisp programozási nyelv is hiányzott a rekordoktól (kivéve a beépített cons cellát), de az S-kifejezések megfelelő pótlékot nyújtottak. A Pascal programozási nyelv volt az első olyan nyelv, amely teljesen integrálta a rekord típusokat más alaptípusokkal egy logikailag következetes típusrendszerbe. A PL/I programozási nyelv támogatta a COBOL-stílusú rekordokat. A C programozási nyelv eredetileg a rekord koncepciót egyfajta sablonként (struct) biztosította, amelyet egy memóriaterületre lehetett alkalmazni, nem pedig egy igazi rekord adattípusként. Ez utóbbiakat végül is biztosították (a typedef deklarációval), de a két koncepció még mindig különbözik a nyelvben. A Pascal után tervezett legtöbb nyelv (például Ada, Modula és Java) szintén támogatta a rekordokat.

Bár a rekordokat már nem használják olyan gyakran eredeti kontextusukban (azaz kizárólag adatok tárolására szolgáló eszközként), hatással voltak az újabb objektumorientált programozási nyelvekre és relációs adatbázis-kezelő rendszerekre. Mivel a rekordok modulárisabbá tették az adatok tárolását és kezelését, alkalmasabbak a bonyolult, valós világot reprezentáló fogalmak ábrázolására, mint az alapértelmezetten nyújtott primitív adattípusok. Ez hatással volt későbbi nyelvekre, mint például a C++, Python, JavaScript és Objective-C, amelyek ugyanazokat a programozók moduláris aggályait célozzák meg. [13]

Ezekben a nyelvekben az objektumok lényegében rekordok, amelyekhez hozzáadódnak módszerek és öröklődés, amelyek lehetővé teszik a programozóknak az adatok viselkedésének manipulálását, nemcsak a rekord tartalmának módosítását. Sok programozó szerint a rekordok már elavultak, mivel az objektumorientált nyelvek olyan funkciókkal rendelkeznek, amelyek messze túlmutatnak a rekordok lehetőségein. Másrészt sok programozó érvel amellett, hogy a kis overhead és a rekordok használatának képessége az összeszerelési nyelvben még mindig releváns, amikor alacsony szintű absztrakcióval programoznak. Ma a TIOBE indexen, a programozási nyelvek népszerűségét jelző mutatónál, a legnépszerűbb nyelveket valamilyen módon befolyásolta a rekordok ténye, mivel objektumorientáltak.[14] Az SQL és az Object Query Language (Objektumlekérdezési Nyelv) nevű lekérdezési nyelvek is hatást gyakoroltak a rekordok koncepciójára. Ezek a nyelvek lehetővé teszik a programozó számára, hogy adathalmazokat, amelyek lényegében rekordok, táblákban tároljanak. [15] Ezek az adatok azután lekérhetők egy elsődleges kulcs segítségével. Maguk a táblák is rekordok, amelyek tartalmazhatnak idegen kulcsot : egy olyan kulcsot, amely egy másik tábla adataira hivatkozik.

Tevékenységek[szerkesztés]

  • Új rekordtípus deklarációja, beleértve az egyes mezők pozícióját, típusát és (esetleg) nevét;
  • Változók és értékek deklarálása adott rekordtípussal;
  • Rekordérték felépítése adott mezőértékekből és (néha) megadott mezőnevekkel;
  • Rekord mezőjének kiválasztása explicit névvel;
  • Rekordérték hozzárendelése egy rekordváltozóhoz;
  • Két egyenlőségrekord összehasonlítása;
  • A rekord szabványos hash értékének kiszámítása.

Egy mező kiválasztása rekordértékből értéket ad.

Néhány nyelv lehetőséget nyújthat arra, hogy felsorolja egy rekord összes mezőjét, vagy legalább a referenciaként használt mezőket. Ez a funkció szükséges bizonyos szolgáltatások, mint például a hibakeresők, szemétgyűjtők és sorosítás implementálásához. Ehhez bizonyos mértékű típuspolimorfizmusra van szükség.

Record alaktípusokkal rendelkező rendszerekben a rekord típusú értékekkel végrehajtható műveletek közé tartozhatnak:

  • Új mező hozzáadása rekordhoz, az új mező értékének beállítása.
  • Mező eltávolítása a rekordból.

Egy ilyen környezetben egy adott rekordtípus azt jelenti, hogy egy adott mezőhalmaz jelen van, de az adott típusú értékek tartalmazhatnak további mezőket is. Például egy "x", "y" és "z" mezőkkel rendelkező rekord tartozik az "x" és "y" mezőkkel rendelkező rekordok típusába, ahogy egy "x", "y" és "r" mezőkkel rendelkező rekord is. Az indoklás az, hogy egy (x, y, z) rekord átadása egy olyan függvénynek, amely egy (x, y) rekordot vár argumentumként, működnie kellene, mivel az adott függvény megtalálja az összes számára szükséges mezőt a rekordban. Számos gyakorlatban használt rekord megvalósítási mód lehetne problémás ebben a változékonyság lehetőségének biztosítása szempontjából, de ez a kérdés a rekordtípusok központi jellemzője a több elméleti kontextusban.

Hozzárendelés és összehasonlítás[szerkesztés]

A legtöbb programozási nyelv lehetővé teszi, hogy rekordok között értékadás történjen, amelyek pontosan azonos rekordtípusúak (beleértve ugyanazokat a mezőtípusokat és neveket, ugyanabban a sorrendben). Attól függően, hogy a nyelv, két különállóan definiált rekord adattípus különálló típusoknak tekinthető, még akkor is, ha pontosan azonos mezőik vannak.

Néhány programozási nyelv lehetővé teszi a rekordok közötti értékadást, amelyek mezőinek különböző nevei vannak, és a rekordon belüli mezőváltozókat a pozíciójuk alapján illeszti a megfelelő mezőértékhez; például egy valós és képzetes mezővel rendelkező komplex számot lehet hozzárendelni egy 2D pont rekordváltozóhoz, amelynek mezői X és Y. Ebben az alternatívában továbbra is elvárás, hogy a két operandusnak ugyanazok legyenek a mezőtípusainak a sorrendje. Néhány nyelv továbbá megkövetelheti, hogy a megfelelő típusok ugyanolyan méretűek és kódolással rendelkezzenek, hogy az egész rekordot egyértelműen értelmezhető bitláncnak lehessen hozzárendelni. Más nyelvek rugalmasabbak lehetnek ebben a tekintetben, és csak azt követelik meg, hogy minden értékmezőt törvényesen lehessen hozzárendelni a megfelelő változómezőhöz; így például egy rövid egész mezőt hozzá lehet rendelni egy hosszú egész mezőhöz, vagy fordítva.

Más nyelvek (például a COBOL) a mezőket és értékeket a nevük alapján illesztik össze, nem pedig a pozíciójuk alapján.

Ugyanezek a lehetőségek vonatkoznak két rekordérték összehasonlítására is. Néhány nyelv lehetővé teheti a sorrend összehasonlítást ('<' és '>') is, az egyedi mezők összehasonlításán alapuló lexikografikus sorrend használatával.

A PL/I lehetővé teszi mindkét korábbi típusú értékadást, valamint struktúra-kifejezéseket is, például a = a+1; ahol "a" egy rekord vagy struktúra PL/I terminológiában.

Az Algol 68 elosztó mező választéka[szerkesztés]

Az Algol 68-ban, ha a Pts egy rekordokból álló tömb volt, amelyek mindegyikének integer típusú X és Y mezői voltak, akkor a Y of Pts kifejezéssel egy egész számokból álló tömböt lehetett létrehozni, amely tartalmazza a Pts összes elemének Y mezőjét. Ennek eredményeként a Pts[3] Y := 7 és (Y of Pts)[3] := 7 utasítások ugyanazt az eredményt értékelték ki.

Pascal "with" kijelentése[szerkesztés]

A Pascal programozási nyelvben a "with R do S" parancs végrehajtja az S parancssorozatot úgy, mintha az R rekord összes mezője változóként lenne deklarálva. Hasonlóan a névtérbe lépéshez egy objektumorientált nyelvben, például a C#-ban, már nem szükséges a rekord nevét előtagként használni a mezőkhöz való hozzáféréshez. Tehát ahelyett, hogy Pt.X := 5; Pt.Y := Pt.X + 3

with Pt do begin X := 5; Y := X + 3 end

lehetne írni

with Pt do begin X := 5; Y := X + 3 end

.

Ábrázolás a memóriában[szerkesztés]

A rekordok ábrázolása a memóriában változhat a programozási nyelvek szerint. Általában a mezők egymást követő pozíciókban vannak tárolva a memóriában, ugyanabban a sorrendben, ahogy a rekord típusban deklarálva vannak. Ez azt eredményezheti, hogy két vagy több mező ugyanazba a memóriaszóba kerül tárolásra; valójában ez a tulajdonság gyakran használatos rendszermérnöki programozásban, hogy meghatározott bitekhez férjenek hozzá egy szóban. Másrészről a legtöbb fordító láthatatlan töltőmezőket is hozzáad, hogy megfeleljenek a gép által előírt igazítási korlátozásoknak - például hogy egy lebegőpontos mezőnek egyetlen szónak kell elfoglalnia.

Néhány nyelvben a rekordot egy címsorozatokból álló tömbként valósíthatják meg, amelyek a mezőkre mutatnak (és esetlegesen a nevükre és/vagy típusukra is). Az objektumok az objektumorientált nyelvekben gyakran meglehetősen bonyolult módon vannak megvalósítva, különösen azokban a nyelvekben, amelyek többszörös osztályöröklést tesznek lehetővé.

Önmeghatározó rekordok[szerkesztés]

Az önmagát definiáló rekord olyan rekordtípus, amely tartalmazza azonosító információkat a rekord típusáról és az információ helyéről a rekordon belül. Tartalmazhatja az elemek eltolásait, így az elemek bármilyen sorrendben tárolhatók vagy elhagyhatók. [16] Az önmagát definiáló rekordban tárolt információk értelmezhetők metaadatként a rekordhoz, hasonlóan ahhoz, amit egy fájlra vonatkozó UNIX metaadatokban találnánk, amelyek tartalmazzák például a rekord létrehozási idejét és a rekord méretét bájtokban. Vagy alternatív módon, a rekord különböző elemei, mindegyikük tartalmazva egy elem azonosítót, egymást követik bármilyen sorrendben.

Lásd még[szerkesztés]

Hivatkozások[szerkesztés]

Sablon:Data types [[Kategória:Data types]]

  1. Computer Science Dictionary Definitions. Computing Students. (Hozzáférés: 2018. január 22.)
  2. Radványi, Tibor. Database Management Systems [archivált változat]. Eszterházy Károly College, 19. o. (2014. április 25.). Hozzáférés ideje: 2018. szeptember 23. [archiválás ideje: 2018. szeptember 23.] 
  3. Kahate, Atul. Introduction to Database Management Systems. Pearson, 3. o. (2006. április 25.). ISBN 978-81-317-0078-5. Hozzáférés ideje: 2018. szeptember 23. 
  4. Connolly, Thomas. Database Solutions: A Step by Step Guide to Building Databases, 2nd, Pearson, 7. o. (2004. április 25.). ISBN 978-0-321-17350-8 
  5. Felleisen, Matthias. How To Design Programs. MIT Press, 53, 60. o. (2001. április 25.). ISBN 978-0262062183 
  6. Pape (2017. január 13.). „Record data structures in racket: usage analysis and optimization” (angol nyelven). ACM SIGAPP Applied Computing Review 16 (4), 25–37. o. DOI:10.1145/3040575.3040578. ISSN 1559-6915.  
  7. Add or change a table's primary key in Access. support.microsoft.com. (Hozzáférés: 2022. március 1.)
  8. Alternate key - Oracle FAQ. www.orafaq.com. (Hozzáférés: 2022. március 1.)
  9. Bromley (1998. október 1.). „Charles Babbage's Analytical Engine, 1838”. IEEE Annals of the History of Computing 20 (4), 29–45. o. DOI:10.1109/85.728228. (Hozzáférés: 2018. szeptember 23.)  
  10. Swade: Automatic Computation: Charles Babbage and Computational Method. The Rutherford Journal. The Rutherford Journal. (Hozzáférés: 2018. szeptember 23.)
  11. szerk.: Edwin D. Reilly: Encyclopedia of computer science, 4th, Chichester, UK: Wiley (2003. április 25.). ISBN 978-1-84972-160-8. OCLC 436846454 
  12. Sebesta, Robert W.. Concepts of Programming Languages, Third, Addison-Wesley Publishing Company, Inc., 218. o. (1996). ISBN 0-8053-7133-8 
  13. Leavens (1990. április 25.). „Reasoning about object-oriented programs that use subtypes”. Proceedings of the European Conference on Object-oriented Programming on Object-oriented Programming Systems, Languages, and Applications - OOPSLA/ECOOP '90, New York, New York, USA, 212–223. o, Kiadó: ACM Press. DOI:10.1145/97945.97970.  
  14. index | TIOBE - The Software Quality Company. www.tiobe.com. (Hozzáférés: 2022. március 1.)
  15. What is a Relational Database (RDBMS)?. Oracle. (Hozzáférés: 2022. február 28.)
  16. Kraimer: EPICS Input / Output Controller (IOC) Application Developer's Guide. Argonne National Laboratory. (Hozzáférés: 2015. november 25.)