baalder363
#java #programowanie #naukaprogramowania #pytanie #informatyka #hibernate #spring

Jak najlepiej rozwiązać poniższą sytuację? Mam tabelę lesson i kolumny teacherid, lessonday, lessonstart i lessonstop. Użytkownik tworzy sobie lesson wybierając datę i godziny od do. Obecnie może nastąpić taka sytuacja, gdzie może być kilka rekordów z takim samym teacherid, datą i godzinami od do. Chciałbym zabezpieczyć taką sytuację, że jeżeli dla danej osoby, danego dnia istnieją rekordy z godzinami, które tam sobie wybrał, to żeby nie dublowało tego i nie było takich "podwójnych" lekcji. Mam nadzieję, że wiadomo o co chodzi, bo jakoś ciężko mi sformułować problem. Jest jakiś rozsądny sposób na to, żeby lessonstart i lessonstop było unikalne dla danego teacherid i danej daty?
  • Najlepsze
  • Wszystkie komentarze
fegwegw
Jest jakiś rozsądny sposób na to, żeby lessonstart i lessonstop było unikalne dla danego teacherid i danej daty?


@baalder363: unique constraint na 4 kolumnach.
Yahoo_
@baalder363 obsługa jednej szkoły? Nie przejmuj się wydajnością, nie wierzę, że będziesz miał jakiekolwiek problemy, a SQL został stworzony po to, żebyś mógł wydajnie odpytywać bazę o dane :). W razie czego zawsze są indeksy :)
metaforyczny_kierowca
@baalder363: unikalność godzin nic nie da, bo i tak można będzie stworzyć nakładające się lekcje. Pomyślałbym nad zmianą modelu na jakiś bardziej bezpieczny a tak na szybko machnął jakiś trigger sprawdzający czy przedział czasu się nie pokrywa.
Yahoo_
@baalder363: zasadniczo zdaje się, że możesz dać nawet unique na tym, ale bardziej sensowne będzie obsłużenie tego po stronie aplikacji. To już jest logika biznesowa.
g.....s
g.....s
@Yahoo_: why not both
a.....w
@fegwegw: w sytuacji gdy co minutę mam < 100 błędów/ostrzeżeń od MySQLa że próbuje wsadzić coś, co już istnieje, co powinienem zrobić? sprawdzać czy istnieje i dopiero insertować?
w mojej sytuacji poprawność > szybkość się liczy podczas działania
Yahoo_
@g500s: po co :)? Zaraz mu dojdzie, że w sumie to jednak może mieć dwie różne lekcje w tym samym czasie, ale w innych semestrach albo w systemie raz na dwa tygodnie i będzie musiał wywalać :).
@asdasdce2w: typowo bym sprawdzał to w kodzie, a nie na bazie.
baalder363
baalder363 Autor
0
@Yahoo_: @metaforyczny_kierowca: @fegwegw: Dzięki za odpowiedzi. Jak dawałem unique na kolumnach z godzinami to nadal się coś krzaczyło. Zastanawiałem się czy na service przy dodawaniu danej lekcji do bazy nie zrobić jakiejś walidacji, że jeżeli w bazie istnieje taka i taka godzina dla tej daty i tego konkretnego instruktora to pominąć dodawanie tej lekcji, tylko obawiam się czy nie spowolniłoby to znacząco aplikacji. Druga moja myśl
Yahoo_
@baalder363: ile tych lekcji dodajesz? Jaki masz volume requestów?
g.....s
g.....s
@Yahoo_: mnie zawsze uczono, że jeżeli ograniczenia integralności da się zrealizować w bazie danych to powinny zostać tam zrealizowane, aplikacja jest rzeczą wtórną - dzisiaj jedna aplikacja z niej korzysta, jutro może korzystać inna. oczywiście, że aplikacje również powinny to sprawdzać, ale jeżeli baza jest w stanie chronić się przed wprowadzaniem głupot to powinna to robić. no i to zawsze wydawało mi się sensowne
baalder363
baalder363 Autor
0
@Yahoo_: Za jednym razem zwykle wchodzi koło 8-9. User wybiera datę oraz od której do której zamierza pracować, np. od 8 do 16, więc idzie insert data,teacherid, 8,9; data,teacherid,9,10 itd.
Yahoo_
@g500s: Database driven development. Można tak, ja wolę jak dane są kwestią wtórną, apka raz korzysta z jednej bazy, innym razem z innej :). A Twoja apka i tak musi to sprawdzać (albo przynajmniej obsłużyć wyjątek), więc de facto duplikujesz kod. Nie jest to oczywiście zawsze błędne szczególnie jak wiele serwisów korzysta z tej samej bazy i chcesz zapewnić, żeby żaden zły programista nie zepsuł Ci danych, ale obecnie jest
baalder363
baalder363 Autor
  • adult
0
Treść przeznaczona dla osób powyżej 18 roku życia...
baalder363
baalder363 Autor
0
@Yahoo_: Tak, jednej szkoły :D. Dzięki!