Struktura bazy danych SQL Server

Struktura bazy danych SQL Server
lukaszek016
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:249
0

Witam.

Proszę wybaczyć za nazwę tematu, ale nie mam pomysłu jak to w skrócie opisać. Chodzi o to, że mam problem jak zaprojektować strukturę tabel.

Założenie jest takie, że jest magazyn, w magazynie regały, na regałach półki, na półkach pojemniki, a w pojemnikach pozycje magazynu.
Zrobiłem tak, że mam tabelę WarehouseItem, gdzie mam klucz obcy do tabeli WarehouseContainer, gdzie z kolei mam klucz obcy do tabeli WarehouseShelf, a tam klucz obcy do tabeli WarehouseRack.
Teoretycznie działa to tak, jak powinno. Mam pozycje magazynowe przypisane do pojemnika, który jest przypisany jak wyżej opisałem. Mogę sobie listować pozycje magazynu z konkretnego regału, czy samego pojemnika.

Ale powiedzmy, że chcę umożliwić użytkownikowi w oprogramowaniu czy chce korzystać, z regałów, półek czy pojemników. Powiedzmy, że klient nie ma pojemników tylko towar trzyma bezpośrednio na półkach i wtedy moja struktura bazy już jest niepoprawna. Czy mogę prosić o sugestie jak można to optymalnie zaprojektować?

kate87
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
0

W każdej tabeli przydało by Ci się zrobić flagę czy klient trzyma swoje rzeczy na tym poziomie czy niżej i za każdym razem sprawdzać gdzie klient ma tę flagę.

lukaszek016
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:249
0

Ok, czyli zrobić w każdej z tych tabel dodatkową kolumnę powiedzmy Flag?

Jeśli tak, to co w przypadku, kiedy klient nie ma żadnych opakowań, czyli w tabeli WarehouseContainers nie będzie żadnych wierszy? Ok, można sprawdzać, brak wierszy - nie wykorzystuje.

Ja kombinowałem również w kierunku, aby w pozycji magazynowej było id opakowania, półki i regału.

kate87
Akurat te id mogą być pomocne i potem nie będzie trzeba robić kilka razy joina. Jeśli klient nie będzie miał opakowań to nie będzie jego id w tabeli opisującej opakowania. Kolumna flag była by 1 tylko wtedy kiedy ktoś składował by rzeczy albo bezpośrednio na regale albo w podanym pudełku. Jeśli składował by rzeczy na regale ale w pudełku to wtedy regał 0, pudełko 1. Przy robieniu selecta po prostu porównujesz flagę i od razu wiesz gdzie się znajdują rzeczy usera.
CW
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 3 lata
  • Postów:251
0

Kiedyś pisałem program do obsługi magazynu wysokiego składu i z tego co pamiętam najlepszym rozwiązaniem okazało się "odejście" od czystego relacyjnego modelu bazy danych. Zrób tabelę w której masz nr regału, półki i pojemnika i wygeneruj rekordy opisujące Twój magazyn (oczywiście w samym programie musi byc mechanizm pozwalający np. na zwiększenie liczy regałów czyli wygenerowanie nowych rekordów) - nie lubię takich rozwiązań, ale to okazało się najlepsze. Oczywiście w tej tabeli muszą być jakieś dodatkowe pola np. informacja czy pojemnik jest zajęty, do kiedy itp. i ID klienta. Jeżeli klient zajmuje cały regał np nr 3 to wtedy program wstawia ID clienta do wszystkich pojemników na danym regale.

edytowany 3x, ostatnio: cw
mariano901229
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:597
1

No dobra, a nie lepiej stworzyć sobie dwie tabele
WarehouseLocations, która zawiera oczywiście id, kod lokalizacji, rodzic_id, poziomid
WarehouseLevels, która zawiera id, nazwę lokalizacji (w zasadzie to jak nie chcesz mieć nazw poziomów w odrębnej tabeli to wystarczy ta powyżej, ale być może będzie jakiś sens tej tabeli z poziomami).

Np dla magazynów wpis w WarehouseLocations to będzie

Kopiuj
Id, Kod lokalizacji, rodzicId, poziomid
1, Magazyn 1, null, 1

Dla tam regałów

Kopiuj
Id, Kod lokalizacji, rodzicId, poziomid
2, Regal 1, 1, 2

Dla tam kolejnego poziomu:

Kopiuj
Id, Kod lokalizacji, rodzicId, poziomid
3, Półka 1, 2,3 

W ten sposób masz strukturę chierarchczną. A w tabeli WarehouseLevels tworzysz sobie np.
Id, NazwaLokalizacji

Kopiuj
1, Magazyny
2 , Regały
3, Półki

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.