%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper,headsepline,footsepline]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
% Funktioniert nicht \usepackage[automark]{scrpage2}%
\usepackage[automark]{scrlayer-scrpage}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

% Single quotes
\usepackage{upquote,textcomp}

%Kopfzeile
\ihead{NoSQL}
\chead{}
\ohead{http://kohnlehome.de/datenbanken/mongodb-beziehungen.pdf}
%\setheadsepline{0.5pt}

%Fußzeile
%\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Single Quotes
\newcommand\upquote[1]{\textquotesingle#1\textquotesingle}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
MongoDB-Beziehungen
\end{center}

\section*{Quellen}
\begin{itemize}
\item \href{https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-1}{6 Rules of Thumb for MongoDB Schema Design}
\item \href{http://learnmongodbthehardway.com/schema/schemabasics/}{learnmongodbthehardway.com}
\end{itemize}


\section*{Beispieldaten}
{\linespread{0.5}\begin{verbatim}
+--------+ 1    n +----------+ n    m +------+
| Klasse |--------| Schueler |--------| Fach |
+--------+        +----------+        +------+
\end{verbatim}}

\newpage

\section*{1:n}
\subsection*{One-to-Few: Embedding, nur eine Collection ohne Referenzen}
\subsubsection*{Collection: klasse}
\begin{verbatim}
[
  {
    name: 'I2A',
    schueler: [ { vorname: 'Anna', nachname: 'Arm' }, { vorname: 'Berta', nachname: 'Bein' } ]
  },
  {
    name: 'I4A',
    schueler: [ { vorname: 'Carla', nachname: 'Copf' } ]
  }
]
\end{verbatim}


\subsection*{One-to-Many, Child-Referencing}

\subsubsection*{Collection: klasse}
\begin{verbatim}
[
  { name: 'I2A', schueler_id: [ 1, 2 ] },
  { name: 'I4A', schueler_id: [ 3 ] }
]
\end{verbatim}

\subsubsection*{Collection: schueler}
\begin{verbatim}
[
  { _id: 1, vorname: 'Anna', nachname: 'Arm' },
  { _id: 2, vorname: 'Berta', nachname: 'Bein' },
  { _id: 3, vorname: 'Carla', nachname: 'Copf' },
]
\end{verbatim}

\subsubsection*{Application-level-join}
\begin{verbatim}
i4a = db.klasse.findOne({name: 'I4A'});
schueler_der_i4a = db.schueler.find({ _id: { $in: i4a.schueler_id }});
\end{verbatim}



\subsection*{One-to-Squillions, Parent-Referencing, Linking}

\subsubsection*{Collection: klasse}
\begin{verbatim}
[
  { _id: 11, name: 'I2A' },
  { _id: 12, name: 'I4A' }
]
\end{verbatim}

\subsubsection*{Collection: schueler}
\begin{verbatim}
[
  { vorname: 'Anna',   nachname: 'Arm',  klasse_id: 12 },
  { vorname: 'Berta',  nachname: 'Bein', klasse_id: 12 }, 
  { vorname: 'Carla',  nachname: 'Copf', klasse_id: 11 },
]
\end{verbatim}

\subsubsection*{Application-level-join}
\begin{verbatim}
i4a = db.klasse.findOne({name: 'I4A'});
schueler_der_i4a = db.schueler.find({ klasse_id: i4a._id });
\end{verbatim}

\newpage


\section*{n:m}
\subsection*{Two way linking, n,m $<$ 10}
\subsubsection*{Collection: schueler}
\begin{verbatim}
[
  { _id: 1, vorname: 'Anna',   nachname: 'Arm',  fach_id: [ 101, 103 ] },
  { _id: 2, vorname: 'Berta',  nachname: 'Bein', fach_id: [ 102 ] },
  { _id: 3, vorname: 'Carla',  nachname: 'Copf', fach_id: [ 101, 102 ] },
]
\end{verbatim}

\subsubsection*{Collection: fach}
\begin{verbatim}
[
  { _id: 101, name: 'DB',  schueler_id: [ 1, 3 ] },
  { _id: 102, name: 'KN',  schueler_id: [ 2, 3 ] },
  { _id: 103, name: 'SWT', schueler_id: [ 1 ] }
]
\end{verbatim}

\subsubsection*{Application-level-join}
\begin{verbatim}
kn = db.fach.findOne({name: 'KN'});
schueler_im_fach_kn = db.schueler.find({ _id: { $in: kn.schueler_id }});
\end{verbatim}

\subsection*{One way linking, n sehr groß}
\subsubsection*{Collection: schueler}
\begin{verbatim}
[
  { _id: 1, vorname: 'Anna',   nachname: 'Arm',  fach_id: [ 101, 103 ] },
  { _id: 2, vorname: 'Berta',  nachname: 'Bein', fach_id: [ 102 ] },
  { _id: 3, vorname: 'Carla',  nachname: 'Copf', fach_id: [ 101, 102 ] },
]
\end{verbatim}

\subsubsection*{Collection: fach}
\begin{verbatim}
[
  { _id: 101, name: 'DB' },
  { _id: 102, name: 'KN' },
  { _id: 103, name: 'SWT' }
]
\end{verbatim}

\subsubsection*{Application-level-join}
\begin{verbatim}
kn = db.fach.findOne({name: 'KN'});
schueler_im_fach_kn = db.schueler.find({ fach_id: kn._id });
\end{verbatim}

\end{document}
