Dodatkowa tabela?

0

Cześć

Piszę prosty program służący do rejestrowania ruchu pojazdów. Informacje zapisywane są w bazie danych i zastanawia mnie jedna rzecz co do rozplanowania bazy danych.

Mam tabelę z następującymi kolumnami:
ID (integer)
Car_ID (integer, klucz obcy)
Arrival_Time (datetime)
Departure_Time (datetime)

W przypadku gdy pojazd wjeżdża to program ma tworzyć nowy wiersz, a przypadku wyjazdu ma edytować istniejący dodając tylko datę wyjazdu. Siłą rzeczy samochód który nie wyjechał nie może wjechać jeszcze raz, tak samo jeśli poprzednio nie wyjechał nie może wjechać i program ma nie dopuszczać do takiej sytuacji.

Zastanawiam się zatem, czy stworzyć dodatkową tabelę przechowującą ID pojazdów aktualnie znajdujących się na obiekcie i ID ich wjazdu? Czy nie jest to zgodne z zasadami tworzenia baz danych, czy może lepiej przeszukiwać tę główną tabelę?

2

Nie ma to sensu, powielisz tylko dane. To załatwisz widokiem.

0

Stwórz dodatkowe pole, które będzie oznaczać czy dany samochód jest na magazynie.

0

A nie lepiej zalatwic to triggerem before insert/update?

0

Moim zdaniem to zależy do czego potrzebna Ci ta informacja. Tzn. jeżeli to ma być tylko przy jakiejś walidacji (czy auto może wjechać) to nie ma sensu tego rozszerzać (sprawdzasz listę wjazdów/wyjazdów dla ID auta i wyrzucasz błąd przy walidacji, jeżeli choć jedno będzie bez daty wyjazdu). W widoku również możesz łatwo warunek wpisać na tej podstawie.
Schody zaczną się jeżeli zasoby mają być przeszukiwalne i będzie ich dość sporo. Jeżeli potrzebujesz w wielu miejscach informacji o aktualnym statusie auta, być może będzie lepiej dodać dodatkowe pole (is_locked), które będzie zmieniało state przy dodawaniu/aktualizacji danych. Wtedy możesz bardzo szybko przejrzeć stany wszystkich aut i o wiele szybciej wyrenderować/obrobić dane niż pisząc własny kod sprawdzający czy auto jest czy go nie ma (np. na podstawie aktualnych wjazdów/wyjazdów)

2

przecież jeśli samochód ma rekord z wypełnioną datą wjazdu i bez daty wyjazdu to znaczy, że jest na magazynie wiec po co triggery/widoki/dodatkowe tabele?

0

@abrakadaber: no dokładnie.

Możesz to zrobić np. tak:

SELECT 
	t.*,
	CASE WHEN Departure_Time IS NULL THEN 'Tak' ELSE 'Nie' END AS CzyNaMagazynie -- Czy tam 1 albo 0 w formie `BIT'u`
FROM Tabela t -- etc... etc... etc... JOIN Samochod s ON etc...
0

Ale tu nie chodzi o select tylko o insert sprawdzajacy czy wszystkie inne wiersze dotyczace danego car_id maja ustawione departure na inny niz NULL.
Zdaje sie ze o to chodzi autorowi watku.

0

Jeśli faktycznie problem to kwestia insert update to robisz user stored procedure, w której na podstawie car_id wstawia się nowy rekord bądź aktualizacje data wyjazdu.

0

Chodzi o to, że program ma nie dopuścić do dodania nowego wjazdu do tabeli (co wiąże się z utworzeniem nowego wiersza), jeśli jakiś pojazd o ID takim samym jak ten który chce wjechać, wcześniej nie wyjechał. W takim wypadku trzeba by było sprawdzić całą tabelę, czy istnieje jakiś wiersz, gdzie Car_ID = ID_auta_które_wjeżdża i gdzie departure_time = null. Jeśli miałbym osobną tabelę to wystarczyłoby ją sprawdzić. Dodanie kolumny z wartością bool do kolumny cars też też rozważałem, ale nie wiem czy jest sens przechowywać taką informację dla setek samochodów, jeśli chcę tylko wiedzieć jakie auta aktualnie znajdują w środku. Ponadto myślałem, że jeśli wiem jakie id ma wjazd to zapytanie się szybciej wykona.

Mój tok rozumowania wyglądał następująco:
Mam małą tabelę z kilko nastoma wierszami, więc przeszukanie jej powinno być szybsze niż takiej gdzie wierszy jest kilka tysięcy
Jeśli będę chciał edytować wiersz tak, żeby dodać departure_time, to będę znał od razu id wiersza do którego chcę je wstawić.

Moje pytanie jest raczej czysto teoretyczne, bo niezbyt wiem co siedzi w środku baz danych i w jaki sposób zapytania są przetwarzane i nie wiem czy taki rodzaj optymalizacji ma sens i na ile jest zgodny z zasadami tworzenia baz danych.

0

a słyszałeś może przypadkiem o czymś takim jak indeksy?

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