Wpis z mikrobloga

#sql #programowanie #bazydanych
Mam problem z określeniem kierunku relacji, zaćmiło mnie.
Mam trzy tabele, dajmy na to A, B i AB.
Tabela A przechowuje informacje np. o fizycznej jednostce (np. dział organizacji zawodów, dział planowania trasy etc.), a tabela B informacje o jakimś zasobie, artefakcie czy czymś takim (np. plan trasy, uczestnicy zawodów). Obie tabele mają pole id, które jest kluczem głównym.

No i dochodzimy do sedna. Tabela A
B przechowuje informacje o tym, kto jest właścicielem, autorem itd. danego zasobu/artefaktu, przechowując przy tym dwa klucze obce: A.id oraz B.id.

Teraz właściwe pytanie: skoro jedna jednostka może wyprodukować wiele artefaktów, to w którą stronę dać relację jeden do wielu?
Z klucza głównego (*) do obcego (1), czy odwrotnie, przy kluczu głównym (1) a przy obcym (*)?

Myli mi się to, ale za którymś razem pewnie wejdzie do głowy :(
  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Arveit: Mi też się myli, ale wydaje mi się, że druga opcja. Bo jeden dział może stworzyć wiele artefaktów i w drugą stronę - wiele artefaktów może mieć jednego autora. Musi się ktoś mądry wypowiedzieć haha
  • Odpowiedz
@Arveit: ale po co 3 tabele. Skoro jest to relacja jeden do wielu to dajesz dwie tabele i w jednej (B) kolumnę np id_A która będzie kluczem obcym na A(id). Wtedy możesz dopisać do kilku zasobów tą samą jednostkę.
  • Odpowiedz
@YourNightmare: niestety nie, trzecia tabela jest po to, bo do jednego zasobu może mieć dostęp więcej jednostek. A jedna jednostka dostęp do wielu zasobów. Nie chodzi o relacje pomiędzy zasobem a jednostką, a o relację pomiędzy tą trzecią tabelą.
@Rubajticos: no to nie takie łatwe, bo teraz błąd zrobić to potem ciężko to się będzie mieliło :D
  • Odpowiedz
@Arveit: Ok, łapię. myślałem że robisz coś naokoło po prostu.
W takim przypadku przestawiasz relację wiele do wielu między kolarzami a wyścigami - więc przy jednym i drugim musisz dać "wiele" - *, () czy jak to się tam określa. Rekord w tabeli łączącej wskazuje na dokładnie jednego kolarza i dokładnie jeden wyścig, więc tam dajesz (1).
  • Odpowiedz
@kao3991: relacja wiele-wiele ma być między kolarzami a wyścigami? A ta trzecia tabela tego nie reprezentuje?
Czyli z tą łączącą mam źle i muszę to odwrócić...

Rekord w tabeli łączącej wskazuje na dokładnie jednego kolarza i dokładnie jeden wyścig, więc tam dajesz (1).

Kurde, zaskoczyło w końcu, dzięki wielkie, tego mi w mózgu brakowało. Jednak wiedza nabyta bez praktyki szybko rdzewieje :(
  • Odpowiedz
@Arveit: nie, łączącą masz okej (pomiając nazwy pól, ale zakładam że to na szybko wpisałeś żeby przykład pokazać). Ona tę relację przechowuje, bo baza danych nie umie zrobić sama z siebie relacji "wiele-wiele" i trzeba to w ten sposób zasymulować.
Ale z punktu widzenia logiki biznesowej tej tabeli nie ma, a jest kolarz który ma bierze udział w wielu wyścigach i wyścig w których bierze udział wielu kolarzy - czyli
  • Odpowiedz
@kao3991: ach, no rozumiem. Czyli dobrze kminiłem, że ta trzecia tabela to tylko taka "przejściówka" dla tej relacji, no bo faktycznie inaczej nie idzie raczej tego zrobić.
Tylko w końcu kierunek relacji na screenie mam dobry, czy zły? Bo teraz już się pogubiłem znowu ( ͡° ʖ̯ ͡°)
  • Odpowiedz
@Arveit: a, sorry, przegapiłem że tam w ogóle jest kierunek. i tu Ci nie pomogę, bo nigdy nie wiem w którą stronę się rysuje strzałki na tych wykresach. Ale relacja powinna być taka jak napisałem wcześniej.
  • Odpowiedz
@kao3991: haha :D no właśnie o te strzałki się rozchodzi całe.
Ale i tak dzięki wielkie, bo trochę sobie poprzypominałem też wiedzy innej przy okazji.
  • Odpowiedz