Pokaż wyniki od 1 do 10 z 10
Like Tree2Likes
  • 1 Post By Aravorn
  • 1 Post By Azi

Wątek: Dwa równoważne pola w bazie danych

  1. #1
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie Dwa równoważne pola w bazie danych

    Chcę zrobić ścieżki pomiędzy lokacjami, a dane potrzebuję w jakiś sposób zapisać. Mając różne miasta o różnych identyfikatorach liczbowych, teoretycznie wystarczy coś takiego z dwoma indeksami:

    Kod:
        `city1_id` int unsigned NOT NULL DEFAULT '0',
        `city2_id` int unsigned NOT NULL DEFAULT '0',
    Jeżeli chcę iść z miasta353 do miasta37 to sprawdzam czy istnieje taki rekord w bazie - jest/nie ma ścieżki.

    Robiąc to po prostu zrobiłem klasę, która to obsługuje.. Podaje się 2 id, wiem czy jest ścieżka czy nie. Trzymam się zasady - city1 < city2. Czyli ta klasa odpowiednio mi zamieni zmienne jeżeli podam je w nieprawidłowej kolejności, więc jak dam
    Kod:
    exists(2, 3)
    lub
    exists (3,2)
    to i tak odpowiedni rekrod mi utworzy.
    Bo jak wiadomo
    Kod:
    WHERE city1_id=353 AND city2_id=37
    WHERE city1_id=37 AND city2_id=353
    To dwie różne rzeczy..

    Zastanawiam się, czy jest jakiś mądry sposób na stworzenie "równoważnych" pól? Czy to może kwestia odpowiedniego wyszukiwania.. Jednak wątpię, by
    Kod:
    WHERE city1_id=353 AND city2_id=37 OR city1_id=37 AND city2_id=353
    było najlepszym rozwiązaniem.. w przypadku wielu danych ilość kombinacji wzrasta zbyt szybko.
    Ostatnio edytowane przez Drikam ; 28-08-2013 o 23:02

  2. #2
    Programista Awatar Aravorn
    Dołączył
    Apr 2011
    Posty
    343

    Domyślnie

    Ogólnie zostałbym przy Twoim rozwiązaniu, czyli nieformalnym opisie grafu za pomocą macierzy sąsiedztwa, Twój sposób, czyli trzymanie się zasady, że id miasta 1, jest mniejsze od id miasta 2 jest optymalizacją tejże macierzy. Nic lepszego mi chwilowo nie przychodzi do głowy, możesz poczytać o innych sposobach opisu grafu, bo właśnie z nim mamy tu do czynienia.
    Drikam likes this.

  3. #3
    Azi
    Azi jest nieaktywny
    Zarejestrowany
    Dołączył
    Nov 2011
    Posty
    11

    Domyślnie

    Jak dla mnie to nieeleganckie rozwiązanie, trzeba łączyć, a potem ciachać, ale za to mniej szukania po bazie. Jeśli nie tego szukasz to przepraszam. :d
    Kod:
    where city1_point_city2=in(37.353, 353.37)
    Drikam likes this.
    Zamek padł, król nie żyje.

  4. #4
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Właśnie obczajam IN, ale to nie o to chodzi.

    Ja nic nie łączę, mam parę metod tylko w klasie, mam jedno zapytanie tylko i zawsze upewniam się, że każda kolejna wartość jest większa od poprzedniej. Ogólnie jestem zadowolony z tego co mam, ale ciekawiło mnie czy jest jakiś sposób.
    Ostatnio edytowane przez Drikam ; 31-08-2013 o 22:21

  5. #5
    Azi
    Azi jest nieaktywny
    Zarejestrowany
    Dołączył
    Nov 2011
    Posty
    11

    Domyślnie

    Wiem że nie łączysz, ja tylko zasugerowałem że może zechcesz zrobic cos takiego zeby mniej szukac po bazie.Jeśli zaraz nie padne na twarz to moze uda mi sie znalezc cos dla ciebie, bo widzisz.. lubie kombinować :d
    Zamek padł, król nie żyje.

  6. #6
    Azi
    Azi jest nieaktywny
    Zarejestrowany
    Dołączył
    Nov 2011
    Posty
    11

    Domyślnie

    Kod:
    where (city1_id AND city2_id) in(37,535)
    Musisz sobie to sprawdzić bo nie jestem pewien czy działa to tak jak ja myślę. U mnie znalazło pasujące rekordy, więc to chyba to. Powtarzam, chyba!
    Zamek padł, król nie żyje.

  7. #7
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie


    Cała tabela


    in(5, 8)



    Takie zapytanie całkowicie patrzy tylko po location2_id.. Teraz nie mam czasu na więcej testów. ; d


    Kod:
     
    WHERE `location1_id` IN( 2, 3 ) AND `location2_id` IN( 2, 3 )
    Jedynie tak. To w sumie nie wygląda tak źle no i IN może przyjmować więcej niż 2 argumenty, więc nawet ładnie jeżeli chcę wyciągnąć wszystkie pomiędzy miastami A B C.
    Ostatnio edytowane przez Drikam ; 01-09-2013 o 09:02

  8. #8
    Programista Awatar Aravorn
    Dołączył
    Apr 2011
    Posty
    343

    Domyślnie

    Co nie zmienia faktu, że pomysł pierwotny będzie działał szybciej. Ta ewentualna zamiana wartości jest prawie natychmiastowa.

  9. #9
    Azi
    Azi jest nieaktywny
    Zarejestrowany
    Dołączył
    Nov 2011
    Posty
    11

    Domyślnie

    Po screenie widzę że zjadłeś nawiasy, dlatego szuka tylko po location2_id
    Kod:
    where location1_id and location2_id in(2,3)
    Zamień na
    Kod:
    where (location1_id and location2_id) in(2,3)
    Zamek padł, król nie żyje.

  10. #10
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Specjalnie eksperymentowałem, bo to co dałeś zwraca całą tabelę. ; d



Informacje o wątku

Użytkownicy przeglądający ten wątek

Aktualnie 1 użytkownik(ów) przegląda ten wątek. (0 zarejestrowany(ch) oraz 1 gości)

Podobne wątki

  1. button zmieniajacy wartosc w bazie danych
    Przez maix w dziale Budowa gry via www
    Odpowiedzi: 2
    Ostatni post / autor: 26-11-2011, 21:17
  2. Rasy w bazie danych
    Przez Polmisilth w dziale Support Vallheru
    Odpowiedzi: 6
    Ostatni post / autor: 15-05-2009, 01:29
  3. Optymalizacja w bazie danych
    Przez JAWS w dziale Pozyjonowanie, optymalizacja oraz reklama
    Odpowiedzi: 9
    Ostatni post / autor: 10-05-2008, 12:11
  4. Brak tabeli w bazie danych
    Przez saszun w dziale Grand Theft Auto RPG
    Odpowiedzi: 3
    Ostatni post / autor: 09-03-2008, 13:50
  5. Błąd w bazie danych
    Przez Nivellen w dziale Support Vallheru
    Odpowiedzi: 11
    Ostatni post / autor: 12-02-2008, 19:39

Zakładki

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •