Dzisiaj porozmawiamy o relacjach…
oczywiście między tabelami w bazie 😉
W mojej aplikacji mam 3 tabele.
Każda z nich ma kolumnę _id, która jest kluczem głównym. Dzięki temu mogę bardzo łatwo zidentyfikować każdy rekord w tabelce, a także zaprojektować relacje między danymi w tabelkach.
Relacja między Meal a Dinner to jeden-do-wielu. W kodzie wygląda to tak, że w tabelce Dinner mam kolumnę meal_id, która jest kluczem obcym do tabelki Meal.
CREATE TABLE dinner ( _id INTEGER PRIMARY KEY, meal_id INT, date INT, FOREIGN KEY(meal_id) REFERENCES meal(_id))
Przy wyszukiwaniu obiadów mogę łatwo złączyć tabele po wspólnej kolumnie:
select dinner._id, meal_id, date, name from dinner join meal on dinner.meal_id= meal._id;
Relacja pomiędzy Meal a Ingredient jest trochę bardziej skomplikowana. Jeden posiłek może mieć wiele składników, a i jeden składnik może występować w wielu posiłkach. Relacji wiele-do-wielu nie da się zrealizować bez tabelki pomocniczej.
Stworzyłam sobie tabelkę Meal_Ingredient, która ma dwie kolumny: meal_id i ingredient_id. Obie są kluczami obcymi do tabelek Meal i Ingredient.
CREATE TABLE meal_ingredient( _id INTEGER PRIMARY KEY, ingredient_id int, meal_id int, FOREIGN KEY(meal_id) REFERENCES meal(_id), FOREIGN KEY(ingredient_id) REFERENCES ingredient(_id));
Jeśli będę chciała znaleźć nazwy wszystkich składników w posiłku o id = 3 to zapytanie będzie wyglądać na przykład tak:
select ingredient.name from meal_ingredient join meal on meal._id= meal_ingredient.meal_id join ingredient on ingredient._id= meal_ingredient.ingredient_id where meal._id=3;
i nawet zadziała 😉