IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Návrh databáze pro bodování

Aktivity
Avatar
Vakos
Tvůrce
Avatar
Vakos:3.2.2020 13:54

Ahoj, dělám na systému, kde si nejsem jistý jak správně navrhnout databázi.

Mám tabulku Tým, kde mám jednotlivé týmy a informace o nich. Každý tým bude plnit nějaké úkoly/disciplíny a bude se k jednotlivým disciplínám přidávat body. Jak provést návrh této databáze?

Napadlo mě udělat tabulku disciplína a pak další tabulku, kde se to spojí s tabulkou Tým, tedy sloupec idTym, idDisciplina, body. Je to správná úvaha?

Představa je, abych byl schopen ze záznamů vytvořit tabulku se všemi tými a disciplínami a body u každého týmu.

Editováno 3.2.2020 13:54
Odpovědět
3.2.2020 13:54
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Vakos
Jaroslav Smrž:3.2.2020 16:41

Ahoj, tak to bude následovně. Nespecifikoval jsi jazyk, tak použiji C#. Budeš potřebovat tyto 3 modely (tabulky):
Team:

public class Team
    {
        public int TeamID { get; set; }

        public string TeamName { get; set; }

        .....

        public ICollection<Discipline> Disciplines { get; set; }
    }

Disciplíny

public class Discipline
    {
        public int DisciplineID { get; set; }

        public string DisciplineName { get; set; }

        public int TeamID { get; set; }
        public Team Team { get; set; }

        public ICollection<Score> Scores { get; set; }
    }

A score (body)

public class Score
    {
        public int ScoreID { get; set; }

        public int DisciplineID { get; set; }

        public Discipline Discipline { get; set; }

        ......
    }

Tým může obsahovat (účastnit se) několika disciplín, disciplíny pak zas obsahují n počet záznamů se score / body.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
3.2.2020 16:41
/* Life runs on code */
Avatar
Vakos
Tvůrce
Avatar
Odpovídá na Jaroslav Smrž
Vakos:5.2.2020 21:46

Začal jsem implementovat tento návrh a přijde mi, že je v něm chyba.

Můj problém: Mám týmy, které se účastní disciplín, za které získávají určité skóre.

Řešení, které je zde uvedeno, tak při vytváření Disciplíny je vyžadován tým, který se jí účastní - disciplíny se ale účastní všechny týmy. Nechci disciplínu vytvářet pro každý tým zvlášť. Řešení by tedy měla být nějaká mezi vrstva, tedy nová tabulka a nebo úplně jinak.

Nějaké tipy jak to vyřešit?

Moje úvaha

public class Team
{
    public int TeamID { get; set; }

    public string TeamName { get; set; }

    .....
}

public class Discipline
{
    public int DisciplineID { get; set; }

    public string DisciplineName { get; set; }
}

public class Score
{
    public int ScoreID { get; set; }

    public Team Team { get; set; }

    public Discipline Discipline { get; set; }
}

Je tato úvaha správná či je tam nějaká zásadní chyba?

Nahoru Odpovědět
5.2.2020 21:46
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Vakos
Jaroslav Smrž:5.2.2020 22:14

Úvaha o dalším modelu je správná. Můžeš si vytvořit další třídu, která bude obsahovat všechny týmy a ten záznam pak přiřadíš k disciplíně.

Další možností je checkbox ve třídě s týmy, kde se zaškrtají všechny disciplíny, kterých se tým účastní. Lze to provést i opačně, že u každé disciplíny se zaškrtají týmy. Záleží na tobě, co bude lepší.

Nahoru Odpovědět
5.2.2020 22:14
/* Life runs on code */
Avatar
Vakos
Tvůrce
Avatar
Odpovídá na Jaroslav Smrž
Vakos:5.2.2020 22:16

A ten návrh, který jsem udělal je správný (viz. kód v mé předchozí zprávě)?

Nahoru Odpovědět
5.2.2020 22:16
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Vakos
Jaroslav Smrž:6.2.2020 7:22

Ne tak docela. Vždy, když potřebuješ vázat modely k sobě (provádět dotazy přes více tabulek), je třeba si uvědomit jejich vazby. Zda se jedná o 1:1, 1:n, n:1 atd. Více o vazbách a MsSQL nalezneš zde v MsSQL seriálu . .NET Core má tu výhodu, že v jednoduchých projektech, jako je tento, s SQL jazykem nepřijdeš vůbec do styku. To za tebe řeší Entity Framework a LINQ to SQL, kteří generují SQL dotazy jako takové. Nicméně pro pochopení principu, co se kde děje, je dobré to znát.

V tvém případě je klíčovou třídou Team. Ten musí obsahovat kolekci disciplín ICollection<Dis­cipline> Disciplines (několik jednotlivých záznamů). Disciplína Discipline naopak musí používat ForeignKey TeamID (z modelu Team), aby bylo jasné, který záznam patří k jakému týmu. Aby bylo jasné, odkud TeamID vzít, musíš načíst Team -

public Team Team {get;set;}

Na stejném principu to bude i se score. To můžeš řadit k týmu přes disciplínu. Disciplína tedy bude opět obsahovat kolekci Score a Score pak DisciplineID a vlastnost Discipline Discipline.

Nahoru Odpovědět
6.2.2020 7:22
/* Life runs on code */
Avatar
Vakos
Tvůrce
Avatar
Odpovídá na Jaroslav Smrž
Vakos:7.2.2020 15:20

Stále to moc nechápu proč by to mělo být propojené jak píšeš a ne tak jak jsem to napsal já.
V mém návrhu se blbě pracuje s daty a tak vidím, že je tam nějaká chyba, zároveň mi ale nesedí ani tvůj návrh, protože nevím jak by to mělo být naprogramované, aby všechno sedělo.

Stále nepobírám, proč by tabulka Discipline měla obsahovat ID týmu. Disciplína přeci nesouvisí s týmem, kor když všechny týmy se zúčastní všech disciplín. Score souvisí s Discipline a Team.

Mým cílem je vzít z databáze seznam disciplín, konkrétní tým a naráz přiřadit k disciplínám body. Dále pak také obráceně, tedy zvolit disciplínu a jednotlivým týmům přiřadit body. Vše naráz.

Možná je tvůj návrh správný, ale vůbec nemám ponětí, jak by se to naprogramovalo.

Nahoru Odpovědět
7.2.2020 15:20
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Vakos
Jaroslav Smrž:7.2.2020 16:20

No úplně jednoduše. Můj návrh dělá to, že umožňuje zadat score pro určitý tým v určité disciplíně.

Např. Týmu Javistů chci připsat 5 bodů. Otevřu si tedy Score a vyberu si tým, disciplínu, zapíšu body a dám uložit. To je vše.

V ostatních zobrazení si pak mohu přidávat týmy i disciplíny nebo jen číst související data a filtrovat. Úplně triviální. Tohle je práce na 15min.

Zdá se, že ti nejde přemýšlet dopředu, co vše je potřeba udělat a jaký bude výsledek. Ale klid, to chce čas. Když bys pořád nechápal, tak dej vědět a já ti to napíšu.

Nahoru Odpovědět
7.2.2020 16:20
/* Life runs on code */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.