Gillar du att gå på bio? Har du någonsin tänkt på hur databasdesignen bakom deras bokningssystem ser ut? I den här artikeln förbereder vi en exempeldatabasmodell för en biograf.
Det finns några antaganden vi måste ha i åtanke:
- moderna multiplexbiografer kan ha en eller flera salar inom ett större komplex,
- varje auditorium kan ha olika antal platser,
- Sätena numreras med radnummer och platsposition inom en rad,
- en film kan ha flera visningar vid olika tidpunkter, eller så kan den visas samtidigt i en annan auditorium,
- för varje visning kan en plats endast reserveras/säljas en gång,
- vi vill spåra vem som gjorde varje bokning/försäljning i systemet.
Låt oss titta på en möjlig databasdesign för att lösa detta problem (modellen skapades med Vertabelo för MySQL-databas):
Korta tabellstrukturbeskrivningar ges nedan:
-
movieTabellen innehåller data om filmer som kommer att visas på bio. Den primära nyckeln ärid, som auto_inkrementeras som alla primärnycklar i alla andra tabeller. Den enda obligatoriska informationen ärtitle.
Alla fält har betydelser enligt deras namn. Kolumnen
duration_minkan användas för att inaktivera infogning av en ny visning eller för att visa ett varningsmeddelande om vi vill gå in i en visning i ett auditorium där den tidigare visningen fortfarande pågår:
previous screening start time + duration_min of it > this screening start time -
auditoriumtabell identifierar alla auditorier i teatern. Alla uppgifter är obligatoriska.
seats_nofältet kan användas för att beräkna andelen tillgänglighet av auditorier för en vald visning/film/auditorium/datumintervall. Det här är ett exempel på dataredundans eftersom vi kunde få antalet platser för varje auditorium genom att räkna dem iseattabell. I det här exemplet kanske det inte förbättrar prestandan avsevärt. Jag visar det här som en idé som kan hjälpa till med att designa mer komplexa modeller. Om vi ställer in databasen på detta sätt måste vi komma ihåg att om vi ändrar en del av data måste vi också ändra andra. Om vi lägger till eller tar bort data frånseattabell måste vi justera värdenaseats_noiauditoriumtabell. -
screeningTabellen innehåller data för alla visningar och alla fält är obligatoriska. En visning måste ha en relaterad film, auditorium och starttid. Vi kan inte ha två föreställningar i samma auditorium samtidigt. Vi kan definiera en unik nyckel som består avauditorium_idochscreening_start. Denna inställning är bättre än att definiera en unik nyckel som består avmovie_id,auditorium_idochscreening_starteftersom det skulle tillåta oss att gå in i visningar av två olika filmer samtidigt i samma auditorium.
Vertabelo SQL-förhandsgranskningskod för den här tabellen ser ut så här (notera Screening_ak_1):
-- Tables -- Table screening CREATE TABLE screening ( id int NOT NULL AUTO_INCREMENT, movie_id int NOT NULL , auditorium_id int NOT NULL , screening_start timestamp NOT NULL , UNIQUE INDEX Screening_ak_1 (movie_id,auditorium_id,screening_start), CONSTRAINT Screening_pk PRIMARY KEY (id) );
-
seatTabellen innehåller en lista över alla platser vi har i auditorier med varje plats tilldelad strikt en auditorium. Alla fält är obligatoriska.
-
reservation_typetable är en ordbok över alla bokningstyper (per telefon, online, personligen). Alla fält är obligatoriska.
-
employeeTabellen listar alla anställda som använder systemet. Alla fält är obligatoriska.
I komplexa system finns det oftast fler roller så vi måste ha en rollordbok och anställd/användarroll-koppling. I vårt exempel har vi bara en roll:samma person lägger in reservationer och säljer biljetter.
-
reservationochseat_reservedtabeller är huvudtabellerna i vårt system. Det är därför jag listade dem sist. Alla andra tabeller kan existera utan reservationstabeller men utan reservationstabellerna skulle vi förlora anledningen till att designa hela databasen i första hand.
reservationtabellen lagrar data om en biljettreservation och/eller försäljning. Om vi har en reservation, attributetreservedskulle sättas till True,reservation_type_idskulle ställas in enligt ursprunget för reservationen ochemployee_reserved_idskulle innehållaid_employeevärdet på personen som angett data (den skulle vara tom om bokningen hade gjorts online av kunden). På samma sätt, om biljetter såldes,employee_paid_idskulle fyllas medid_employeevärdet för personen som sålde biljetter, skulle attributet som betalades sättas till True. Det aktiva attributet identifierar om en post fortfarande är giltig. Om biljetter såldes skulle detta attribut alltid vara sant och bokningen utan försäljning skulle vara aktiv fram till 30 minuter innan visningen startar
seat_reservedbordet gör det möjligt för oss att göra en reservation eller en betalning för flera platser. Efter att den anställde kontrollerat några lediga platser i gränssnittet, skulle en post läggas till denna tabell för var och en av dem. Om vi vill kontrollera vilka platser som är lediga eller tagna kan vi kontrollera värdena i den här tabellen som är kopplad tillreservationtabell därreservation.active = True.
Det är värt att nämna:
employee_reserved_idär inte obligatoriskt eftersom en reservation kanske inte existerar för en plats (en biljett till en plats säljs utan föregående reservation) eller görs onlinereservation_type_idär en främmande nyckel som refererar till reservationstypens "id". Det är inte obligatoriskt eftersom en reservation kanske inte existerar (i fall vi gjorde en försäljning utan en tidigare reservation)reservation_contactär ett textinmatningsfält för att lagra data om en person som har gjort en reservation, det är inte obligatoriskt eftersom en reservation kanske inte existerar (om vi gjorde en försäljning utan en tidigare reservation)employee_paid_idär relaterad till en användare som gjorde en försäljning, är det inte obligatoriskt eftersom en försäljning kanske inte har skett (plats reserverades, bokning avbröts automatiskt, plats har inte sålts)paidär en flagga som indikerar att betalning har skett och är obligatorisk (värdena kan vara Ja/Sant eller Nej/False)
Till slut, kom ihåg att ingen gillar att hitta någon annan i sin plats: