Baza de date în cloud

Pai d’asta ziceam ca trebuie o integrare cu API-ul lor, nu doar sa puna clientul storage-ul DB-ului in Dropbox :slight_smile: . Dropbox cel putin are un API prin care poti face tu upload-ul fisierului sub controlul programului si sa eviti probleme de integritate. OTOH si de upload de 50MBs de fiecare data e posibil sa scapi, dar cu mai mult si mai tricky de munca (desi daca cautai vre-un motiv sa te upskillezi pe Merkle trees asta ar fi:)).

Dar realist, nu cred ca exista o solutie de genul “generic storage for random applications” pe care clientii o detin, dar terte aplicatii o folosesc. Ar putea fi o idee buna de business poate :slight_smile:

YNAB avea o sincronizare cu Drobox care funcționa în felul următor:

  • fiecare tranzacție era un fișier json cu un anumit pattern al numelui;
  • sincronizarea însemna de fapt sincronizarea acestori fișiere cu drobox
  • mergea rezonabil (i.e. n-au fost conflicte) de pe trei device-uri simultan (probabil mai mult, dar nu am avut nevoie/curiozitatea să încerc)

Nu sunt foarte sigur, dar parcă era un dialect de couchdb.

exemple de fișiere:

A-342,B-125,C-150,D-46,E-67_E-68.ydiff
A-356,B-145,C-150,D-48,E-71_E-73.ydiff
A-356,B-145,C-150,D-48,E-73_E-75.ydiff

Exemplu de tranzacție:

{
  "deviceGUID": "2B7719E9-0CE8-2DC2-A3B7-D42107483F21",
  "publishTime": "Sat Sep 14 21:30:31 GMT+0300 2013",
  "items": [
    {
      "autoFillMemo": "",
      "madeWithKnowledge": null,
      "isResolvedConflict": false,
      "autoFillCategoryId": "5731ACB5-9B31-F87A-93EC-CE8FE1F75910",
      "enabled": true,
      "entityId": "EBC0C5DF-BE49-73FD-126E-1DBD0CDCDA05",
      "autoFillAmount": -202.38,
      "entityType": "payee",
      "targetAccountId": null,
      "name": "real",
      "isTombstone": false,
      "entityVersion": "E-17"
    },
    {
      "date": "2013-09-14",
      "subTransactions": null,
      "entityId": "4B591D5C-2FC4-370F-2A50-1DBCB9468ECF",
      "entityType": "transaction",
      "matchedTransactions": null,
      "source": null,
      "amount": -202.38,
      "accepted": true,
      "entityVersion": "E-18",
      "madeWithKnowledge": null,
      "isResolvedConflict": false,
      "memo": null,
      "transferTransactionId": null,
      "categoryId": "5731ACB5-9B31-F87A-93EC-CE8FE1F75910",
      "cleared": "Uncleared",
      "targetAccountId": null,
      "dateEnteredFromSchedule": null,
      "payeeId": "EBC0C5DF-BE49-73FD-126E-1DBD0CDCDA05",
      "checkNumber": null,
      "parentTransactionIdIfMatched": null,
      "accountId": "DDBAE60C-B839-279B-F69A-CA07390273EE",
      "flag": null,
      "isTombstone": false,
      "importedPayee": null,
      "YNABID": null,
      "FITID": null
    }
  ],
  "dataVersion": "4.2",
  "budgetDataGUID": null,
  "shortDeviceId": "E",
  "startVersion": "A-281,B-60,C-150,D-23,E-16",
  "endVersion": "A-281,B-60,C-150,D-23,E-18",
  "formatVersion": null
}

@serghei Salutare!
Poti incerca si solutia aceasta: master - slave pe sqlite
http://litereplica.io/index.html
Succes!

1 Like

Cea mai buna solutie e cea care merge la cheie. O sa ai probleme cu baza de date in cloud accesata prin clienti desktop: concurenta, viteza, etc. Solutia e sa ai logica cat mai aproape de baza de date iar interfata cat mai aproape de client. Asa ca pui logica intr-un server care expune niste servicii (MS) sau API si care va fi un singur canal de intrare/iesire al datelor din baza ta, care poate fi orice. Ca sa faci o solutie reproductibila relativ usor folosesti imagini docker in care poti incapsula serverul si motorul de baza de date, pastrand insa datele in afara imaginii docker. Reactualizarea software-ului server e simpla, doar pui o versiune noua de imagine docker pe git si gata. Si in plus, poti pune unde vrei dockerul ala, in cloud sau intr-un server local sau chiar pe desktopul de lucru.
PS. Zau, in C? pai iti mai mentine cineva aplicatia cand o sa creasca cererea? Doar pasionatii si cei care inteleg programarea mai stiu C, lucru rar intalnit azi.

Asta îmi aduce aminte de Idiocracy :slight_smile: Fundaţia lumii de azi este scrisă C/C++ şi nimeni nu mai înţelege cum funcţionează acea fundaţie…

1 Like

Eh, mai ușor cu pianul pe scări. Știe deajuns de multa lume C/C++. Nu cred că se bagă așa de multa lume sa facă webapps/LoB apps în el, că nah, dar la nevoie …

1 Like

Eu as fi fost mai curios de ce SQLite cand exista atatea solutii ceva mai serioase, free.

Glumeam, dar numai pe jumătate :slight_smile:

Nu era necesar altceva. Puteam să folosesc şi plain-text şi probabil nu se observa vreo mare diferenţă :slight_smile:

2 Likes

Asta daca nu te gandesti mai incolo sa extinzi… suportul pentru tranzactiii e un pic mai slabut, plus ca daca vrei ceva client/server…

Eu folosesc SQLite cand am de lucru cu ceva ‘embedded’ sau ceva ce nu are nevoie de cine stie cate date in baza de date (de exemplu, pentru persistenta unor valori a caror cantitate nu creste in timp).

Pentru ceva intermediar recomand Firebird. Candva au avut si https://firebirdsql.org/manual/ufb-cs-embedded.html , nu sunt sigur ca mai exista in ultimele versiuni suport pentru asa ceva, dar am folosit si varianta asta.

2 Likes

exista embedded la Firebird si in ultile versiuni in v3 este engine12.dll in subfolderul plugins,mai multe detalii: https://www.ibphoenix.com/files/Embedded_fb3.pdf

1 Like

Deja cand au ajuns la versiunile astea am renuntat la embedded in favoarea superserver.

Suportul pentru db nu e chiar hardwired, folosesc acolo un wrapper care teoretic ar putea fi extins la orice fel de db (mysql, pg, chiar si Sybase/M$ SQL Server). Dar pentru client-server am preferat sa fac eu un unul simplu, tot bazat pe sqlite, pentru ce e nevoie e mai mult decat suficient. Ideea e ca in felul asta este mai flexibil, daca de exemplu in viitor as dori sa fac notificari “push” sau auto-discovery-ul bazei de date.

1 Like