Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

T-SQL - Dodanie rekordu z kluczem obcym

IXOF 09 Gru 2016 13:08 564 3
  • #1 09 Gru 2016 13:08
    IXOF
    Poziom 18  

    T-SQL - Dodanie rekordu z kluczem obcym


    Witam. Zdjęcie przedstawia diagram bazy danych, którą tworze. Wczoraj zacząłem ją uzupełniać (jest to projekt na studia). Przy próbie wpisu rekordu do tabeli auta dostaję błąd. Z tego co wyczytałem, to chodzi o to , ze najpierw muszę wpisać rekord do tabeli Eksploatacja, ale wydaje mi się to strasznie nielogiczne i zacząłem się zastanawiać, czy organizacja mojej bazy jest prawidłowa. Czy możecie im podpowiedzieć? Mi osobiście się wydaje, że te 3 klucze, które są zapętlone to zły pomysł. Jako pomysł na naprawę tego wymyśliłem, żeby klucz auta(vin) - > eksploatacja(vin) odwrócić, jednak nie jestem pewny, czy dobre rozumiem na czym te klucze obce polegają, a ta wiedza którą mam podsuwa mi takie własnie rozwiązanie. Czy jest ono dobre? Czy widzicie inne problemy, które mogą się pojawić w związku z takim projektem bazy?
    Zostawiam również kod błędu który dostaje, Pozdrawiam.

    Code:
    The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Auta__VIN__2F10007B". The conflict occurred in database "Wypozyczalnia", table "dbo.Eksploatacja", column 'Vin'.
    

    0 3
  • Pomocny post
    #2 09 Gru 2016 16:08
    chisel
    Poziom 24  

    Lekko zmieniłbym. Na początku każdą tabelą wyposaż w pole typu Lp albo coś podobnego będącym kluczem głównym (identyfikator wiersza w tabeli), autonumerowany typu liczba (konkretnie nie piszę, bo różnie się to definiuje w zależności od systemu baz danych). Pole z kluczem obcym nazwij np. ID_Pracownika. Jak to poprawisz, czyli definicję pól w tabelach, relacje porobisz w 2 minuty.
    ps. Tabele "eksploatacja" zmieniłbym na "przeglądy" i tam byłaby historia (data i przebieg i ID_auta - bo auto może mieć wiele przeglądów, ale przegląd dotyczy zawsze jednego konkretnego auta).
    ps2. Nie rób PESEL jako klucz główny. Bo jeśli okazałoby się, że był błąd w PESELU i trzeba poprawić, ale samochód był już wypożyczany i wpis istnieje, więc istnieje też pole z kluczem obcym w postaci PESELu w tabeli wypożyczenia, to nie zrobisz korekty, bo nie pozwolą na to więzy integralności - przynajmniej nie powinny. Podobnie z VIN.
    Nazwę tabeli awarie zmieniłbym na "Serwis". Wtedy relacja pomiędzy Serwis a Przeglądy jest niepotrzebna, bo tabela Auta będzie dla nich tabelą tzw. również łączącą.

    Tylko, jak wspomniałem na początku, zrób porządek, tzn. jeśli w tabeli Wypożyczenia masz odwołanie do tabeli Klient, i to będzie klucz obcy, to nazwij pole w Wypożyczenia: ID_Pracownika i będzie pięknie, przejrzyście i zgodnie ze sztuką. A tabela pracownicy ma zawierać pierwsze pole ID, autonumerowane, i to ma być klucz główny, i tak w każdej tabeli.
    Wiem, że chciałeś zrobić to poprzez PESEL, który mimo że jest unikalny mógłby niby być, to narobi jednak trochę problemów.

    0
  • #3 09 Gru 2016 16:28
    IXOF
    Poziom 18  

    Dzięki za odpowiedź. Tabela eksploatacja wygląda tak jak wygląda, bo planowałem, że bedzie w niej tylko rekordów ile samochodów i gdy coś się zmieni(czas na przegląd, lub wystąpi awaria) to rekord zostanie zaktualizowany - nie dodany nowy. Rade o peselu wezme do serca, nie pomyślałem, że faktycznie może wystąpić błędny wpis.
    Zakładając, że tabele eksploatacja zostawię (czy teraz, gdy wiesz, ze planuje ją aktualizować, to czy jest to dobry pomysł?) to czy relacja eksploatacja - > Serwis(Awarie) jest potrzebna? Czy raczej bez sensu jest trzymanie ostatniej awarii i wgl z tej kolumny zrezygnować?

    0
  • #4 09 Gru 2016 16:49
    chisel
    Poziom 24  

    Relacja eksploatacja-serwis jest całkowicie niepotrzebna, więc wyrzuć, bo by łączyła 2 trochę abstrakcyjne rzeczy, czyli przegląd i serwis, które nie mają nic wspolnego ze sobą bezpośrednio. I tutaj właśnie łączy je tabela Auto i wtedy wszystko staje się jasne i połączone bo wiemy, do czego one się odnoszą, a do czegoś muszą;-). Auto może mieć wiele przeglądów i wiele razy być serwisowane. Więc relacja wiele do wielu. Ten schemat będzie spełniał więc wymogi rzeczywistości.
    Natomiast zastanów się co do tabeli eksploatacja, tzn. co tam może być. Na pewno dałbym tam tak jak ty data ostatniego przeglądu, data następnego przeglądu, może jakiś termin ważności OC i chyba wszystko. A wymiany oleju, czyli takie rzeczy eksploatacyjne, czy naprawy, waliłbym już w tabelę serwis.

    0