Commit 05a57749 authored by M1888's avatar M1888

final

parent 67615473
......@@ -505,9 +505,13 @@ Lisäksi Acessiin toteutettiin formi, jolla voi selata joukkueissa olevia pelaaj
Harjoitustyöhön tuli käytettyä aikaa n. 30 tuntia (tarkemmin: issue #1). Tästä karkeasti 10 h oli skeeman suunnittelua ja toteutusta, ja loput sen jälkeistä: triggereiden tekoa, tietojen syöttöä, näkymien ja kyselyiden tekoa jne. Access-osioon kului näistä yhteensä n. 5 tuntia, ja ne olivat ehdottomasti kaikista turhauttavimmat tunnit.
Arvosanaehdotukseni on **5**.
Arvosanaehdotukseni on ****.
Perustelut:
- Tietokannan skeema on mielestäni huolella tehty ja suunniteltu
- Samoin triggerit
- Aihe on tarpeeksi laaja ja monimutkainen
- Kaikki halutut kyselyt toimii kuten pitääkin
- Käyttöliittymä Accessilla on melko vajavainen, mutta sillä ei pitänyt olla suurta merkitystä. Tyydyn kyllä neloseenkin, jos se tästä jää kiinni. :)
# TTZC0800 - Tietokannat - Vaatimusmäärittely
## Kendokanta
Tietokanta jääkiekko-otteluiden tapahtumien tallentamiseen.
| Nimi | Email |
|---|---|
| Joeli Hokkanen | M1888@student.jamk.fi |
Versio: 0.8 (12.4.2019)
## Johdanto
Ohjelmisto tehdään TTZC0800 Tietokannat -kurssin puitteissa harjoitustyönä. Tavoitteena on toteuttaa tietokanta, jonne voidaan tallentaa tietoa jääkiekkojoukkueista, pelaajista, areenoista, otteluista, sekä ottelutapahtumista.
Lisäksi toteutetaan MS Access -pohjainen käyttöliittymä osalle tietokannan ominaisuuksista.
## Yleiskuvus
Järjestelmä sijoitetaan JAMKin student.labranet.jamk.fi -palvelimelle ja tietokantaratkaisuna on MySQL.
Olettamuksia arkkitehtuurista:
- Joukkueilla on kotikaupunki
- Joukkueilla on sopimuksia pelaajista, sopimukseen kuuluu alku- ja loppupäivä sekä pelinumero
- Kaupunki omistaa areenan
- Ottelu pelataan yhdellä areenalla koti- ja vierasjoukkueen kesken
- Ottelusta kirjataan ottelutapahtumia, jotka voivat olla ainakin maaleja, jäähyjä, rangaistuslaukauksia, aikalisiä
- Maalilla voi yksi syöttäjä, mutta ei sen enempää
- Maali-taululle piti määritellä myös maalin tehnyt joukkue, koska muuten omaan maaliin menevä kiekko tulisi väärän joukkueen maaliksi
- Otteluilla on aina voittaja (se, kumpi on tehnyt enempi maaleja). SM-Liigan nykyisten sääntöjen mukaan ottelut eivät voi päättyä tasan.
Alustava ER-kaavio tietokannasta:
![](er.png)
Ottelutapahtumat toimivat tyypin mukaan ottamalla tapahtuma_id:n halutusta taulusta.
| Numero | Tapahtumatyyppi |
|---|---|
| 1 | Maali |
| 2 | Jäähy |
| 3 | Rangaistuslaukaus |
| 4 | Aikalisä |
Aikamääreet (esim. ottelutapahtumassa ja jäähyssä), ovat sekunteina
Toteuttamisvaiheessa ilmeni, että tämä suunnitelma ei toiminutkaan. MySQL valitti ottelutapahtumia lisätessä vierasavaimien konfliktista, kun kaikista taulukoista ei löydykää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)
```
Suunnittelupöydältä pyörähti sitten ulos kakkosversio, jossa ottelutapahtuma-taulussa on suoraan oma erillinen foreign key jokaiselle ottelutapahtumatyypille, ja näistä rajoitteen avulla täytetään vain yksi. Taulun pääavain tulee ottelu_id:stä, sekä tästä yhdestä täytetystä foreign keystä.
Jotta varmistuttiin, että vain yksi näistä vierasavaimista täytetään kerralla, tuli ottelutapahtuma-taululle kirjoitettua vielä seuraavanlainen constraint *(myöhemmin tajusin, että eihän nämä CHECKit toimineet MySQL:ssä)*:
```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 +
CASE WHEN rankkari_id IS NULL THEN 0 ELSE 1 END +
CASE WHEN maali_id IS NULL THEN 0 ELSE 1 END = 1)
```
![](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
Mikään ei auttanut vaikka tämän piti toimia hyvin. Olin jo varma, että Student-palveimen MySQL on liian vanha ja buginen eikä koodissani mitään vikaa ole. Sitten tajusin vielä kokeilla, että jätän FK-määreet näille ottelutapahtuman eri id:ille, mutta teen taululle erillisen oman id:n primary keyksi, näiden neljän fuusion sijaan. Tämä tuntui vihdoin toimivan, ja tietokannan skeema oli vihdoin valmis. Lopullinen ongelma oli siis siinä, että primary keyssä ei saa olla NULL-kenttiä, vaikka INSERT-rivin virhe tulikin foreign key constraintista.
![ER final](er_final.png)
## Toiminnot
Pakollisia toimintoja ovat ainakin:
1) Joukkueiden lisäys ja ylläpito (nimi, kaupunki, pisteet ym.)
2) Pelaajien lisäys ja muokkailu (nimi, pelinumero, paikka, joukkue, tehopisteet, ..)
3) Otteluiden lisääminen (joukkue vs joukkue, tapahtumat..)
4) Pelitapahtumien lisääminen otteluun (maalit, jäähyt, jne)
Lisäksi tulisi saada koosteita mm. seuraavista asioista:
1) Ottelun aikana tehdyt maalit
2) Joukkueiden pistepörssi (= voitetut ottelut)
3) Pelaajapörssi (= maalit + syötöt)
## Ulkoiset liittymät
Kannalle toteutetaan MS Access -pohjainen käyttöliittymä tietojen tarkastelua ja lisäilyä varten.
## Muut ominaisuudet
Suorituskyky: Vasteajat tulisi olla käyttämällämme datamäärällä käytännössä välittömiä. Kannan tulisi skaalautua suuremmillekkin datamäärille.
\ No newline at end of file
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