\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<User> 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}
