\section{ORM} \begin{frame}{Mi az ORM?} \begin{block}{Object-Relational Mapping} \begin{itemize} \item Objektumok és relációs táblák közötti leképezés \item Osztályok \textrightarrow{} táblákat, objektumok \textrightarrow{} sorokat jelentenek \item Átfedő absztrakció az SQL felett \end{itemize} \end{block} \begin{exampleblock}{Példa} \begin{itemize} \item \texttt{User} osztály \textrightarrow{} \texttt{users} tábla \item \texttt{user.email} mezők \textrightarrow{} \texttt{email} oszlop \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Miért használunk ORM-et?} \begin{itemize} \item Kevesebb boilerplate SQL, gyorsabb fejlesztés \item Típusbiztonság, IDE támogatás, egységes API \item Adatbázis-portabilitás (pl. PostgreSQL \textrightarrow{} MySQL) \item Biztonság: paraméterizált lekérdezések alapból \end{itemize} \end{frame} \begin{frame}{Korlátai és kockázatai} \begin{itemize} \item Teljesítmény: rosszul írt lekérdezések, N+1 probléma \item "Leaky abstraction": komplex SQL-t nehéz elrejteni \item Nem minden adatbázis funkció elérhető el könnyen \item Extra tanulási görbe és konfiguráció \end{itemize} \end{frame} \begin{frame}{Alap fogalmak} \begin{columns} \begin{column}{0.48\textwidth} \begin{block}{Entity} Egy tábla sorát leíró objektum. \end{block} \begin{block}{Repository} Adathozzáférési réteget kapszuláz. \end{block} \end{column} \begin{column}{0.48\textwidth} \begin{block}{Unit of Work} Változások követése és egyben mentése. \end{block} \begin{block}{Session/Context} Kapcsolat az adatbázissal, cache és tranzakciók. \end{block} \end{column} \end{columns} \end{frame} \begin{frame}{Kapcsolatok leképezése} \begin{itemize} \item One-to-One: \texttt{User} \textrightarrow{} \texttt{Profile} \item One-to-Many: \texttt{Author} \textrightarrow{} \texttt{Post[]} \item Many-to-Many: \texttt{Student} \textrightarrow{} \texttt{Course[]} \end{itemize} \begin{block}{Felelősség} A helyes kulcsok, indexek és megszorítások ugyanúgy fontosak, mint ORM nélkül. \end{block} \end{frame} \begin{frame}[fragile]{SQL vs ORM lekérdezés} \begin{columns} \begin{column}{0.48\textwidth} \begin{block}{SQL} \begin{lstlisting}[language=SQL] SELECT id, name, email FROM users WHERE active = true ORDER BY name ASC; \end{lstlisting} \end{block} \end{column} \begin{column}{0.48\textwidth} \begin{block}{ORM (példa)} \begin{lstlisting}[language=Java] List users = db.users() .where(u -> u.active == true) .orderBy(u -> u.name) .select("id", "name", "email") .toList(); \end{lstlisting} \end{block} \end{column} \end{columns} \end{frame} \begin{frame}{Lazy vs Eager betöltés} \begin{block}{Lazy loading} Csak akkor tölt be kapcsolt adatokat, amikor elérjük őket. \end{block} \begin{block}{Eager loading} Előre betölt kapcsolatokat egy lekérdezéssel (JOIN). \end{block} \begin{alertblock}{N+1 probléma} Túl sok lekérdezés keletkezik, ha minden kapcsolt adat külön jön le. \end{alertblock} \end{frame} \begin{frame}{Jó gyakorlatok} \begin{itemize} \item Használj migrációkat a séma kezelésére \item Mérj teljesítményt és ne félj nyers SQL-t írni \item Állíts be indexeket a gyakori szűrésekhez \item Tranzakciókkal biztosítsd a konzisztenciát \end{itemize} \end{frame}