- Wiersz opisuje pojedynczy punkt widoczny na mapie — z własnym tytułem, opisem i ikoną.
- Kolumna
ID_MAPSprzypisuje punkt do konkretnej mapy, więc jedna mapa może mieć ich dowolnie wiele. - Kolumna
TYP_AUTApozwala odfiltrować punkty nieosiągalne dla danego pojazdu — na przykład rampy bez podnośnika. - Tabela nie ma zdefiniowanych indeksów; przy większej liczbie punktów warto to uzupełnić.
Do czego służy tabela [dbo].[_maps_points]
Mapa pokazująca jeden znacznik odpowiada na pytanie „gdzie to jest”. Mapa z punktami dodatkowymi odpowiada na pytanie „co jest w okolicy” — gdzie znajduje się parking dla ciężarówek, która brama jest czynna po godzinie osiemnastej, do której rampy podjeżdża naczepa chłodnicza. Tabela [dbo].[_maps_points] przechowuje właśnie takie punkty.
Każdy z nich ma własną warstwę opisową: tytuł widoczny przy znaczniku, dłuższy opis pokazywany po kliknięciu, kod służący do powiązania z danymi w innych systemach oraz ikonę odróżniającą rodzaj obiektu. Kolumny KRAJ i MIEJSCE pozwalają szybko zawęzić zbiór bez porównywania współrzędnych.
Osobno warto zwrócić uwagę na kolumnę TYP_AUTA. Punkt użyteczny dla dostawczaka bywa bezużyteczny dla zestawu z naczepą — inna wysokość bramy, inny promień skrętu, inne godziny dostępności. Filtrowanie po typie pojazdu sprawia, że kierowca widzi na mapie tylko to, z czego faktycznie może skorzystać.
Filtrowanie po typie pojazdu jest tu najbardziej praktyczną funkcją — kierowca zestawu nie musi przeglądać punktów przeznaczonych dla dostawczaków.
Budowa tabeli — wykaz kolumn
Dziesięć kolumn opisuje położenie punktu, jego treść oraz sposób prezentacji.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
ID_MAPS | int liczba całkowita | tak | Id mapy |
IKONA | varchar(max) tekst bez limitu długości | nie | Ikona punktu |
KOD | varchar(50) tekst do 50 znaków | nie | Kod punktu |
KRAJ | varchar(50) tekst do 50 znaków | nie | Kraj |
LATITUDE | float liczba zmiennoprzecinkowa | nie | Szerokość geograficzna punktu |
LONGITUDE | float liczba zmiennoprzecinkowa | nie | Długość geograficzna punktu |
MIEJSCE | varchar(50) tekst do 50 znaków | nie | Miejsce np nazwa miasta |
OPIS | varchar(max) tekst bez limitu długości | nie | Opis punktu |
TYP_AUTA | varchar(50) tekst do 50 znaków | nie | Typ auta |
TYTUL | varchar(50) tekst do 50 znaków | nie | Tytuł punktu |
Kolumna ID_MAPS wskazuje mapę, do której należy punkt. W bazie nie zdefiniowano dla niej klucza obcego, więc spójność tego powiązania wymaga kontroli po stronie aplikacji albo okresowego sprawdzenia zapytaniem.
Brak indeksów — kiedy zaczyna to przeszkadzać
Tabela nie ma zdefiniowanych indeksów, także klucza głównego. Przy kilkudziesięciu punktach nie ma to znaczenia, bo serwer odczytuje całość szybciej, niż zdążyłby skorzystać z indeksu. Sytuacja zmienia się wraz ze wzrostem zbioru.
| Liczba punktów | Zachowanie serwera | Zalecenie |
|---|---|---|
| Do kilkuset | Odczyt całej tabeli, czas pomijalny | Bez zmian |
| Kilka tysięcy | Odczyt całości przy każdym otwarciu mapy | Indeks na kolumnie ID_MAPS |
| Kilkadziesiąt tysięcy | Zauważalne opóźnienie przy otwieraniu mapy | Indeks złożony na ID_MAPS i TYP_AUTA |
| Powyżej stu tysięcy | Odczuwalne obciążenie serwera przy każdym żądaniu | Indeks przestrzenny na współrzędnych |
Brak klucza głównego oznacza też, że nic nie zapobiega powstaniu identycznych wierszy — warto to sprawdzić przed założeniem indeksu unikalnego.
Zanim doda się indeks unikalny, trzeba sprawdzić, czy w tabeli nie ma już duplikatów — powstają łatwo przy powtórzonym imporcie tego samego zbioru punktów. Zapytanie grupujące po współrzędnych i tytule wystarcza, żeby to ustalić; usunięcie powtórzeń jest wtedy warunkiem założenia ograniczenia.
Jak korzystać z tabeli w praktyce
Przy zarządzaniu punktami na mapie warto trzymać się kilku zasad:
- Wypełniaj kolumnę
KODspójnie — to jedyny sensowny sposób powiązania punktu z danymi w innym systemie. - Nadawaj tytuły krótkie; przy znaczniku na mapie mieści się kilkanaście znaków, reszta zostaje ucięta.
- Sprawdzaj po imporcie, czy nie powstały duplikaty — powtórzone wczytanie tego samego pliku nie jest niczym blokowane.
- Ustawiaj
TYP_AUTAzawsze, gdy dostępność punktu zależy od pojazdu; puste pole oznacza widoczność dla wszystkich. - Weryfikuj, czy wartość w kolumnie
ID_MAPSwskazuje istniejącą mapę; brak klucza obcego nie chroni przed osieroconymi punktami. - Rozważ założenie indeksu na kolumnie
ID_MAPS, gdy liczba punktów przekroczy kilka tysięcy.
Kontrola punktów osieroconych oraz duplikatów — dwie rzeczy, przed którymi nie chroni obecna struktura:
-- punkty wskazujące nieistniejącą mapę
SELECT p.ID_MAPS, COUNT(*) AS PUNKTOW
FROM dbo._maps_points AS p
WHERE NOT EXISTS (SELECT 1 FROM dbo._maps AS m
WHERE m.ID_MAPS = p.ID_MAPS)
GROUP BY p.ID_MAPS;
-- powtórzone punkty o tych samych współrzędnych i tytule
SELECT LATITUDE, LONGITUDE, TYTUL, COUNT(*) AS WYSTAPIEN
FROM dbo._maps_points
GROUP BY LATITUDE, LONGITUDE, TYTUL
HAVING COUNT(*) > 1;
Oba zapytania warto uruchomić po każdym imporcie punktów. Wykrywają sytuacje, których struktura tabeli nie blokuje, a które psują wygląd i użyteczność mapy.
Warto też przemyśleć, skąd punkty pochodzą. Zbiory wprowadzane ręcznie przez dyspozytorów są dokładne, ale rosną wolno i zwykle obejmują tylko trasy obsługiwane regularnie. Import z zewnętrznego katalogu daje pokrycie od pierwszego dnia, lecz zawiera pozycje nieistotne dla firmy i wymaga odfiltrowania. Rozwiązanie pośrednie — import jako punkt wyjścia, a następnie ręczne uzupełnianie o wiedzę kierowców — sprawdza się najczęściej, pod warunkiem że kolumna KOD pozwala odróżnić jedno źródło od drugiego.
Punkty na mapie są funkcją, którą łatwo wdrożyć i równie łatwo zaniedbać. Zbiór wczytany raz przy uruchomieniu systemu po roku bywa nieaktualny — bramy zmieniają godziny, parkingi znikają, rampy dostają nowe ograniczenia. Warto od początku ustalić, kto odpowiada za jego aktualizację i w jakim rytmie.
Powiązane tabele i dokumentacja
Punkty mapowe działają razem z definicją mapy i pozostałymi strukturami transportowymi: