C# JSON projekt Rozwiązania

Odpowiedz Nowy wątek
2018-06-07 10:07
konsul41
0

VisualStudio 2017 Comunity

Stoję przed dylematem.
Przepisuję "system" księgowy z Delphi na C#
I myślę aby dane dokumentów przechowywać w Bazie w postaci JSON
Baza To Postgresql i on obsługuje JSON.
I teraz pytanie czy takie rozwiązanie nie będzie strzałem w nogę, chodzi o ewentualne problemy w zapytaniach SQL?

Robię to mniej więcej tak:

[DataContract]
    public class TDaneDokRozny
    {
 
        [DataMember]
        public TNaglowekRozny Naglowek { get; set; } = null;
        [DataMember]
        public TCialoRozny Cialo { get; set; } = null;
        public TDaneDokRozny()
        {
            Naglowek = new TNaglowekRozny();
            Cialo = new TCialoRozny();
        }
 
    }

następnie testowa serializacja do pliku

FileStream stream1 = new FileStream("C:\\Users\\Admin\\Desktop\\plik.JSON", FileMode.OpenOrCreate);
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TDaneDokRozny));
            ser.WriteObject(stream1, ta);

i deserializacja

 FileStream stream1 = new FileStream("C:\\Users\\Admin\\Desktop\\plik.JSON", FileMode.OpenOrCreate);
                        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TDaneDokRozny));
                        stream1.Position = 0;
                        dane = (TDaneDokRozny)ser.ReadObject(stream1);

Dane widzę prawidłowe więc chyba działa z pliku.
Tylko czy to nie jest ślepa uliczka?

edytowany 1x, ostatnio: ŁF, 2018-06-07 11:38

Pozostało 580 znaków

2018-06-07 22:56
0

A jaki jest spodziewany zysk z takiego podejscia?
Księgowość raczej lubi tabelki.

Pozostało 580 znaków

2018-06-07 23:47
0
konsul41 napisał(a):

Przewagą nad klasycznym podejściem jest serializacja do obiektów C#;

Ale co to za przewaga, skoro z baz relacyjnych też się da?


"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

2018-06-08 00:11
0

Tak czytając ten wątek, zastanawiam się do czego można wykorzystać ten ficzer tabel json

edytowany 1x, ostatnio: kulson, 2018-06-08 00:11
Ja miałem kiedyś wykorzystywany jako tymczas przy pobieraniu danych z api, które po załadowaniu do bazy były usuwane - endrius 2018-06-08 00:15
Logowanie requestów do API. - somekind 2018-06-08 00:33

Pozostało 580 znaków

2018-06-08 00:17
0
konsul41 napisał(a):

Z bazy pobieram Jako String (varchar)

Ale w jaki sposób to z bazy jest pobrane? Jakiś select?

Pozostało 580 znaków

2018-06-08 08:04
konsul41
0

Klasycznie
pole dokument jest typu json

SELECT dokument FROM ksiegidokumenty WHERE dok_id = :dok_id;

Nie bagatelną zaletą jest prostota odwzorowania obiektu C# (serializacja) i zapisanie go w bazie, przy okazji nie tracimy zalet bazy w wyszukiwaniu.

Przy Takiej tabeli
CREATE TABLE ksiegidokumenty
(
dok_id serial NOT NULL,
dokument json
)

pole dokument mogło by wyglądać tak
{"Cialo":[{"brutto":128.08,"bruttoww":0,"dok_id":130593,"kontoma":"203-179","kontown":"751-1","main_id":50278,"nazwa":"Rónice Kursowe","opis":"Rónice Kursowe"}],"Naglowek":{"Kontrahent_id":14098,"NazwaDziennika":"inne","NumerDokumentu":"PK 2\/2017","NumerDziennika":4,"TypDokumentu":"Rózny","brutto":0,"bruttoww":0,"datadok":"\/Date(1483484400000+0100)\/","datakurs":"\/Date(1528437612957+0200)\/","datapod":"\/Date(1483484400000+0100)\/","datarej":"\/Date(1483484400000+0100)\/","dok_id":50278,"dokwwal":false,"kurs":0,"miesiac":1,"opis":"","rok":2017,"tabelakurs":"","waluta":"","waluta_przelicznik":0}}
Przy okazji ten tekst pochodzi bezpośrednio z serializera i jest gotowy do wstawienia do bazy.

Pozostało 580 znaków

2018-06-08 08:08
konsul41
0

A tak wyglądałoby wyszukiwanie dokumentów z bieżącego okresu z dzienniaka inne

SELECT dok_id, dokument FROM ksiegidokumenty WHERE dokument -> 'Naglowek'->>'rok'='2017' AND dokument -> 'Naglowek'->>'miesiac'='1' AND dokument -> 'Naglowek'->>'NazwaDziennika'='inne';

Pozostało 580 znaków

2018-06-08 08:34
0
konsul41 napisał(a):

Klasycznie
pole dokument jest typu json

SELECT dokument FROM ksiegidokumenty WHERE dok_id = :dok_id;

Nie bagatelną zaletą jest prostota odwzorowania obiektu C# (serializacja) i zapisanie go w bazie, przy okazji nie tracimy zalet bazy w wyszukiwaniu.

Przy Takiej tabeli
CREATE TABLE ksiegidokumenty
(
dok_id serial NOT NULL,
dokument json
)

pole dokument mogło by wyglądać tak
{"Cialo":[{"brutto":128.08,"bruttoww":0,"dok_id":130593,"kontoma":"203-179","kontown":"751-1","main_id":50278,"nazwa":"Rónice Kursowe","opis":"Rónice Kursowe"}],"Naglowek":{"Kontrahent_id":14098,"NazwaDziennika":"inne","NumerDokumentu":"PK 2\/2017","NumerDziennika":4,"TypDokumentu":"Rózny","brutto":0,"bruttoww":0,"datadok":"\/Date(1483484400000+0100)\/","datakurs":"\/Date(1528437612957+0200)\/","datapod":"\/Date(1483484400000+0100)\/","datarej":"\/Date(1483484400000+0100)\/","dok_id":50278,"dokwwal":false,"kurs":0,"miesiac":1,"opis":"","rok":2017,"tabelakurs":"","waluta":"","waluta_przelicznik":0}}
Przy okazji ten tekst pochodzi bezpośrednio z serializera i jest gotowy do wstawienia do bazy.

Z tego, co napisano powyżej to nie jest żadna zaleta, a robienie tego w sposób, który podałeś jest bez sensu

Pozostało 580 znaków

2018-06-08 08:48
konsul41
0

A jaka zaleta jest podejścia klasycznego, jeżeli te dane będą sporadycznie przeliczane?
Nie potrzeba nawet specjalnego indeksowania, niby po co aby uzyskać listę dokumentów?
1 raz w miesiącu będzie sporządzony Rejestr VAT, Kilka razy w miesiącu zestawienie sprzedaży.

Zaletą jest prostota obsługi, moim zdaniem. Dodatkową zaletą jest proste odwzorowanie obiektu na dane w bazie.
Co widzisz przeciw?

Pozostało 580 znaków

2018-06-08 08:57
0

Użytkownik konsul41
Patrząc od strony projektowania dużego systemu.
Dokument można przesłać jako json i określić jego typ(między modułami w sieci lokalnej), poprawia możliwości testowania systemu bez dostępu do bazy.

W Delphi ten "system" ma dobrze ponad 1mln wierszy kodu razem z pluginami i takie podejście rozwiązuje wiele problemów.

Pozostało 580 znaków

2018-06-08 09:25
1

Każdy (?) obiekt możesz przesłać jako json. Nie ma znaczenia jak dane obiektu są przechowywane w bazie.
Plus jaki widzę (dla leniwych) to to, że nie trzeba generować tabelek w DB :). Tylko po co wtedy PGSQL? Może po prostu jakaś obiektowa baza?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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