Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sposób przechowywania informacji o stanach magazynowych
Forum PHP.pl > Forum > Bazy danych > MySQL
pand
Witam

Jestem na etapie projektowania struktury bazy danych dla systemu zarządzania stanami magazynowymi. Z założenia projekt nie ma być skomplikowany.

Napotkałem na problem podczas określania sposobu przechowywania informacji o stanie magazynowym konkretnego przedmiotu oraz historii zmian tych stanów wynikających z odpowiednich dokumentów.

Jako założenia przyjąłem, iż:
  • pojedynczy rekord w tabeli PRZEDMIOTY jednoznacznie identyfikuje daną pozycję materiałową,
  • zmiany typu przychód/rozchód wynikają z odpowiednich dokumentów, o których informacja przechowywana jest w tabeli DOKUMENTY,
  • w związku z powyższym założeniem w tabeli ZMIANY oprócz dwóch kluczy obcych do tabel PRZEDMIOTY i DOKUMENTY (będących jednocześnie kluczem głównym – kombinacja dwóch kluczy obcych) utworzyłem pola ‘przychod’ i ‘rozchod’ (w sytuacji gdy nie określono wartości danego pola, domyślna wartość wynosi 0).

W sytuacji, gdybym chciał uzyskać stan magazynowy konkretnego przedmiotu, za każdym razem musiałbym przebrnąć przez poniższe kroki:
  1. Z tabeli ZMIANY wybrać rekordy opisujące zmiany ilościowe dotyczące konkretnego przedmiotu posiłkując się kluczem obcym przedmiot_id.
  2. Zsumować wartości przechowywane w kolumnach ‘przychod’ i ‘rozchod’ dla otrzymanych rekordów.
  3. Od sumy wartości obliczonej dla kolumny ‘przychod’ odjąć sumę wartości obliczonej dla kolumny ‘rozchod’ uzyskując tym samym stan magazynowy konkretnego przedmiotu.

Zastanawiam się, czy lepszym rozwiązaniem nie byłoby dodanie do tabeli PRZEDMIOTY pola ‘stan’, w którym przechowywałbym aktualną ilość danego indeksu materiałowego i uaktualniał tę wartość podczas dodawania nowego rekordu do tabeli ZMIANY (utworzenie historii zmian) o zmienioną wartość. Podczas uzyskiwania aktualnego stanu magazynowego danej pozycji nie musiałbym za każdym razem go obliczać tylko ograniczyłbym się do pobrania wartości z pola 'stan'. Czy takie rozwiązanie byłoby wydajniejsze i zgodne z zasadami projektowania relacyjnych baz danych?

Do wiadomości dołączam diagram bazy danych. Mniej istotne tabele dla rozwiązania tego problemu ukryłem dla poprawy czytelności diagramu.



Przy okazji chciałem uzyskać informację odnośnie tworzenia klucza podstawowego na podstawie kluczy obcych. Na diagramie widnieje rozwinięta tabela PRZEDMIOT_KATEGORIA, która zawiera rekordy określające przydział konkretnego przedmiotu do odpowiednich kategorii wynikający z określonego dokumentu. Czy w tej sytuacji klucz podstawowy powinien zostać zdefiniowany jako trzy klucze obce, czy też w zupełności wystarczą dwa? Zastanawiam się w jaki sposób wpływa to na szybkość wykonywania zapytań związanych z tą tabelą. Poniżej kod SQL do utworzenia tabeli PRZEDMIOT_KATEGORIA:
  1. CREATE TABLE przedmiot_kategoria (
  2. przedmiot_id SMALLINT UNSIGNED NOT NULL,
  3. kategoria_id TINYINT UNSIGNED NOT NULL,
  4. dokument_id SMALLINT UNSIGNED NOT NULL,
  5. PRIMARY KEY (przedmiot_id, kategoria_id, dokument_id),
  6. INDEX (przedmiot_id),
  7. INDEX (kategoria_id),
  8. INDEX (dokument_id),
  9. FOREIGN KEY (przedmiot_id) REFERENCES przedmioty (przedmiot_id) ON DELETE NO ACTION ON UPDATE NO ACTION,
  10. FOREIGN KEY (kategoria_id) REFERENCES kategorie (kategoria_id) ON DELETE NO ACTION ON UPDATE NO ACTION,
  11. FOREIGN KEY (dokument_id) REFERENCES dokumenty (dokument_id) ON DELETE NO ACTION ON UPDATE NO ACTION
  12. ) ENGINE=INNODB;


Z góry dziękuję za pomoc,
PA
thek
A co Ci szkodzi mieć oba te sposoby? wink.gif Pole 'stan' uwolni Cię od ciągłego joinowania i sumowania. Tym samym zyskujesz na wydajności.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.