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.
Zobrazeno 8 zpráv z 8.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.