WPF + MVVM, Przechowywanie obiektów z bazy danych

Odpowiedz Nowy wątek
2017-08-09 19:32

Rejestracja: 4 lata temu

Ostatnio: 1 rok temu

0

Cześć,
Stworzyłem mały programik w ramach nauki i zastanawiam się jak go udoskonalić. Chodzi o połączenie z bazą danych i przechowywanie danych.
Program zawiera kilka widoków, w każdym z nich wykorzystuje pewną listę obiektów, które trzymam w bazie danych (lub jej część, lub dodatkowo przetwarzam te dane i dopiero wykorzystuje), wszystko z bindowanie, INotifyPropertyChanged itd. Teraz mam to zrobione tak, że w trakcie uruchomienia programu zaczytuję listę obiektów z bazy danych i przechowuję je w pamięci, w singletonie (to jest pierwszy niepewny punkt), tak abym mógł się dostać do danych bez problemu z każdego punktu programu. Nie wiem też czy dobrze jest zaczytywać wszystko na początku i operować na danych z pamięć czy za każdym razem jak chce wyświetlić listę lub jej część to mam ponownie wysyłać zapytanie do bazy danych.

Pozostało 580 znaków

2017-08-09 20:45

Rejestracja: 8 lat temu

Ostatnio: 3 miesiące temu

3

Zalezy jak duża jest Twoja baza danych. Ale chyba lepiej za każdym razem wysyłać zapytanie, wtedy masz pewność, że dane które masz w pamięci nie są różne od tych w bazie

Pozostało 580 znaków

2017-08-09 20:47

Rejestracja: 6 lat temu

Ostatnio: 1 godzina temu

3

Teraz mam to zrobione tak, że w trakcie uruchomienia programu zaczytuję listę obiektów z bazy danych i przechowuję je w pamięci, w singletonie (to jest pierwszy niepewny punkt), tak abym mógł się dostać do danych bez problemu z każdego punktu programu. Nie wiem też czy dobrze jest zaczytywać wszystko na początku i operować na danych z pamięć czy za każdym razem jak chce wyświetlić listę lub jej część to mam ponownie wysyłać zapytanie do bazy danych.

A co jeśli w bazie będzie kilka milionów obiektów? Zaczytasz wszystkie? ;) Tak, wyślij jeszcze raz zapytanie oraz używaj stronicowania.


https://solid.jobs - oferty pracy 15k dla specjalistów oraz narzędzia wspomagające proces rekrutacji.
edytowany 2x, ostatnio: mstl, 2017-08-09 22:43

Pozostało 580 znaków

2017-08-09 22:12

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

2

musisz do tego podejść zdroworozsądkowo - po pierwsze ile tych danych jest, po drugie jak często się one zmieniają i na ile ich "nieaktualność" ma wpływ na pracę a po trzecie jak często po nie sięgasz w programie. Jeśli są to jakieś słowniki, które generalnie uzupełnia się na raz i mają po kilkadziesiąt - kilkaset rekordów a sięgasz do nich co parę minut to możesz spokojnie raz je zaciągnąć i trzymać w pamięci. W końcu RAMu ci w komputerach dostatek :).


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
A jakbym miał je trzymać w ramie, to lepiej jest trzymać w obiekcie globalnym (Singleton lub coś w tym stylu), czy tworzyć jakiś mechanizm którym przesyłałbym tą listę pomiędzy ViewModelami? - vesper0990 2017-08-09 22:37

Pozostało 580 znaków

2017-08-09 22:27

Rejestracja: 4 lata temu

Ostatnio: 1 rok temu

0

No ma to sens. A co w przypadku gdy muszę najpierw przetworzyć wszystkie rekordy? Np jakbym miał produkty i musiałbym zsumować cenę całkowitą i z jakiegoś okresu i jeszcze jakąś. To lepiej jest to robić po stronie bazy? Nawet jeżeli wiązałoby się to z JOIN-ami??

I jeszcze jedno:D Jeżeli w tabeli muszę przedstawić dane z kilku tabel, to dobrym pomysłem będzie stworzenie konkretnej klasy pod tą tabele (taki model pośredni, tak jak ViewModel w ASP MVC??)

Pozostało 580 znaków

2017-08-09 22:39

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

vesper0990 napisał(a):

No ma to sens. A co w przypadku gdy muszę najpierw przetworzyć wszystkie rekordy? Np jakbym miał produkty i musiałbym zsumować cenę całkowitą i z jakiegoś okresu i jeszcze jakąś.

a co to jest cena całkowita? BTW to zależy od tego czy potrzebujesz tylko tą "cenę całkowitą" czy także poszczególne towary, które potem będziesz mocno wykorzystywał. Generalnie poza stałymi słownikami nie ma co niepotrzebnie pobierać danych "na później". W szczególności jeśli docelowo aplikacja ma mieć wielu userów to dane (jak np. sprzedaż za okres czy stan magazynowy) zmienia się na tyle szybko, że trzymanie tego w pamięci nie ma sensu

To lepiej jest to robić po stronie bazy? Nawet jeżeli wiązałoby się to z JOIN-ami??

Nie mam pojęcia co to wg Ciebie znaczy "po stronie bazy"

I jeszcze jedno:D Jeżeli w tabeli muszę przedstawić dane z kilku tabel, to dobrym pomysłem będzie stworzenie konkretnej klasy pod tą tabele (taki model pośredni, tak jak ViewModel w ASP MVC??)

To też zależy - jeśli ten "widok" będzie niezmienny (chodzi o kolumny, które chcesz pokazać) to możesz go opakować w dodatkową klasę


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2017-08-10 08:02

Rejestracja: 8 lat temu

Ostatnio: 3 miesiące temu

0
vesper0990 napisał(a):

No ma to sens. A co w przypadku gdy muszę najpierw przetworzyć wszystkie rekordy? Np jakbym miał produkty i musiałbym zsumować cenę całkowitą i z jakiegoś okresu i jeszcze jakąś. To lepiej jest to robić po stronie bazy? Nawet jeżeli wiązałoby się to z JOIN-ami??

I jeszcze jedno:D Jeżeli w tabeli muszę przedstawić dane z kilku tabel, to dobrym pomysłem będzie stworzenie konkretnej klasy pod tą tabele (taki model pośredni, tak jak ViewModel w ASP MVC??)

Wtedy lepiej zrobić zapytanie pobierajace wszystkie komórki danej kolumny z danej tabeli. Ograniczasz zużycie danych

Pomimo przeczytania tego kilka razy nie mam pojęcia co chciałeś przekazać - abrakadaber 2017-08-10 09:35
jak chce coś policzyć to zamiast wczytywać Całą tebele z kolumnami "ID", "nazwa" itd można pobrać wszystkie komórki z kolumny "Wartość". Wszystko zamyka się w ułożeniu odpowiedniego zapytania do bazy - gswidwa 2017-08-10 20:00

Pozostało 580 znaków

2017-08-10 17:59
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Wrocław

0
vesper0990 napisał(a):

No ma to sens. A co w przypadku gdy muszę najpierw przetworzyć wszystkie rekordy? Np jakbym miał produkty i musiałbym zsumować cenę całkowitą i z jakiegoś okresu i jeszcze jakąś. To lepiej jest to robić po stronie bazy? Nawet jeżeli wiązałoby się to z JOIN-ami??

A w czym joiny w aplikacji lepsze od tych w bazie?
Możesz to zrobić po stronie zarówno aplikacji (wysyłając odpowiedni SQL, albo definiując odpowiednią agregację w ORMie) a także po stronie bazy.
Wszystko zależy od tego, do czego to tak naprawdę potrzebujesz, czy to ma być jakiś np. raport, czy chcesz mieć te dane utrwalone, i jak często będziesz z nich korzystał.

I jeszcze jedno:D Jeżeli w tabeli muszę przedstawić dane z kilku tabel, to dobrym pomysłem będzie stworzenie konkretnej klasy pod tą tabele (taki model pośredni, tak jak ViewModel w ASP MVC??)

Używasz słowa "tabela" w jednym zdaniu w prawdopodobnie dwóch znaczeniach, co utrudnia zrozumienie pytania.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
Chodzi o takie dane, które zmieniają się dość często. Zrobimy coś w programie przez co doszło parę rekordów i trzeba odświeżyć jakieś wykresy np. No tak nie zauważyłem, chodziło mi żeby do jednego DataGrid wstawić dane które są zawarte w kilku tabelach w bazie danych. - vesper0990 2017-08-11 09:00
Na temat wątku odpisuj w postach. - somekind 2017-08-11 11:11

Pozostało 580 znaków

2017-08-11 11:31

Rejestracja: 4 lata temu

Ostatnio: 1 rok temu

0

Chodzi o takie dane, które zmieniają się dość często. Zrobimy coś w programie przez co doszło parę rekordów i trzeba odświeżyć jakieś wykresy np. No tak nie zauważyłem, chodziło mi żeby do jednego DataGrid wstawić dane które są zawarte w kilku tabelach w bazie danych.

Pozostało 580 znaków

2017-08-11 12:03

Rejestracja: 5 lat temu

Ostatnio: 47 sekund temu

0

Witam,

Może powiedz ile tych danych będzie i w jakiej bazie chcesz je przechowywać? Np SQL Server pozwala na przesyłanie notyfikacji (https://www.nuget.org/packages/SqlTableDependency/). Poza tym zawsze możesz wstawić jakąś warstwę pośrednią która będzie gadała z twoim programem zwracając Ci gotowe obiekty i kolekcje a dodatkowo informowała o tym że coś się zmieniło.

Pozdrawiam,

mr-owl

edytowany 1x, ostatnio: mr-owl, 2017-08-11 12:08

Pozostało 580 znaków

2017-08-11 12:23
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Wrocław

0
vesper0990 napisał(a):

Chodzi o takie dane, które zmieniają się dość często. Zrobimy coś w programie przez co doszło parę rekordów i trzeba odświeżyć jakieś wykresy np.

A te wykresy mają się zmieniać w czasie rzeczywistym, czy po prostu po wejściu na odpowiedni ekran, czy może użytkownik ma mieć dostępny jakiś przycisk "odśwież"?

No tak nie zauważyłem, chodziło mi żeby do jednego DataGrid wstawić dane które są zawarte w kilku tabelach w bazie danych.

No to zrób sobie viewodel do tego DataGrida. To zresztą nawet oczywiste, że do każdego ekranu aplikacji powinieneś mieć oddzielny ViewModel.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Odpowiedz

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