relacje – #15

Dzisiaj porozmawiamy o relacjach…

oczywiście między tabelami w bazie 😉

W mojej aplikacji mam 3 tabele.

diag.png
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 😉

wp-1493209749928.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.