Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Projket/budowa bazy danych
Forum PHP.pl > Forum > Bazy danych > MySQL
osa2t
Witam,

Chce napisać prosty program do przechowywania informacji o wyjazdach służbowych. Nie jestem dobry w projektowaniu baz dlatego proszę o pomoc by napisąc program najbardziej optymalny. Myślałem o czymś takim:
Jedna tabela przechowuje informacje o pracownikach (ID – pracownika, imię, nazwisko, dział w którym pracuje)
Druga tabela przechowuje informacje o miastach (ID- miasta, nazwa miasta, kod-pocztowy)
Trzecia tabela zawiera informacje o datach, kto, kiedy i gdzie wyjechał.
Proszę o pomoc czy dobrze myślę nad tym rozwiązaniem. Jeżeli nie to co jest złe w moim założeniu, czego brakuje co ewentualnie dodać. Jeżeli pomysł jest dobry bo proszę o pomoc w budowaniu bazy.
vokiel
Tabela 1 - jak najbardziej tak jak podałeś - info o pracownikach

Tabela 2 - jeśli pracownicy wyjeżdzają ciągle do tych samych miejsc, to może mieć sens, jeśli natomiast delegacje są losowe, to możesz to zawrzeć w tabeli delegacji (Tabeli 3)

Tabela 3 - delegacje - kto? gdzie? kiedy? jak? dlaczego? no i po co?

Ważnym jest przy takim projektowaniu poświęcenie chwili na określenie wymagań systemu. Jakie informacje będą potrzebne, z jakich będzie się najczęściej korzystać. Po jakich kluczach będzie następowało wyszukiwanie, grupowanie. Jakie są zadania takiego systemu.

Bo chociażby: w systemie ma być opcja sporządzenia statystyk popularności miejsc delegacji. W takim przypadku lepiej utworzyć oddzielną tabelę na miejsca delegacji, z dodatkowym polem: VISITED, które to pole będzie przechowywało ilość odwiedzin (każda delegacja +1)
Jeśli system ma liczyć czas spędzony na delegacjach (poza tylko ich ilością), należałoby stowrzyć 2 kolumny na daty - wyjazdu i powrotu.

I tak dalej. Przede wszystkim założenia, wymagania - potem projekt tabel.

Pozdrawiam
osa2t
witam,

dzięki za wypowiedz. Wymagania nie są narzucone. Ma to być raczej prosta aplikacja dla nauki zrobienia ciekawej i dobre bazy. Fajnie że się wypowiedziałeś bo sam nie pomyślałem o kolumnie czas wyjazdu – czas powrotu. Jeżeli masz jeszcze jakieś pomysły co można/trzeba by jeszcze dołożyć proszę o wypowiedz. Przy okazji znasz może jakiś manual na temat jak tworzyć projekty bazy?
vokiel
Cytat(osa2t @ 27.08.2009, 23:47:03 ) *
Przy okazji znasz może jakiś manual na temat jak tworzyć projekty bazy?
Moim jedynym manualem w tej kwestii było myślenie winksmiley.jpg z czasem doświadczenie.

Jeśli nie masz z góry określonych wymagań, to sam je stwórz. Spójrz na to ze strony finalnego użytkownika (operatora systemu). Jakie funkcje będą potrzebne, czego oczekujesz od tego systemu, jak miałyby wyglądać formularze, etc...

możesz zernkąć tutaj

Do samego projektowania bazy możesz sobie pomóc używając graficznych narzędzi jak np.: MySQL Workbench.
osa2t
Witam,
Proszę o wypowiedz czy taki projekt bazy jest poprawny. Postawiłem na 3 tabele (pracownik, dział, delegacje). Czekam na opinie co warto zmienić a może takie założenie jest dobre.


  1. CREATE TABLE pracownik (
  2. id_pracownik INT(1000) NOT NULL AUTO_INCREMENT,
  3. id_dzial INT(100) NOT NULL AUTO_INCREMENT,
  4. imie VARCHAR(20) NOT NULL,
  5. nazwisko VARCHAR(20) NOT NULL,
  6. telefon INT(10) NOT NULL,
  7. data_dodania DATETIME NOT NULL,
  8. PRIMARY KEY( id_pracownik),
  9. KEY pracownik(nazwisko),
  10. KEY dzial(id_dzial)
  11. )type=MyISAM;
  12.  
  13. CREATE TABLE dzial (
  14. id_dzial INT(100) NOT NULL AUTO_INCREMENT,
  15. nazwa_dzialu VARCHAR(50) NOT NULL,
  16. data_dodania DATETIME NOT NULL,
  17. data_edycji DATETIME,
  18. PRIMARY KEY( id_dzial)
  19. )type=MyISAM;
  20.  
  21. CREATE TABLE delegacje (
  22. id_delegacji MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  23. id_pracownik INT(1000) NOT NULL AUTO_INCREMENT,
  24. miasto VARCHAR(50) NOT NULL,
  25. cel VARCHAR(50) NOT NULL,
  26. data_wyjazdu DATETIME NOT NULL,
  27. data_przyjazdu DATETIME NOT NULL,
  28. data_edycji DATETIME,
  29. PRIMARY KEY( id_delegacji,id_pracownik)
  30. )type=MyISAM;
askone
Cytat
  1. CREATE TABLE pracownik (
  2. id_pracownik INT(1000) NOT NULL AUTO_INCREMENT,
  3. id_dzial INT(100) NOT NULL AUTO_INCREMENT,
  4. imie VARCHAR(20) NOT NULL,
  5. nazwisko VARCHAR(20) NOT NULL,
  6. telefon INT(10) NOT NULL,
  7. data_dodania DATETIME NOT NULL,
  8. PRIMARY KEY( id_pracownik),
  9. KEY pracownik(nazwisko),
  10. KEY dzial(id_dzial)
  11. )type=MyISAM;
  12.  
  13. CREATE TABLE dzial (
  14. id_dzial INT(100) NOT NULL AUTO_INCREMENT,
  15. nazwa_dzialu VARCHAR(50) NOT NULL,
  16. data_dodania DATETIME NOT NULL,
  17. data_edycji DATETIME,
  18. PRIMARY KEY( id_dzial)
  19. )type=MyISAM;
  20.  
  21. CREATE TABLE delegacje (
  22. id_delegacji MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  23. id_pracownik INT(1000) NOT NULL AUTO_INCREMENT,
  24. miasto VARCHAR(50) NOT NULL,
  25. cel VARCHAR(50) NOT NULL,
  26. data_wyjazdu DATETIME NOT NULL,
  27. data_przyjazdu DATETIME NOT NULL,
  28. data_edycji DATETIME,
  29. PRIMARY KEY( id_delegacji,id_pracownik)
  30. )type=MyISAM;


Hej

Widzę takie błędy:
  1. W tabeli [Pracownicy] kolumna [id_dzial] nie może być jako AUTO_INCREMENT - musisz ją zadeklarować jako klucz obcy wiążący pracownika z działem z tabeli [dzial].
  2. Taki sam błąd popełniłeś w tabeli [delegacje] z kolumną [id_pracownik]
  3. W jakim celu podajesz przy INT wartość 1000, 100?? Samo INT wystarczy smile.gif
  4. W tabeli delegacje ograniczasz się z liczbą wpisów poprzez zastosowanie typu kolumny [id_delegacji] jako MEDIUMINT - daj INT
  5. W tabeli [delegacje] jako PRIMARY KEY wystarczy [id_delegacji]. Pole [id_pracownika] ma być kluczem obcym FOREGEIN KEY.
  6. Zastanowiłbym się nad rozszerzeniem wielkości tekstu w kolumnie [cel]. 50 znaków to naprawdę mało smile.gif
  7. Rozszerz długość pola [nazwisko] na przykładowo 50 znaków. Pomyśl nad nazwiskami dwu członowymi.
Ok - na razie tyle smile.gif
osa2t
witam,

Dzięki za dobre wskazówki/uwagi, czas na poprawki.
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.