diff --git a/README.md b/README.md index 439fa695891b9e44d2ab82b0447b73b8184e357a..0d639545569f691bb659c5e55d799de4d8fb4343 100644 --- a/README.md +++ b/README.md @@ -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 **4½**. 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. :) + diff --git a/vaatimusmaarittely.md b/vaatimusmaarittely.md deleted file mode 100644 index d6672fcf8228085d350ba4163216ea3034176430..0000000000000000000000000000000000000000 --- a/vaatimusmaarittely.md +++ /dev/null @@ -1,111 +0,0 @@ -# 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