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.
1 2 3 4 5 | 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:
1 2 3 | 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.
1 2 3 4 5 6 | 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:
1 2 3 4 5 | 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