Pytanie Jaki jest dobry projekt bazy danych (schemat) dla bazy danych obecności?


Próbuję złożyć podanie o udział w studio sztuk walki. Próbowałem rozejrzeć się za podobnymi przykładami, ale nie znalazłem żadnych konkretnych lub wystarczająco wyraźnych dla tego rodzaju aplikacji.

W tej chwili używam dwóch tabel, z których jedna służy do przechowywania informacji o uczniach, studentów (identyfikator, imię, nazwisko, adres e-mail, ...), a także innego stołu do uczestnictwa w tygodniach w roku, frekwencji (identyfikator, tydzień_1, tydzień_2 , tydzień_3, ...). Próbuję go zmienić, aby utrzymać frekwencję przez kilka dni, ale nie mogę myśleć o dobrym podejściu, ponieważ wciąż jestem czymś nowym w MySQL.

Staram się, aby było to możliwe, aby zobaczyć frekwencję w formacie kalendarza. Prawdopodobnie źle byłoby po prostu tworzyć kolumny przez 365 dni ... i tak samo z tabelą za każdy miesiąc. Zauważyłem, że niektóre podobne aplikacje śledzą tylko daty i przechowują je w bazie danych. Czy to podejście byłoby lepsze? Czy istnieje jakieś inne lepsze podejście do projektowania tego rodzaju bazy danych? Z góry dziękuję.


10
2017-10-15 05:43


pochodzenie




Odpowiedzi:


Obecność powinna mieć id, student_id i date. To wszystko, czego potrzebujesz, aby nagrywać, gdy uczniowie uczęszczali. Jeśli chcesz wiedzieć, ilu uczniów uczęszczało na konkretną datę (i kto), uruchamiasz zapytanie dotyczące tej konkretnej daty lub zakresu dat.

Możesz również utworzyć tabelę lekcji, w którym to przypadku zajdzie tabela obecności id, student_id i lekcja_id tabela lekcji może być id, held_on_date

chyba że musisz dodać więcej kolumn do tabeli lekcji, myślę, że to przesada.


8
2017-10-15 05:49



Twoja odpowiedź i odpowiedź Damira odpowiedziały na wszystkie moje pytania. Dziękuję za pomoc. - Daniel Shin
jeśli utworzę tabelę z 1 - 31 kolumną całkowitą dla kolumny dzień, miesiąc i rok oraz klasą / wykładem dla konkretnej klasy. i utwórz dla każdego miesiąca. To będzie dobry pomysł? - Kshitiz


W sztukach walki instruktorzy to także studenci - więc Instructor tabela jest podpisana do Student stół. Wszystkie wspólne pola znajdują się w Student tabela i tylko kolumny specyficzne dla instruktorów znajdują się w Instructor stół.

The Art tabela zawiera listę przedmiotów, które oferuje szkoła (judo, karate ...).

Szkoła może mieć kilka pokoi, są one wymienione w Room stół.

ClassSchedule opisuje opublikowany harmonogram zajęć oferowanych przez szkołę.

Obecność jest przechwytywana w Attendance stół.

Jeden wiersz w Calendar tabela to jeden dzień kalendarzowy (data). Tabela ma takie właściwości daty jak DayOfWeek, MonthName, MonthNumberInYear itp.

Jeden wiersz w TimeTable to jedna minuta dnia, np. 7:05.

Kalendarz i Tabela czasu umożliwiają na przykład łatwe raportowanie obecności według daty / czasu

-- Attendance of judo morning classes
-- for the first three months of the year 2010
-- by day of a week (Sun, Mon, Tue, ..)
select
    DayOfWeek
  , count(1) as Students
from ClassSchedule as a
join Calendar      as b on b.CalendarId = a.CalendarId
join TimeTable     as c on c.TimeID     = a.StartTimeId
join Attendance    as d on d.ClassId    = a.ClassID
join Art           as e on e.ArtId      = a.ArtID
where ArtName = 'judo'
  and Year    = 2010
  and MonthNumberInYear between 1 and 3
  and PartOfDay = 'morning'
group by DayOfWeek ;

alt text

Mam nadzieję, że to się zaczyna.


16
2017-10-15 12:57



Tabela dat jest techniką przechowywania danych. Prawdopodobnie jest to bardzo mylące dla osoby, która jest, co jest niezaprzeczalne, bardzo nowa dla mySQL. Zdecydowanie odradzam wymiar kalendarza, gdy normalna kolumna z datą będzie w porządku w transakcyjnej bazie danych. - Stephanie Page
I wymiar czasu ... co do diabła próbujesz zrobić z tym nowicjuszem? - Stephanie Page
@Stephanie - Jak dobrze znasz Daniela i co sprawia, że ​​myślisz, że nie może tego zrozumieć? - Damir Sudarevic
@Stephanie - Prawda, kolumny datetime byłyby dobrze w ClassSchedule stół. Za pomocą Calendar i TimeTable jest po prostu techniką usuwania funkcji daty i czasu z klauzuli WHERE zapytania i tak często używanej w hurtowniach danych. - Damir Sudarevic
@Deepak i ...? 10 milionów wierszy tej tabeli to ~ 0,2 GB (indeks dołączony). - Damir Sudarevic


Odsuń się trochę, masz dwa typy bytów:

  • osoba [jak student]
  • wydarzenia [jak klasa]

Pomyśl o każdej istocie jako o czymś, co istnieje w realnym świecie.

I jeden związek

  • frekwencja

Związek jest właśnie tym, związkiem między bytami i często ma czas dane związane z tym lub innymi typami środki.

Więc bez myślenia zbyt trudne, powinieneś mieć 3 tabele bazy danych:

  • uczestnik [E]
  • klasa [E]
  • frekwencja [R]

E = jednostka, R = relacja

Jeśli znajdziesz duplikowanie danych w jednej z tabel encji, jest to dobry znak, że ta jednostka wymaga "podmodelu". W niektórych miejscach jest to nazywane "nie powtarzaj się" lub DRY i dla modelowania relacyjnego jednostki, nazywa się to "normalizacją danych".

Pamiętaj, że zarówno czas, jak i kod generują obciążenie, aby zbudować bardziej złożony schemat. Rozważ rozpoczęcie prostych [3 tabel] i zreorganizowanie redundancji.


0
2018-03-01 12:08