WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Databasupplägg för stämpelkort (https://www.wn.se/forum/showthread.php?t=1067327)

naak2803 2016-09-20 11:21

Databasupplägg för stämpelkort
 
Hej,

ska utveckla en mycket simple "stämpelkort", dvs tiden och datumet ska loggas vid incheckning och utcheckning...

vilket är det mest optimala sättet att lägga upp databasen på?

Såhär hade jag tänkt mig,

[UserId], [TimeForCheckIn], [TimeForCheckOut]

men det kändes inte riktigt rätt, eftersom jag hela tiden måste kontrollera ifall användaren har checkat in eller inte... och undder tiden användaren endast har checkat in så är ju [TimeForCheckOut] tomt.

SvanteH 2016-09-20 11:40

Citat:

Ursprungligen postat av naak2803 (Inlägg 20520063)
Hej,

ska utveckla en mycket simple "stämpelkort", dvs tiden och datumet ska loggas vid incheckning och utcheckning...

vilket är det mest optimala sättet att lägga upp databasen på?

Såhär hade jag tänkt mig,

[UserId], [TimeForCheckIn], [TimeForCheckOut]

men det kändes inte riktigt rätt, eftersom jag hela tiden måste kontrollera ifall användaren har checkat in eller inte... och undder tiden användaren endast har checkat in så är ju [TimeForCheckOut] tomt.

[UserId], [Time], [Type]

Så kan du ha type = 1 för incheckning, 2 för utcheckning och du kan också lägga till fler typer för vilken typ av utcheckning osv. Annars så kommer ditt förslag fungera rätt bra.

naak2803 2016-09-20 11:42

Citat:

Ursprungligen postat av SvanteH (Inlägg 20520064)
[UserId], [Time], [Type]

Så kan du ha type = 1 för incheckning, 2 för utcheckning och du kan också lägga till fler typer för vilken typ av utcheckning osv. Annars så kommer ditt förslag fungera rätt bra.

tack men på ditt sätt hamnar jag i samma sits... två jag måste göra två kontrollerer, en kontrollen för att se ifall senaste "type" är incheckat så ska den nu checka ut.

digiArt 2016-09-20 14:07

Det finns många sätt att lösa det där på, jag hade nog gjort liknande som SvanteH.

Börja med en kravlista hur det ska fungera (use cases), utifrån dem kan du sen skapa upp affärslogik och datalager.

Varför skriver jag det? Jo: du anger villkor i ditt svar till SvanteH, och om du inte har detaljerat affärsreglerna kan du inte heller få bra svar på din undring.

SvanteH 2016-09-20 14:26

Citat:

Ursprungligen postat av naak2803 (Inlägg 20520065)
tack men på ditt sätt hamnar jag i samma sits... två jag måste göra två kontrollerer, en kontrollen för att se ifall senaste "type" är incheckat så ska den nu checka ut.

Vad är det för problem med det? Det är en liten tabell med definerad nyckel, uppslag är billigt?

nim 2016-09-20 14:45

Ett snabbt exempel på en vy i MySQL för att se in och utstämplingar.

Där den matchar senaste instämplingen och närmaste utstämpling
Kod:

CREATE ALGORITHM=UNDEFINED DEFINER=`reed`@`localhost` SQL SECURITY DEFINER VIEW `stamps`
AS SELECT
  `A`.`id` AS `aid`,
  `B`.`id` AS `bid`,
  `A`.`terminalid` AS `aterminalid`,
  cast(`A`.`date` as date) AS `adate`,
  cast(`A`.`date` as time) AS `atime`,
  dayname(`A`.`date`) AS `aday`,
  `A`.`date` AS `adatetime`,
  `B`.`terminalid` AS `bterminalid`,
  cast(`B`.`date` as date) AS `bdate`,
  cast(`B`.`date` as time) AS `btime`,
  dayname(`B`.`date`) AS `bday`,
  `B`.`date` AS `bdatetime`,timestampdiff(HOUR,`A`.`date`,
  `B`.`date`) AS `timedifference`,
  `A`.`type` AS `atype`,
  `B`.`type` AS `btype`,
  `A`.`employee_no` AS `employee_no`,
  `A`.`cardtype` AS `acardtype`,
  if((substr(`A`.`cardno`,1,3) = '000'),substr(`A`.`cardno`,2),`A`.`cardno`) AS `acardno`, `B`.`cardtype` AS `bcardtype`,
  if((substr(`B`.`cardno`,1,3) = '000'),substr(`B`.`cardno`,2),`B`.`cardno`) AS `bcardno`, `A`.`firstname` AS `firstname`,
  `A`.`lastname` AS `lastname`,
  `A`.`role` AS `role`,
  `A`.`competence` AS `competence`
FROM `tt_stamps` `A`
JOIN `tt_stamps` `B` on `B`.`terminalid` = `A`.`terminalid` and `B`.`cardno` = `A`.`cardno and cast `A`.`date` as date = cast(`B`.`date` as date
WHERE
  `A`.`cardtype` = 'TAGID' AND
  timestampdiff(HOUR,`A`.`date`,`B`.`date`) > 0 AND
  `A`.`type` = 'IN' AND
  `B`.`type` = 'OUT'
ORDER BY cast(`A`.`date` as date);

i följande struktur:
Kod:

CREATE TABLE `tt_stamps` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `terminalid` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  `type` enum('IN','OUT') COLLATE utf8_swedish_ci DEFAULT NULL,
  `cardno` varchar(50) COLLATE utf8_swedish_ci DEFAULT NULL,
  `cardtype` varchar(50) COLLATE utf8_swedish_ci DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `location` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  `username` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  `employee_no` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  `firstname` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  `lastname` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  `role` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  `competence` varchar(255) COLLATE utf8_swedish_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `terminalid` (`terminalid`,`cardno`),
  KEY `date` (`date`)
) ENGINE=InnoDB AUTO_INCREMENT=4511652 DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;


webtigerteam 2016-09-21 12:56

Citat:

Ursprungligen postat av SvanteH (Inlägg 20520069)
Vad är det för problem med det? Det är en liten tabell med definerad nyckel, uppslag är billigt?

Jag håller med SvanteH, känns lite som att du lägger ner onödig tid på att ta fram den optimala relations-tabellen, i stället för att göra klart programmet. Det är inte ofta man vet exakt vad man behöver i första implementationen.


Alla tider är GMT +2. Klockan är nu 00:51.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson