Struktura bazy danych SQL Server

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ć?

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ę.

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.

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.

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

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

Dla tam regałów

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

Dla tam kolejnego poziomu:

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

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

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