119 lines
3.6 KiB
TeX
119 lines
3.6 KiB
TeX
\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}
|