Struktura bazy danych - burza mózgów

Odpowiedz Nowy wątek
2008-12-10 22:03

Rejestracja: 14 lat temu

Ostatnio: 6 lat temu

0

Temat nieco niejasny ale nie miałem innego pomysłu. Jeżeli możecie proszę o ciekawe sugestie dotyczące rozwiązania problemu.

Środowisko:

  • Platforma .NET 2.0
  • Język (C# - z poziomu .net to w zasadzie drugorzędna sprawa)

Zadanie:
Buduję harmonogram do zliczania godzin pracy. Podzielcie się pomysłami/opiniami dotyczącymi sposobu organizacji danych na dysku (SQL, XML, binarka/ CSV).

Rozmiar:
200 osób 12 miesięcy 31 dni (liczba dni stała) * 5 rodzajów obecności na dzień.

Struktury:
Jeden dzień dla jednego pracownika to najlepiej struktura: Skrót (string[2]), Ilość (int), komentarz (string[80])

Jak najlepiej zorganizować dostęp do danych?

  • Tradycyjny FileStream i Serializacja (Binary formatter)
  • SQL (nie do końca wiem jak zrealizować w/w bazę)
  • CSV - może być problem, bo to jednak tablica wielowymiarowa array [1..200, 1..12, 1..31, 1..5] of struktura
  • XML (wersja binarna lub tekstowa może?) - nie do końca rozgryzłem zagadnienie

Wymagane:

  • jak najmniejszy rozmiar bazy
  • możliwość dodawania/usuwania pracownika

Zalecane:
*Logowanie (autoryzacja windows)

To by było na tyle.


<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

2008-12-10 22:20

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

0

Opcja 1 i 4 (binarka i XML) są podobne. Przy XML będzie trochę więcej kodzenia i większa będzie baza więc raczej odpada. XML przydaje się wtedy, kiedy wymagana jest możliwość ręcznej edycji bazy (jakimś powszechnie dostępnym edytorem - przy XML edytorem tekstu).

Według mnie najlepsza będzie baza danych. Rozmiar nie duży (chyba nawet mniejszy niż przy binarce bo baza się jakoś sensownie organizuje w drzewka itp.), a przede wszystkim łatwość w oprogramowaniu ! Bardzo prosto można wyświetlać zapytania w DataGridView, można podpinać kontrolki bezpośrednio pod rekord (DataBindings) i wiele innych przydatnych smaczków.

Pozostało 580 znaków

2008-12-11 11:54

Rejestracja: 15 lat temu

Ostatnio: 2 tygodnie temu

0

Jako standardowy leniwiec zgadzam się z przedmówcą.
Jak będziesz sam organizował 'storage' to się później powiesisz, jak trzeba będzie wybrać dane, albo wygenerować raport. Lepiej się potrudzić nad strukturą bazy, a później niech się samo robi ;) (poza tym jednoczesny dostęp z kilku kompów itp. - nie możesz wykluczyć, że nie będzie w przyszłości potrzebny)

Pozostało 580 znaków

2008-12-11 18:18

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Szybki test na SQL Server 2005 Express:

CREATE TABLE [dbo].[worktable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [id_prac] [int] NOT NULL,
    [from] [datetime] NOT NULL,
    [to] [datetime] NOT NULL,
    [type] [int] NOT NULL,
    [comment] [ntext] NULL,
    [short_term] [nchar](2) NULL,
 CONSTRAINT [PK_worktable] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)

declare @year int
declare @month int
declare @day int
declare @prac int

declare @from datetime
declare @to datetime

set @year = 2005
set @month = 1
set @day = 1
set @prac = 1

while @year < 2009
begin
    while @month <= 12
    begin
        while @day <= 31
        begin
            while @prac <= 200
            begin 
                set @from = '1900-1-1 00:00:00'
                set @from = dateadd(yy, @year - 1900, @from)
                set @from = dateadd(m, @month - 1, @from)
                set @from = dateadd(d, @day - 1, @from)
                set @to = @from
                set @from = dateadd(hh, round(rand() * 3 + 7,0), @from)
                set @to = dateadd(hh, round(rand() * 3 + 15,0), @to)
                insert into worktable (id_prac, [from], [to], type, comment, short_term)
                    values(@prac, @from, @to, round(rand() * 5 + 1,0), 'adsufh awjfkhdsjadsgf', 'aa') 
                set @prac = @prac + 1
            end
            set @prac = 1
            set @day = @day + 1
        end
        set @day = 1
        set @month = @month + 1
    end
    set @month = 1
    set @year = @year + 1
end

I przyklad raportu, zeby sprawdzic wydajnosc (sredni dzienny czas pracy):

select year([from]), month([from]), day([from]), avg(datediff(hh, [from], [to]))
from worktable
group by year([from]), month([from]), day([from])
order by year([from]), month([from]), day([from])

Baza obejmuje 3 lata dla 200 pracownikow, zawiera 297600 wierszy i zajmuje ok. 48MB ;)

Generowanie tabeli to jakies 20s na moim kompie (hp dv5 1199ew), zaden z niego potezny serwer. Raport ok 0,5s.

Reasumujac: nie ma sie czego bac :D Pytanie tylko czy tabela odzwierciedla to co chciales uzyskac, ale tak to zrozumialem. W razie czego napisz wiecej, to mozna szybko sprawdzic.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-12-12 14:53

Rejestracja: 14 lat temu

Ostatnio: 6 lat temu

0

SQL mnie przeraża bo...
user image

Plik ma takową strukturę. On musi być w takiej formie graficznej. Nie wiem czy nie popełnię samobójstwa podczas tworzenia widoku czy czegoś takiego. O insertach nie wspomnę. Obsługa musi być głupotoodporna. Mistrzowie na produkcji mogą sobie nie poradzić. Plik binarny byłby dla mnie łatwiejszy, tym bardziej, że z tego ma być generowane podsumowanie miesiąca dla pracownika.


<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

2008-12-12 15:29

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

0

ADO.NET i DataGridView są bardzo przyjemne więc problemu raczej nie będzie, w ostateczności możesz nawet wyświetlać komórki we własnej kontrolce ;)

Pozostało 580 znaków

2008-12-12 15:43

Rejestracja: 15 lat temu

Ostatnio: 2 tygodnie temu

0

Rozumiem Twoje rozterki, ale tu masz wybór następujący:

  • albo będziesz miał skomplikowane generowanie widoku, za to manipulacje danymi proste (sql każdy zna i lubi ;))
  • albo będziesz miał struktórę, którą jednocześnie jest taka jak widok, za to manipulacja tą strukturą będzie piekłem.

Tak ja to przynajmniej widzę.

Aha jeszcze jedno - jeśli jakąś strukturę można zapisać w xml-u prawie na pewno można ją zapisać w relacyjnej bazie danych. Tym bardziej jak wspomniałeś masz wielowymiarowe tablice od struct do zapisania.

Pozostało 580 znaków

2008-12-12 16:16

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Ja bym sie nie zastanawial nawet tylko z miejsca bral SQL'a. Nie takie struktury sie tam tworzy i hulaja az milo. Widok napiszesz raz, stracisz na nim 3 dni i bedzie dzialal do konca swoich dni. Strukture napiszesz w te same 3 dni, bedziesz testowal 3 tygodnie i klal nastepne 3 lata na zyczenia klienta co do zmian w niej.

PS. Obrazek jest malutki i niewiele mowi, ale to ciagle obraz dwuwymiarowy czyli jak nic pasuje do tabel i wierszy ;) Napisz konkretna strukture to w wolnych chwilach ktos na pewno pomoze z zapytaniem :)


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-12-12 17:58

Rejestracja: 14 lat temu

Ostatnio: 6 lat temu

0

Kurcze, SQL odpadnie. Naprawdę nie mam pomysłu na to jak ogarnąć to coś. Struktura sama w sobie jest debilnie prosta bo:

USE [Harmonogram];

CREATE TABLE Employees(
  IDEmployee INTEGER PRIMARY KEY IDENTITY (1,1),
  LastName   VARCHAR (30),
  FirstName  VARCHAR (30),
  PersonalNo INTEGER NOT NULL, 
  Crew       CHAR(1), 
  WorkArea   VARCHAR(3), 
  DefWorkSys SMALLINT -- system pracy: 12h, 8h
);

CREATE TABLE ScheduleCodes(
  IDScheduleCode INTEGER PRIMARY KEY IDENTITY (1,1),
  CodeName       VARCHAR(2)
);

CREATE TABLE WorkDays(
  IDWorkDay    INTEGER PRIMARY KEY IDENTITY (1,1),
  EmployeeID   INTEGER FOREIGN KEY REFERENCES Employees(IDEmployee),
  ScheduleCode INTEGER FOREIGN KEY REFERENCES ScheduleCodes(IDScheduleCode),
  HourCount    SMALLINT
);

Tylko, że jak ja mam to teraz zainicjować tak aby odzwierciedlić strukturę, czyli dodać dni, gdzie pracownik nie pracował. Wkleję jeszcze raz obrazek. Obetnę dni z 31 na 10. Obecnie harmonogram działa na excelu i działałby dalej gdyby nie fakt, że zaszła potrzeba wydawać np urlop na godziny. Do tej pory było jeden dzień jeden skrót (np UW - urlop wypoczynkowy). Teraz trzeba dawać np UW-4h/OP-4h/UB-4h i właśnie to rozbicie na szczegóły powoduje, że powstał trzeci wymiar tablicy.


<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

2008-12-12 20:52

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Nie bardzo rozumiem Twoj problem, mowiac szczerze. Oprocz tego, ze dalej nie widze potencjalnych komplikacji i tego, co chcesz osiagnac. Robilem pare razy spore harmonogramy na duzo wiecej osob (2 tys. osob w firmie) porozdzielanych na teamy, oddzialy, itp. I sql nadaje sie do tego wysmienicie.

Wracajac do struktury:

  1. Co oznacza tabela ScheduleCodes?
  2. Gdzie jest data dotyczaca danego dnia pracy?
  3. Czemu nie oznaczac poczatku i konca pracy godzinami (tak jak podalem w przykladzie)? W ten sposob moglbys 'wycinac' godziny poza praca oznaczajac je np. w osobnej tabeli (tabela urlopy czy cos). O ile sie nie myle w Northwindzie (przykladowa baza na sql 2000) byl przyklad tabel pracowniczo-urlopowych.

PS. Jesli nie mozesz tego ogarnac sql'em to tym bardziej pakowanie to w twarda strukture binarna uniemozliwi Ci gladkie zmiany w przyszlosci.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-12-12 22:02

Rejestracja: 14 lat temu

Ostatnio: 6 lat temu

0

Muszę się przespać z tym problemem. Johny_bravo wiem do czego zmierzasz. Nothwind nieco mi rozjaśnił. Musze pokombinować z tym. Niebawem się odezwę z szablonem.

Nie poradzę sobie z zapytaniami INSERT i UPDATE. Gdybym miał tabelę

CREATE TABLE Employee(
  LastName VARCHAR (
  Day1 VARCHAR(5),
  (...)
  Day31 VARCHAR(5)
);

To wszystko ok. Problem w tym, że przy takiej strukturze SQL jest do d*** bo SELECT działa na wierszach a nie kolumnach - czyli muszę dokonać transpozycji do takiej postaci. Do tego dochodzi, że jak kliknę komórkę na DataGrid-Master to w DataGrid-Detail pojawia się szczegółowa lista. Problem mam w odwzorowaniu współrzędnych. komórki na rzeczywisty wpis w bazie. Bo pic polega na tym, ze bardzo istotnym elementem struktury jest odwzorowanie kalendarza pracy. W momencie gdy mam zwykłą tablicę dwuwymiarową to nałożenie na to DataGrid jest proste. Potem podczas zapisu nadpisanie całości tablicy. Bo z SQL to skąd będę wiedział co było modyfikowane.

Johny_bravo, pisałeś, że robiłeś już takie harmonogramy - czy miały one taka formę? Jak rozwiazałeś inserty i updaty do bazy?
Poniżej wklejam większe zdjęcie: http://www.fotosik.pl/showFullSize.php?id=292d1d2e4f62e047

Na rapida wklejam plik harmonogram.xls
http://rapidshare.com/files/172931390/Harmonogram_2008.xls.html

I jeszcze jedno. Nie miałbym problemu gdyby:
Tabela1(pracownik) - Tabel2(kalendarz) - Tabela3(szczegóły dnia). Ale muszę pokazać wszystko na raz.


<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0