Autor Wątek: Mini baza danych - reprezentacja danych  (Przeczytany 5254 razy)

Offline Karczas

  • Użytkownik
    • DevBlog

# Grudzień 19, 2007, 22:56:57
Witam.
Dane jest mi napisać prostą, konsolową bazę danych w C#. Bez użycia żadnych serwerów, SQLi i innych wynalazków. Czysty
C# i System.xxxx. Problem tkwi w tym, że tych danych jest dość dużo - są trzy pliki - jeden ok 4Mb, drugi 6Mb a trzeci to jakieś groszowe sprawy. W tych plikach znajdują się jakieś tam dane - generalnie rekordy zawierają od 3 do 6 pól - czyli dość mało. Ułożone są tak, że nadrzędną tabelą jest tabela A. Jednym polem odnosi się do wielu rekordów w tablicy B - ta z kolei jednym polem odwołuje się do elementów tablicy C. Trochę zakręciłem, ale myślę, że rozumiecie o co chodzi. Teraz trzeba to jakoś posortować/poukładać. Ja widział bym to w drzewie - chodzi o to, że jeżeli z widoku usunę jakieś rekordy z tabeli A to znikną też połączone z nimi rekordy w tabeli B - a wraz z nimi połączone w tabeli C.  Mówiąc "po fachowemu" - chciałbym utworzyć relację między tymi tabelami i w przypadku usunięcia jakiegoś rekordu resztę usuwać kaskadowo.
Zazwyczaj robił za mnie takie rzeczy Firebird i zapytania, ale teraz ma być inaczej.

Jak Wy byście to zrobili? Kombinowałem trochę, ale wolno działa :/

Pozdrawiam,
Karczas

//Edit:
P.S. Mile widziany jakiś kod;) Chociaż za samą ideę też będę wdzięczny ;)
« Ostatnia zmiana: Grudzień 19, 2007, 23:01:06 wysłana przez Karczas »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Netrick

  • Użytkownik

# Grudzień 19, 2007, 23:02:57
Powiem krótko: kombinuj dalej, na pewno coś ci wpadnie do głowy. Swoją drogą to forum o programowaniu gier a nie baz danych ;p

Offline Karczas

  • Użytkownik
    • DevBlog

# Grudzień 19, 2007, 23:09:56
Co nie zmienia faktu, że są na tym forum wątki przeznaczone do dyskusji na temat składni i nie należy ganić nikogo za to, że chce się czegoś dowiedzieć.

I za wszystkie posty w stylu "proście, a zostanie wam dane", czy "szukajcie, a znajdziecie" serdecznie dziękuję. Napisałem już dwa rozwiązania tego problemu, co trochę wymagało ode mnie pomyślunku i pracy, więc postanowiłem się zapytać tutaj.

Offline SirMike

  • Użytkownik
    • SirMike's Techblog

# Grudzień 19, 2007, 23:13:15
Ja bym zrobil 3 pliki XML i relacje pomiedzy nimi w obiektach. Jak zaprzegniesz do przeszukiwania Linq to pojdzie jak po masle.

Offline Netrix

  • Redaktor
    • Netrix’s devBlog

# Grudzień 19, 2007, 23:16:00
Powiem krótko: kombinuj dalej, na pewno coś ci wpadnie do głowy. Swoją drogą to forum o programowaniu gier a nie baz danych ;p

 To jest forum o programowaniu, głównie gier, ale samego programowania też się tyczy, bo każdy aspekt jest wykorzystywany w grach (ten również), więc nie pisz byle spamu.

Do tematu:

Może chcesz zrobić listę, która zawiera element i odniesienie do elementu innej listy. Tyle przychodzi mi na myśl od razu.
« Ostatnia zmiana: Grudzień 19, 2007, 23:17:55 wysłana przez Netrix »

Offline Karczas

  • Użytkownik
    • DevBlog

# Grudzień 19, 2007, 23:16:25
Niestety nie mogę - muszę użyć tych najbardziej pierwotnych mechanizmów C#. Czyli po prostu krok po kroku to oprogramować. Świta mi po głowie kolejny pomysł - jak coś wymóżdżę to dam znać. Póki co czekam na Wasze opinie.

Offline SirMike

  • Użytkownik
    • SirMike's Techblog

# Grudzień 19, 2007, 23:30:40
Niestety nie mogę - muszę użyć tych najbardziej pierwotnych mechanizmów C#. Czyli po prostu krok po kroku to oprogramować. Świta mi po głowie kolejny pomysł - jak coś wymóżdżę to dam znać. Póki co czekam na Wasze opinie.

Hehe, nie mow, ze w szkole tak wymagaja :) Nie wroze kariery zawodowej gdy klada do glowy tylko cos takiego.

Offline Xion

  • Moderator
    • xion.log

# Grudzień 19, 2007, 23:36:05
Skoro musisz to okodzić, to po prostu to... skodź :) Wymyśl struktury danych, zaprojektuj algorytmy aktualizujące i przeszukujące, i po prostu napisz to. Nie ma rady, jeśli wyższe siły zabraniają ci użycia ADO i innych pożytecznych wynalazków.

Offline vashpan

  • Użytkownik
    • Strona

# Grudzień 20, 2007, 00:57:04
Niestety nie mogę - muszę użyć tych najbardziej pierwotnych mechanizmów C#. Czyli po prostu krok po kroku to oprogramować. Świta mi po głowie kolejny pomysł - jak coś wymóżdżę to dam znać. Póki co czekam na Wasze opinie.

Hehe, nie mow, ze w szkole tak wymagaja :) Nie wroze kariery zawodowej gdy klada do glowy tylko cos takiego.


To nie jest nic dziwnego, kazdy programista powinien odnajdywac sie w tych podstawach, zeby moc efektywniej pozniej korzystac z danych narzedzi - i rozumiec mniej wiecej jak dzialaja.

Offline SirMike

  • Użytkownik
    • SirMike's Techblog

# Grudzień 20, 2007, 01:02:36
To nie jest nic dziwnego, kazdy programista powinien odnajdywac sie w tych podstawach, zeby moc efektywniej pozniej korzystac z danych narzedzi - i rozumiec mniej wiecej jak dzialaja.

Oczywiscie ale nie w ten sposob :) Potem pojdzie taki delikwent do pracy i nie wie, ze istnieje mnostwo innych wydajniejszych sposobow. Nie jest sztuka wiedziec jak to dziala u podstaw, sztuka jest wiedziec co mozna zastosowac i gdzie.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Grudzień 20, 2007, 02:17:44
Cytuj
Jak Wy byście to zrobili? Kombinowałem trochę, ale wolno działa :/
Nie masz tych danych zbyt wiele, więc na Twoim miejscu bym na starcie wszystko wczytał do czegoś w stylu mapy z C++ albo do hashtable'a i po kłopocie. Wszystko będzie śmigało błyskawicznie, a przy okazji będzie bajecznie wygodne w obsłudze (czytaj: mało kodu do wklepania). :)

Cytuj
Wymyśl struktury danych, zaprojektuj algorytmy aktualizujące i przeszukujące, i po prostu napisz to.
Jak dla mnie to kontenery podchodzą pod "najbardziej pierwotne mechanizmy C#", więc nie ma sensu się bawić w kodowanie koła na nowo. :)

Offline Xion

  • Moderator
    • xion.log

# Grudzień 20, 2007, 10:34:09
Krzysiek K.: Przecież nie powiedziałem, czego ma w tych strukturach używać :) Napisałem jedynie, że powinien stworzyć sobie obiekty reprezentujące jego dane i powiązać je relacjami tak, aby przypominało to coś w stylu bazy danych. Używanie wbudowanych kontenerów jest jak najbardziej wskazane.
Algorytmy zaś to odpowiedniki zapytań do tejże bazy.

Offline Karczas

  • Użytkownik
    • DevBlog

# Grudzień 20, 2007, 12:09:10
W moich poprzednich algorytmach najsłabszym (najwolniejszym) ogniwem było segregowanie danych. Teraz mam zamiar zabrać się do tego w ten sposób:

Utworzyć sobie klasy/struktury przechowujące pola jednego rekordu a następnie trzy kolekcje - każda zawierać będzie tylko elementy z jednej tabeli - porozrzucane.
Następnie utworzę sobie dwie kolekcje indeksów - czyli takich "myków", które będą zawierać pola "rekord" (numer elementu w kolekcji o której mówiłem wcześniej) i "wartosc" (wartość kluczowego pola rekordu). Te kolekcje posortuję według pola "wartosc". Znacznie usprawni to przeszukiwanie i łączenie tabel w relacje.
Następnie utworzę sobie jakąś klasę zawierającą drzewo połączeń - np. do elementu 1 tabeli A należą elementy 0,1,2,3,4 tabeli B, do elementu 4 tabeli B należą elementy 23,42,12 tabeli C. Trzymać w tym drzewie będę tylko indeksy do elementów w kolekcjach, o których pisałem na początku.
Myślę, że tak powinno być wydajnie. Co o tym sądzicie? Dziś/jutro spróbuję to zakodować i dam znać jak poszło.

Mam również pytanie. Czy opłaca mi się pisać własną funkcję porównującą dwa łańcuchy znaków? Chciałbym to zrobić tak, że pierwszym warunkiem jest równa długość łańcuchów. Jeżeli jest spełniony, to porównywane są kolejne znaki dopóki nie porówna się wszystkich znaków bądź jakiś znak nie okaże się różny. Będzie to szybsze niż metoda Compare() klasy string? Chodzi o to, że niektóre pola indeksowe są obiektami typu string i chciałbym dokonywać porównania możliwie najszybciej.

Pozdrawiam,
Karczas

P.S. A projekt piszę dla siebie, bo chodzę do technikum, a jest to zadanie na zaliczenie na studiach (dość luźno powiązanych z samym programowaniem) i wyklucza użycie dodatkowych "ulepszaczy". Zadanie przewiduje napisanie programu w Javie, ale że uczę się C# to postanowiłem w tym języku wszystko skodzić.

Offline SirMike

  • Użytkownik
    • SirMike's Techblog

# Grudzień 20, 2007, 12:14:30
Utworzyć sobie klasy/struktury przechowujące pola jednego rekordu a następnie trzy kolekcje - każda zawierać będzie tylko elementy z jednej tabeli - porozrzucane.
Następnie utworzę sobie dwie kolekcje indeksów - czyli takich "myków", które będą zawierać pola "rekord" (numer elementu w kolekcji o której mówiłem wcześniej) i "wartosc" (wartość kluczowego pola rekordu). Te kolekcje posortuję według pola "wartosc". Znacznie usprawni to przeszukiwanie i łączenie tabel w relacje.
Następnie utworzę sobie jakąś klasę zawierającą drzewo połączeń - np. do elementu 1 tabeli A należą elementy 0,1,2,3,4 tabeli B, do elementu 4 tabeli B należą elementy 23,42,12 tabeli C. Trzymać w tym drzewie będę tylko indeksy do elementów w kolekcjach, o których pisałem na początku.
Myślę, że tak powinno być wydajnie. Co o tym sądzicie? Dziś/jutro spróbuję to zakodować i dam znać jak poszło.

Imho, calkiem poprawne.

Cytuj
Mam również pytanie. Czy opłaca mi się pisać własną funkcję porównującą dwa łańcuchy znaków? Chciałbym to zrobić tak, że pierwszym warunkiem jest równa długość łańcuchów. Jeżeli jest spełniony, to porównywane są kolejne znaki dopóki nie porówna się wszystkich znaków bądź jakiś znak nie okaże się różny. Będzie to szybsze niż metoda Compare() klasy string? Chodzi o to, że niektóre pola indeksowe są obiektami typu string i chciałbym dokonywać porównania możliwie najszybciej.

Az sie prosi o implementacje IComparable.
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref2/html/M_System_IComparable_CompareTo_1_b4c5a2da.htm

Offline Moriturius

  • Użytkownik

# Grudzień 20, 2007, 12:25:30
Mam również pytanie. Czy opłaca mi się pisać własną funkcję porównującą dwa łańcuchy znaków? Chciałbym to zrobić tak, że pierwszym warunkiem jest równa długość łańcuchów. Jeżeli jest spełniony, to porównywane są kolejne znaki dopóki nie porówna się wszystkich znaków bądź jakiś znak nie okaże się różny. Będzie to szybsze niż metoda Compare() klasy string? Chodzi o to, że niektóre pola indeksowe są obiektami typu string i chciałbym dokonywać porównania możliwie najszybciej.

Wg mnie to niespecjalnie dobry pomysł. Jeśli funkcja ma sprawdzać czy dwa łańcuchy są równe to ok, ale z tego co widzę chcesz tego używać do sortowania, więc potrzebujesz jeszcze wiedzieć, które ze słów jest "wcześniej". Rozumiem, że jeśli słowo A będzie krótsze od B to od razu zwrócisz że A jest mniejsze?
Załóżmy więc że A="dym" oraz B="autko". W takim wypadku prawdziwe byłoby że "dym" < "autko", a jak powszechnie wiadomo - raczej tak nie jest :P  A przynajmniej nie chciałbym korzystać ze słownika w którym posortowano w ten sposób wyrazy.

Dlatego uważam, że metoda CompareTo() klasy string w zupełności wystarcza.
« Ostatnia zmiana: Grudzień 20, 2007, 12:28:24 wysłana przez Moriturius »