Just nu i M3-nätverket
Jump to content

Platsbokning ala Dreamhack.


dryg

Recommended Posts

Jag skulle vilja ha lite hjälp med ett platsbokningssystem. Jag kommer med hjälp av tabeller lägga upp "rutor" som motsvarar en plats. När man trycker på en av rutorna så blir rutan röd och ens id sparas på den posten i databasen.

 

Nån som har ett tips på hur jag ska bygga uppdatabasen mot tabellerna på sidan? Själva införning av data är inga problem.

 

Tacksam för svar!!

 

//Martin

 

Link to comment
Share on other sites

Magnus Gladh

Nu vet jag inte hur mycket info du skall ha om varje plats och kund men här är en basik uppbyggnad som du kan bygga vidare på...

 

Innehåller 2 tabeller.

 

tblCustomer
--------------
ID|Förnamn|Efternamn|.....

tblPlace
--------------
ID|PlaceNumber|BookedByCustomer|HasNetwork|HasComputer|......

 

När man registrera sig som kund så läggs datan ner i tblCustomer.

 

När sedan sidan visas på sidan så kollar man igenom tblPlace och tblPlace och plockar fram alla platser och ritar ut de där de skall vara.

 

När sedan någon kund bookar en plats så updaterar man tblPlace.BookedByCustomer med kundens idnummer.

 

Nu kan man göra det hur avancerat som helst, man kan dela upp det på 3 tabeller, man kan ha status på platsen: (obokad, reserverad, bokad) osv osv

 

Men ovanståend duger bra för ett enkelt bokningsystem

 

- Magnus

-----------------------------------------------------

Jag är inte kaxig, jag är bara så jävla bäst...

 

Link to comment
Share on other sites

Magnus Gladh

Glömd en lite viktig sak som dock inte har med databasens uppbyggnad utan mer ett problem med webbens tillstånd.

 

Och det är att när du vill uppdatera en plats så måste du innan du gör det, först kolla så att ingen har tagit denna plats. Och samtidigt lägga allt i ett lås så ingen annan hinner in emellan.

 

1. Kolla så att platsen fortfarande är ledig

2. Updatera eller inte

 

Varför måste man göra så, ju för när man ha flera användare samtidigt på sidan så kan 2 personer visa alla platser samtidigt och då visas att plats nr. 10 är ledig för båda besökarna.

 

Nu är besökare 1 snabb och bokar platsen, besökare 2 tar lite längre tid på sig och bokar platsen lite senare än besökare1 (den är dock fortfarande ledig enligt besökare2's websida, men inte i verkligheten) så när besökare2 kommer in på sidan som skall boka platsen har redan besökare1 bokat den, men det vet inte besökare2 eftersom han sida sa att den var ledig.

 

Därför måste man ha kollen om platsen är bokat eller ej.

 

är detta 100% säkert, nope. Varför inte det? Ju för att besökarna kan vara nästan lika snabba. Här kommer ett flöde som skapar problem med ovanstående lösning.

 

B1 = besökare1

B2 = besökare2

 

B1 och B2 bokar båda plats 10.

B1 kör checken om plats10 är ledig, ok det är den.

Innan B1 nu hinner boka platsen så kommer B2 och kollar om platsen är ledig och det är den.

B1 bokar nu platsen och efterdet så kommer B2 och bokar platsen, nu har B1 tappat sin plats.

 

Man kan lösa det genom att låsa raden så att medans B1 kollar om platsen är ledig och bokar platsen så får ingen annan läsa/skriva till den raden.

 

ett annat sätt är att i din update kolla så att bokad inte är bokad när du bokar den.

UPDATE [xxx] SET Bokad = [iD_Customer] WHERE ID = [xx] AND bokad = 0

 

om nu B1 bokar innan B2 så kommer bokad inte vara 0 när B2 kommer in och därför kan B2 inte boka platsen. Sedan bakar man in allt i Transaction och kollar om Updaten gick bra eller inte och sedan hanterar man vad man skall göra utifrån det.

 

Bara en liten parantes till ett problem som du kommer att stötta på.

 

- Magnus

-----------------------------------------------------

Jag är inte kaxig, jag är bara så jävla bäst...

 

Link to comment
Share on other sites

Hej!

 

Intressant det du skriver Magnus!

 

Om man har följande två tabeller:

 

tblCustomer

--------------

ID|Förnamn|Efternamn|

 

tblPlace

--------------

ID|PlaceNumber|BookedByCustomer|HasNetwork|HasComputer|

 

så kan man alltså undvika dubbelbokning med

 

UPDATE [xxx] SET BookedByCustomer = [iD_Customer] WHERE ID = [xx] AND BookedByCustomer Is Null

 

Men om man istället hade delat upp det på tre tabeller

 

tblCustomer

--------------

ID|Förnamn|Efternamn|

 

tblBooking

--------------

customerID|placeID

 

tblPlace

--------------

ID|PlaceNumber|HasNetwork |HasComputer|

 

Hur unviker man då på ett enkelt sätt dubbelbokning?

 

Link to comment
Share on other sites

Magnus Gladh

Jag hade nog också delat upp det i 3 kolumner så som du har gjort.

 

För att inte få dubbel bokning så hade jag då lagt placeId i tabellen tblBooking som ett unikt värde, detta göra att man inte kan mata in 2 rader med samma värde i placeID. Det har dock det lilla problemet att man aldrig mer än 1 gång kan boka en plats. Så om man har flera events är det ingen bra lösning :)

 

Men då skapar men en ny tabel: tblEvent och sedan lägger man till eventsId i tabellen och använder eventsId och placeId som unik nyckel vilket då gör att man endast kan boka en plats per event.

 

Du bör nu ha fått ett idiot-säket system (teoretiskt iallafall).

 

- Magnus

-----------------------------------------------------

Jag är inte kaxig, jag är bara så jävla bäst...

 

Link to comment
Share on other sites

Magnus Gladh

så bra...

 

- Magnus

-----------------------------------------------------

Jag är inte kaxig, jag är bara så jävla bäst...

 

Link to comment
Share on other sites

B1 och B2 bokar båda plats 10.

B1 kör checken om plats10 är ledig, ok det är den.

Innan B1 nu hinner boka platsen så kommer B2 och kollar om platsen är ledig och det är den.

B1 bokar nu platsen och efterdet så kommer B2 och bokar platsen, nu har B1 tappat sin plats.

 

Kan man kalla det för ett race condition? :)

 

--

.Wey - da muteX man ;0

 

Future Hero Next Generati0n

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...