Zapytanie do o lokalizację

0

Witajcie,
Chciałbym Was prosić o pomoc przy rozwiązaniu pewnego problemu. Chciałbym aby rozwiązanie było maksymalnie optymalne. Wiem jak to rozwiązać dwoma połączonymi zapytaniami ale być może jest lepsze rozwiązanie. A więc do rzeczy. Mam sobie tabelę gdzie zapisuję dane lokalizacji dwóch punktów. Nazwijmy je Punkt A i Punkt B. Ale przed zapisaniem system ma wysyłać zapytanie go bazy danych i sprawdzenie czy dane punkty już są. I wygląda to tak:
PUNKT A:
Miejscowość
Ulica
Kod pocztowy
Poczta

PUNKT B:
Miejscowość
Ulica
Kod pocztowy
Poczta

Teraz przed zapisaniem nowych punktów do bazy system musi zweryfikować czy danych punktów już w bazie nie ma ale pokrycie musi być w obie strony czyli użytkownik wprowadził sobie jakieś dwa punkty A i B po czym wprowadza drugą lokalizację ale tym razem dane punktu A który wprowadzał wcześniej, wprowadził jako dane punktu B i na odwrót czyli dane punktu B jako dane punktu A. I w takiej sytuacji system również musi zwrócić komunikat że takie punkty już zostały wprowadzone do bazy danych. Czyli sprawdzam parę punktów w obu konfiguracjach. Pomożecie jak rozwiązać taki problem najszybciej, najmniej obciążając bazę?

0

Ewentualnie jeszcze zastanawiam się nad stworzeniem dwóch tabel gdzie będę przechowywał osobno dane lokalizacji A i osobno dane lokalizacji B, tabele połączył bym kluczem i wysyłał zapytanie do bazy na początku o lokalizację A którą bym sprawdził w obu tabelach czy występuje, jeśli tak pobrał bym ID tego zapytania, następnie wysłał bym zapytanie o lokalizację B i sprawdził w obu tabelach i jak jest to pobrał bym ID zapytania a na koniec sprawdził czy oba ID są takie same. Jeśli są tzn że to zapytanie już było. Jeśli nie to znaczy że są to różne zapytania i można dodać nowe.

0

Jaka mbaza? Zapisujesz to do jednej tabeli, czy kilku? jaki wyglada struktura?

0

Właśnie póki co nic nie mam. Wszystko robię sobie sam. Baza MySQL. Wszystko buduję sobie od podstaw i już mam pewną koncepcję ale nie wiem czy słuszną. Opisze jak ja to sobie zaprojektowałem ale oczywiście proszę o skorygowanie jeśli popełniłem gdzieś błąd architektoniczny. A więc ja widzę to tak. Przed dodaniem tych danych o lokalizacji system generuje unikalny numer zapytania który jest wspólny dla oby lokalizacji. Stworzyłem sobie dwie tabele. W pierwszej zapisuję sobie oczywiście ID jako wartość unikalną z autoinkrementacją, następnie ten numer zapytania (wspólny dla obu lokalizacji), i wszystkie dane lokalizacji A czyli miejscowość, ulicę, kod pocztowy i pocztę. Druga tabela jest identyczna tylko dla lokalizacji B czyli też jakieś unikalne ID a opcją autoinkrementacji, numer zapytania i dane lokalizacji B: miejscowość, ulicę, kod pocztowy oraz pocztę. I teraz użytkownik wprowadza nową lokalizację i po wciśnięciu zapisz system najpierw sprawdza lokalizację A przeszukując tabele dla lokalizacji A i dla lokalizacji B, jeśli znajdzie, zwraca numer zapytania, następnie sprawdza lokalizację B w identyczny sposób, przeszukuje tabelę z danymi lokalizacji A i B i jeśli znajdzie to zwraca numer zapytania. Na koniec sprawdzam czy zwrócił mi jakieś numery zapytania i jeśli tak to je porównuję. Jeżeli znajdzie parę czyli dwa takie same numery zapytania to znaczy że dana lokalizacja już była zarejestrowana jako para i nie można jej wprowadzić ponownie. Nie wiem czy dość jasno to opisałem i nie wiem czy takie rozwiązanie jest prawidłowe dlatego liczę na Waszą pomoc.

0

Napisz co to za system - co ma robić. Po ludzku, nie po informatycznemu. Od razu ci powiem, że dwie tabele o tej samej strukturze, to nie jest dobre rozwiązanie. Podobnież MySQL.

0

Tak jak napisał @Marcin.Miga stworzenie dwóch tabelek o identycznej strukturze sugeruje, że to może nie być najlepsze rozwiązanie. Ponadto, co rozumiesz przez "unikalny numer zapytania"? Ciężko załapać jak faktycznie chcesz rozwiązać Twój problem z samego opisu.

O ile dobrze zrozumiałem, masz jakieś miejsca, które trzeba ze sobą powiązać, ale każde z nich powinno być unikalne.

Proponuję, aby utworzyć jedną tabelę przechowującą miejsca i drugą przechowującą powiązania między nimi. Aby zapewnić unikalność miejsc proponuję utworzyć kolumnę, która będzie przechowywała hash (np. md5) miejsca i stworzyć tę kolumnę unikalną. Jeśli będziesz korzystał z MySQL, to możesz wtedy posłużyć się zapytaniem INSERT IGNORE do tabeli miejsc i sprawdzić liczbę affected_rows - jeśli będzie > 0, to znaczy, że miejsce się dodało, jeśli == 0, to znaczy, że już istniało.

Myślę, że przykład trochę rozjaśni to, o czym mówię: http://sqlfiddle.com/#!9/3a565f
Jak wyświetlisz zawartość tabeli miejsca, zobaczysz, że ostatni insert został zignorowany (nic nie zmienił).

Gdybyś miał pytania do przykładu to chętnie odpowiem :)

[Adam]

1 użytkowników online, w tym zalogowanych: 0, gości: 1