Commit d6588cad authored by M1888's avatar M1888

v3

parent 7e10a13e
......@@ -2,7 +2,7 @@
Tietokannat (TTZC0800) kurssin harkkatyö
## Suunnitelmavaihe:
## Suunnitelmavaihe
**[Vaatimusmäärittelyyn](vaatimusmaarittely.md)** tästä.
......@@ -15,13 +15,13 @@ Vaatimusmäärittelyn pohjalta nousi ainakin seuraavanlaisia käsitteitä:
- Ottelu (sisältää tapahtumia)
- Tapahtumat (maali & jäähy, eri tauluista)
## Toteutus
## Toteutus
Lähdettäessä toteuttamaan vaatimusmäärittelyn mukaista ensimmäistä versiota tietokannasta, kannan luonti sujui hyvin ja alustavia tietojakin sai lisättyä. Ongelmat kuitenkin ilmenivät ottelutapahtumia lisätessä. Olin suunnitellut ottelutapahtuman tapahtuma_id:n olevan viittaus jonkin ottelutapahtuman id-tauluun (maali, jäähy, rankkari, aikalisä), ja oikea taulu josta tämä id etsittäisiin pääteltäisiin ottelutapahtuman tyyppi-kentän mukaan.
Tämä ei kuitenkaan onnistunut, vaan MySQL valitti vierasavaimien konfliktista, kun kaikista tauluista ei löytynyktään sopivaa id:tä:
```
```SQL
mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUES
-> (2, 1, 1, 3*60+14);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`M1888`.`ottelutapahtuma`, CONSTRAINT `fk_ottelutapahtuma_maali1` FOREIGN KEY (`tapahtuma_id`) REFERENCES `maali` (`maali_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
......@@ -29,11 +29,9 @@ mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUE
Takaisin suunnittelupöydän ääreen siis. Seuraava versio oli sellainen, jossa ottelutapahtuma-taulussa on oma erillinen foreign key jokaiselle ottelutapahtumatyypille, ja näistä täytetään rajoitteen avulla vain ja ainoastaan yksi. Taulun pääavain tulee ottelu_id:stä ja tästä yhdestä täytetystä FK:sta.
![](er_v2.png)
Itse kirjoitettu check tätä varten meni näin:
```
```SQL
CONSTRAINT `CK_tapahtumaid` CHECK (
CASE WHEN aikalisa_id IS NULL THEN 0 ELSE 1 END +
CASE WHEN jaahy_id IS NULL THEN 0 ELSE 1 END +
......@@ -42,8 +40,18 @@ Itse kirjoitettu check tätä varten meni näin:
```
![](er_v2.png)
Mutta edelleen törmättiin samankaltaiseen ongelmaan:
```
```SQL
mysql> INSERT INTO ottelutapahtuma (ottelu_id, jaahy_id, aika) VALUES (1, 1, 3*60+14);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`M1888`.`ottelutapahtuma`, CONSTRAINT `fk_ottelutapahtuma_aikalisa1` FOREIGN KEY (`aikalisa_id`) REFERENCES `aikalisa` (`aikalisa_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
```
Googlesta ja StackOverflow'sta aikani luettuani, kokeilin pariakin eri lähestymistapaa:
- Vaihdoin ottelutapahtuma-taulun vierasavaimet UNSIGNED INT -tyyppiin
- Kokeilin määrittää kaikki muut vierasavaimet INSERTin aikana erikseen NULL-arvolle
- Vielä paria erilaista constraintia ja muuta määrettä taululle
......@@ -214,14 +214,15 @@ ENGINE = InnoDB;
-- Table `M1888`.`ottelutapahtuma`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M1888`.`ottelutapahtuma` (
`tapahtuma_id` INT NOT NULL,
`ottelu_id` INT NOT NULL,
`aikalisa_id` INT UNSIGNED DEFAULT NULL,
`jaahy_id` INT UNSIGNED DEFAULT NULL,
`rankkari_id` INT UNSIGNED DEFAULT NULL,
`maali_id` INT UNSIGNED DEFAULT NULL,
`aikalisa_id` INT UNSIGNED NULL,
`jaahy_id` INT UNSIGNED NULL,
`rankkari_id` INT UNSIGNED NULL,
`maali_id` INT UNSIGNED NULL,
`aika` INT NOT NULL,
INDEX `fk_ottelutapahtuma_ottelu1_idx` (`ottelu_id` ASC),
PRIMARY KEY (`ottelu_id`, `aikalisa_id`, `jaahy_id`, `rankkari_id`, `maali_id`),
PRIMARY KEY (`tapahtuma_id`, `ottelu_id`),
INDEX `fk_ottelutapahtuma_aikalisa1_idx` (`aikalisa_id` ASC),
INDEX `fk_ottelutapahtuma_jaahy1_idx` (`jaahy_id` ASC),
INDEX `fk_ottelutapahtuma_rangaistuslaukaus1_idx` (`rankkari_id` ASC),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment