dwie bazy danych

0

Witam,

Chciałbym się was poradzić o taką o to rzecz.

Piszę aplikację w C# do obsługi bazy danych. Wiec jest jeden główny serwer bazy danych (sql server 2005 lub postgresql ) w aplikacji tej chcę zrobić aby dane zawarte w tabelach na głównym serwerze były sciągane do mojego komputera ( tylko najnowsze wpisy od czasu mojego ostatniego połączenia ) a na moim komputerze dane te były przechowywane w bazie danych sqlite .

Czy sądzicie ze takie rozwiązanie jest dobrym pomysłem ?

0

A nie lepiej w takiego samego rodzaju bazie? Latwiej byloby skopiowac strukture i pozniej zawartosc. I po co taka kopia?

0

Wiec kopia bazy danych aby szybko wyszukać informacji i nawet przy słabym połączeniu , sciagnąć tylko kilka nowych rekordów i dopisać je do bazy na komputerze z aplikacją . SQLite dlatego iż nie wymaga dużego wysiłku aby ją zainstalować . To jest tylko taki zamysł a czy uda mi się to połączyć w jedną całość to czas pokaże .

0

A czy na pewno warto?
Chodzi mi o to, że będziesz musiał sprawdzać co jakiś czas czy nie zmienił się stan bazy.
Jak będziesz sprawdzał np. co 5 minut to są spore szanse, że przez jakiś czas będziesz pracował na nieaktualnej bazie (i tu pojawiają się wszystkie problemy z dostępem do danych przez wielu użytkowników, którymi się zazwyczaj się nie przejmujesz, bo DBMS się tym zajmuje, a teraz sam je będziesz musiał rozwiązać) i na tym pewnie połamiesz sobie zęby.
Jeśli będziesz robił to co 1-5 sekund to pewnie wygenerujesz taki ruch, że już lepiej bezpośrednio łączyć się z bazą (poza tym i tak nie będziesz miał gwarancji, że z unikniesz problemów z poprzedniego przykładu).

Sens miałoby to, gdyby byl tylko jeden klient read-write, a wiele read-only. Ale to mało prawdopodobne, że akurat tak masz ;)

Lepiej sprawdź czy Twoja baza + moduł do komunikcji z nią nie dają możliwości jakiegoś cache'owania wyników zapytań.

0

Co sprawdzania czy baza sie nie zmieniła chciałem zrobić że dana osoba np. raz dziennie łączy się z bazą i pobiera dane które zostały wprowadzone od jego ostatniej wizyty . np. Czy są jakieś w bazie glownej identyfikatory których ja jeszcze nie mam .

Chcę aby to było na dwóch bazach aby bez względu na to czy dana osoba ma połączenie z internetem czy nie mogła swobodnie sobie pracować na swoich zebranych danych . A przez połączenie z główną bazą tylko aktualizować dane na swoim komputerze i wysyłać pewne dane do bazy głównej.

0

Rozumiem, ale wydaje mi się, że nie wiesz jakie problemy przed Tobą stoją:
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
Phantom reads, dirty reads i inne problemy z "wielodostępem".

0

Jestem świadomy występowania anomalii w takiej sytuacji.
W takim razie może lepiej było by zrobić aby dane mogły by być aktualizowane na komputerze użytkownika.
Natomiast dane mogły by być wpisywane do bazy danych głównej przez wybranego użytkownika ? poprzez bezpośrednie połączenie z bazą danych ?

0

Nie wiem, czy odpowiem na Twoje pytanie, ale najłatwiejsze w implementacji wydaje mi się następujące rozwiązanie:
1 klient łączy się z bazą i dostaje aktualne dane (lub dane, których mu brakuje)
2 na tych danych pracuje w trybie read (przegląda, filtrule, sortuje)
3 w momencie kiedy chce coś zmienić/dodać wykonuje to na bazie głównej, po czym wykonywany jest krok 1 i cykl zaczyna się od nowa.

W takim rozwiązaniu pozostaje Ci tylko w p. 3 sprawdzić, czy w momencie dodania/edycji dane w bazie głównej są takie jak lokalnie u klienta. (jeśli nie - zapytać usera co robić: zaktualizować u niego, czy dokonać zapisu mimo wszystko<niebezpieczeństwo utraty spójności>).

To jest tylko przykład. Tak na prawdę ten mechanizm trzeba by zaprojektować dla konkretnego systemu.
Przykład: system zarządzania plikami tekstowymi (twoja baza to lista plików + ich zawartość).
Rozwiązanie: jak wyżej, bez większych problemów.

Przykład2: typowy system do zarządzania szpitalem (wiele tabel i wszystkie jakoś powiązane za pomocą kluczy obcych)
Rozwiązanie: Przy zmienianiu jednej krotki możesz być zmuszony do sprawdzenia 100 innych (czy są takie jak na lokalu) żeby mieć pewność, że baza zachowa spójność. Ale i w tym przypadku, może się zdarzyć tak:

  • klient 1 chce dokonać zapisu i sprawdza czy ok
  • klient 2 j.w.
  • klient 1 dostaje info, że może (dane się nie zmieniły)
  • klient 2 j.w.
  • klient 1 dokonuje zapisu
  • klient 2 dokonuje zapisu (błąd - dokonał zapisu pomimo zmienionych danych w bazie głównej)

Napisz może dokładnie jakiego rodzaju jest to system, to będziemy mogli sensownie pogadać.
Ale ja bym się za to nie brał, jeśli to ma być tylko usprawnienie dla potencjalnych 2% userów z wolnym łączem.

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