Diskuze: Návrh databáze pro bodování
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 8 zpráv z 8.
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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?
Ú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ší.
A ten návrh, který jsem udělal je správný (viz. kód v mé předchozí zprávě)?
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<Discipline> 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.
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.
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.
Zobrazeno 8 zpráv z 8.