Wpis z mikrobloga

#sql mam sobie tabelę z państwami i tabelę "RelacjeDyplomatyczne" (bawię się :P) która jest relacją many-to-many dla tabeli "Państwa" z samą sobą. I tutaj powiedzmy boolean "wojna" itd. Czy da się taką zależność zbudować inaczej? Bo pojawiają się dwa problemy: relacja państwa A z państwem B może być inna niż państwa B z państwem A; no i relacja państwa z samym sobą to też bzdura...
  • 23
@Capt_S: tez zauważ fakt że jak masz dwa rekordy kraj1id: 1, kraj2id: 2 i drugi kraj1id: 2, kraj2id: 1 to w logice jest to samo ale już w bazie dwa różne wiec może po tym będziesz określał status danego kraju wobec drugiego
w logice jest to samo ale już w bazie dwa różne


@wesoly_duszek: i o to mi chodzi. Chciałbym mieć w bazie to samo co w logice i nie wiem czy się da, czy jest jakaś konstrukcja tabel która na to pozwala? Ew. jakieś atrybuty kluczy które to zapewnią...
@wesoly_duszek: mógłbym mieć po prostu tabelę Wojna i jeżeli istnieje rekord to jest wojna, a jeżeli nie to nie... ale chciałbym mieć więcej różnych stanów (jakieś pakty, cło itd) i nie wszystkie są bool
@ck__: traktowałbym je wtedy jako dwa państwa tymczasowo więc nie. :P chodzi mi bardziej generalnie o reprezentację unikalnej relacji pomiędzy każdymi dwoma obiektami tego samego typu w SQL. :P
@Capt_S: ok, wtedy relacja wiele do wielu uprosci, aczkolwiek pewnie zalezy od logiki programu i musialbys usuwac oba wpisy od razu aby nie bylo race condition i infinitywar :)
@ck__: ale ja NIE CHCĘ żeby w tabeli mogły istnieć dwa obiekty takie, że:
1) id1=a, id2=b
2) id1=b, id2=a
bo wtedy trzeba ew. błędy w bazie rozwiązać od strony programistycznej, a wolałbym żeby baza sama w sobie na taki INSERT nie pozwoliła. Dlatego szukam alternatywy dla many-to-many. Jak takie coś się rozwiązuje? Nie da się inaczej?
@polandgoal: tak właśnie jest teraz i mi to nie pasuje:
CaptS - @ck_: ale ja NIE CHCĘ żeby w tabeli mogły istnieć dwa obiekty takie, że:
1) ...

źródło: comment_pQb9D5xNUuFsCIsYh8UKbzG4GgmlyI5N.jpg

Pobierz
@polandgoal: no tak się skończy o ile na nic nie wpadnę... po prostu sądziłem, że istnieje może jakaś konstrukcja tabel o której nie wiem, a która (jak to opisał @wesoly_duszek ) rozwiązuje problem tego, że "w logice jest to samo ale już w bazie dwa różne". Bo wygląda to jakby mogło być częstą sytuacją w wielu różnych sytuacjach... np. Facebook jakoś status związku miedzy użytkownikami zapisuje, nie? :P
@Capt_S: no to jest w sumie najmniej upierdliwa opcja jaka mozna zrobic, i to co masz przedstawia po prostu macierz. ja bym moze sie zastanawial nad czyms takim co by ci pozwolio wiecej opcji dodac ale to mozna rowniez zastepowac kolumnami, create table connections ( idpanstwo1 bigint, idpanstwo2 bigint, atrybut nvarchar(50), wartosc nvarchar(50)); i jesli panstwo 1 atakuje panstwo b to wystarczy insert connections values(1,2,'war','yes');
@ck__: no i w tym wypadku też będziesz mógł mieć insert (1,2,'war','yes') i insert (2,1,'war','no'), nie będą się wykluczać na poziomie bazy danych, a dopiero program będzie musiał za każdym razem sprawdzać oba. Ja wiem, że mogę tak napisać program żeby np. zawsze wpisywał mniejsze id najpierw... ale tu jest większy pomysł za tym wszystkim, to ma być gra modyfikowana za pomocą SQL i chciałem jak najwięcej problemów rozwiązać od strony
via Wykop Mobilny (Android)
  • 0
@Capt_S: tabela z panstwami, tabela z relacjami miedzy panstwami. w tabeli z relacjami bys mial id panstw i ewentualnie nazwe relacji, typu wojna, pokój czy co tam potrzebujesz. ewentualnie rozbic to jeszcze bardziej i miec osobna tabele na panstwa, osobna na slownik relacji i jedna posrednia, ktora będzie laczyla obie