Powiązanie tabel dwóch tabel

1

Cześć,

jestem początkujący i w ramach nauki staram się zrobić swoją pierwszą apkę z użyciem Spring i Angulara. No i niby wszystko idzie dobrze, jakoś dodaję nowe rzeczy, ale doszedłem do pewnego problemu i potrzebowałbym porady kogoś bardziej doświadczonego w programowaniu.

Robię coś na kształt apki, która pozwala na rezerwację miejsc w kinie.
Mam tabele(encje): Reservations -> ktora zawiera rekordy i w tym m. in. numery zarezerwowanych miejsc.
I drugą tabelę: Events -> w ktorej jest pole z miejscami wolnymi (jeszcze nie zarezerwowanymi)

Każda z tych tabel ma kolumnę/pole z numerami miejsc zapisanymi jako String (numery miejsc rozdzielone ";") np. "1;2;3;4..." itd, które później chciałbym przy pomocy metod przetworzyć np w tablice metodą split(";") i jakoś tam na tym działać później.

  1. Jak mogę wprowadzić komunikację między tymi dwoma pola w najlepszy sposób ? Chodzi mi o to, że jak dodaje wpis w tabeli Reservations i tam podam numery miejsc zarezerwowanych to te miejsca powinny zniknąć w tabeli events w kolumnie freePlaces?
  2. Powinienem wprowadzić jakieś relację między tabelami w bazie danych (klucz obcy czy jakoś tak)?
  3. Mam jeszcze taki pomysł, żeby działać tylko na GET i pobierać zawsze na bieżąco dane z obu tabel i przyrównywać miejsca wolne i zarezerwowane. (czyli bede miale getem pobrane wolne miejsca z Events, rzuce POSTEM dodajac w Reservations numery miejsc zarezerwowanych i potem pobrać GETem te dane z Reservations i porównywać - czyli Events by sie nie zmieniało w ogole, tylko Reservations)
  4. Zastanawiam się też czy można np. zrobić we froncie button, który wykona 2 metody: POST na reservations dodajacy rezerwacje i PUT na Events usuwajacy zarezerwowane miejsca (nie wiem czy to głupie czy mądre pytanie - przerobiłem jakieś kursy i tam tylko pojedyncze metody były stosowane)
  5. Jak takie rzeczy się w robi w prawidłowy sposób tak bardziej profesjonalnie?
0
Imperator109 napisał(a):

Każda z tych tabel ma kolumnę/pole z numerami miejsc zapisanymi jako String (numery miejsc rozdzielone ";") np. "1;2;3;4..." itd,

Uuuuu
Zwykle taki design "bazy" się krytykuje.

  1. Zastanawiam się też czy można np. zrobić we froncie button, który wykona 2 metody: POST na reservations dodajacy rezerwacje i PUT na Events usuwajacy zarezerwowane miejsca (nie wiem czy to głupie czy mądre pytanie - przerobiłem jakieś kursy i tam tylko pojedyncze metody były stosowane)> 5. Jak takie rzeczy się w robi w prawidłowy sposób tak bardziej profesjonalnie?

dwa oddzielne requesty aby zrealizować jedną transakcję biznesową to śliskie. Np nie są objęte wspólną transakcją, nic nie jest gwarantowane, to może mieć nieciekawe konsekwencje, choćby 1x/1000

Generalnie cierpisz na to, że (czysty) REST jest bardzo wykastrowanym protokołem - porównaniu do dziś bardzo niemodnych zastosowań model RPC. Nie ma tam czasowników (tylko cztery, odnoszące się do całosci jednego obiektu/stanu - a nie grup obiektów (w tym różnych klas), jak w rozsądnym programowaniu)

Owszem, sa obejścia przez pozorne emulowania jakiś dziwnych pozornych bytów/encji, aby ten problem projektowy przysypać piaskiem ... ja to nazywam zgwałconym RESTem.

1

A nie brakuje Ci w modelu obiektu "Miejsce"? (Sit)
Miejsce może być zarezerowowane, albo wolne.
Pomyśl jeszcze raz nad modelem

0

Pokaż jak wyglądają u Cb modele bazodanowe

0
Skoq napisał(a):

Pokaż jak wyglądają u Cb modele bazodanowe

Mam tylko kilka tabel nie związanych ze sobą w żaden sposób, do których dodaje POSTEM, zmieniam PUTem i pobieram GET'em.

Dałem go dla przykładu. Bardziej niż o ten konkretny przypadek chodzi mi o sposób rozwiązania jaki się na ogół stosuje w takich przypadkach gdy potrzebujemy interakcji między tabelami.
np. dwie tabele

Tabela1 - Events
      **Eventid** int primary key
      **freePlaces** varchar(200)   => tutaj wpisane <u>wolne miejsca</u> na event w postaci "1;2;3;4;5;6;7..."



Tabela2 - Reservations
**reservationid** int primary key
**reservedPlaces** varchar(200)    => tutaj wpisane <u>zarezerwowane miejsca</u> na event w postaci "1;2;3;4;5;6;7..."

Jak zrobić w mądry sposób (może być ze zmianą modelu bazy danych) właśnie taki mechanizm, że mam we froncie formularz
który metodą POST doda mi wpis do tabeli Reservations(reservedPlaces), i te miejsca odejmie z tabeli Events(freePlaces).

0

@Imperator109:

Pierwsze, to do granic możliwości posuwasz filozofię "encja na twarz i pchasz"', ona jeszcze wytrzymuje w tak prostym projekcie, ale już trzeszczy.
Wiesz o czym mówię? Przyjmijmy ze wiesz, i nie bedę długo tłuamczył.
Przychodzi pora, gdzie na dole myślimy tabelami (bazodanowymi) ale na wyższych warstwach encjami biznesowymi, gdzie encja bzinesowa nie jest tożsama z wierszem w tabeli.

Jak jako zwolennik RPC był dał "czasownik" czyli wywołanie procedury res = makeNewReservation(par1, par2, par3)

Ale w zgwałconym RESCie by to było jakoś tak:
o ile zwykły "prosty" rekord z tabeli (dla celów statystycznych, odczytu itd) jest prezentowany jako http://... /reservations udostępniającym (np do odczytu) prostą encję Reservation
to dla emulacji tego "czasownika" by było http://.../newreservations w celu wykonania tego POST-a, z dość tłustym i nie mającym bezpośredniego odpowiednika w bazie danych obiektem AddedReservation (i na tym endpoicie jest tylko POST, może DELETE)

W tym momencie obiecywana przez ewangelistów prostota REST idzie się je...ć, ale temat da sie przeprowadzić

2

Tak jak wspomniał @Black007, brakuje Ci na pewno tabeli Seat, która by przechowywała dane o dostępnych siedziskach. Ja bym usunął encję Event. Przechowywanie sformatowanych stringów powoduje niepotrzebne skomplikowanie i sprawi, że będzie Ci późno trudno przeszukiwać takie dane. Idealnie to pewnie encja Reservation powinna mieć relację z salą, sala w rzędami, a rzędy z siedziskami. W twoim przypadku wystarczy jak Reservation powiążesz z siedziskami

Tabela RESERVATION:
ID
RESERVATION_DATE

Tabela SEAT
ID
ROW_NUMBER
SEAT_NUMBER
VIP

Tabela łącząca RESERVATION_SEAT
RESERVATION_ID
SEAT_ID
STATUS

Tabela RESERVATION_SEAT umożliwia przechowanie paru siedzisk dla 1 rezerwacji

Zobacz w jakimś prostym tutorialu jak zamodelować coś takiego w Springu

GET /reservations - zwraca wszystkie rezerwacje
GET /reservations/:id - konkretna rezerwacja po ID
GET reservations/:id/seats - wszystkie siedziska dla rezerwacji
GET reservations/:id/seats?status=free - wszystkie wolne siedziska dla rezerwacji

0
FrontendGuy napisał(a):

Tak jak wspomniał @Black007, brakuje Ci na pewno tabeli Seat, która by przechowywała dane o dostępnych siedziskach. Ja bym usunął encję Event. Przechowywanie sformatowanych stringów powoduje niepotrzebne skomplikowanie i sprawi, że będzie Ci późno trudno przeszukiwać takie dane. Idealnie to pewnie encja Reservation powinna mieć relację z salą, sala w rzędami, a rzędy z siedziskami. W twoim przypadku wystarczy jak Reservation powiążesz z siedziskami

Tabela RESERVATION:
ID
RESERVATION_DATE

Tabela SEAT
ID
ROW_NUMBER
SEAT_NUMBER
VIP

Tabela łącząca RESERVATION_SEAT
RESERVATION_ID
SEAT_ID
STATUS

Tabela RESERVATION_SEAT umożliwia przechowanie paru siedzisk dla 1 rezerwacji

Zobacz w jakimś prostym tutorialu jak zamodelować coś takiego w Springu

GET /reservations - zwraca wszystkie rezerwacje
GET /reservations/:id - konkretna rezerwacja po ID
GET reservations/:id/seats - wszystkie siedziska dla rezerwacji
GET reservations/:id/seats?status=free - wszystkie wolne siedziska dla rezerwacji

Super :-)
Dzięki wielkie, właśnie o coś takiego mi chodziło. Dałeś mi przykładowy schemat jak się za to zabrać do własnej analizy :-)

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