Postgres

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Argon
Elite Poster
Elite Poster
Berichten: 1265
Lid geworden op: 21 mei 2007, 22:26
Uitgedeelde bedankjes: 20 keer
Bedankt: 49 keer

Hallo,

Ik zit nu al meerdere dagen vast met iets en ga toch even hulp inroepen. Geen idee of iemand mij wil/kan helpen of een andere oplossing ziet voor mijn probleem. Ter info, ik ben geen programmeur en heb ook 0 ervaring met Databases... Ik doe mijn best maar loop nu toch wel vast :-)

Ik schreef een script in Nodejs die trades kan mirroren van account X naar account Y. Als "database" maakte ik gebruik van een array (var db = []) waar ik dan alle info in wegschreef. Op zich werkt dit perfect maar als mijn script om één of andere reden zou crashen ben ik alle info kwijt. Ik ben dus aan het kijken om een echte Database in de achtergrond te gebruiken. Ik kwam uit bij Postgres. Ik heb alles kunnen converteren van mijn "in memory" DB naar de Postgres DB maar zit volledig vast op 1 item.

Als er een order geplaatst werd op het master account, dan schreef ik het orderID hiervan weg. Enkele milliseconden later plaatst het slave account hetzelfde order en schreef het script dit weg naast het master orderID. Zo is het perfect mogelijk om deze 2 orders te linken aan elkaar. Als het order op het master account gecanceld werd, dan weet het script ook welk order op het slave account gecanceld moest worden.

Voorbeeld:

Code: Selecteer alles

[{"master": 1234, "slave": 5678}]
Door het gebruik van een "Array of objects" in Node was dit zeer makkelijk om te filteren op het master orderID (1234) om het passend slave orderID (5678) te bekomen. Op welke manier kan ik deze logica in Postgres steken? In de meeste gevallen gaat dit per rij over 1 master/slave orderID, maar het is ook mogelijk dat er soms meerder orders geplaatst worden waardoor de DB het volgende moet aankunnen:

Code: Selecteer alles

[{"master": 1234, "slave": 5678},{"master": 6666, "slave": 7777}]
Ik heb al uren zitten proberen met een JSONB kolom in Postgres maar krijg het gewoon langs geen kanten aan de praat... De bedoeling is dat ik er dus data kan in inserten, updaten en deleten. Het inserten/updaten/deleten van gewone rijen (dus niet JSON gerelateerd) werkt perfect vanuit NodeJS.

Ben benieuwd of iemand mij kan helpen of een volledig andere/makkelijkere manier weet om dit te bekomen.

Merci ! :-D
dean3009
Elite Poster
Elite Poster
Berichten: 813
Lid geworden op: 07 mei 2007, 11:19
Uitgedeelde bedankjes: 84 keer
Bedankt: 43 keer
Recent bedankt: 1 keer

Als ik het goed begrijp heb je dus een rij waar er één of meerdere master/slave order-id "paren" bij horen, klopt dat?

Als je op de standaard manier genormaliseerd wilt werken, moet je werken met een extra tabel met kolommen "master_order_id" en "slave_order_id" en een extra kolom waar je verwijst naar de id van de originele rij (parent_id oid, weet de naam van je hoofdtabel niet). Dan haal je alle rijen op uit die tabel waar de parent_id gelijk is, en bekom je je array van objecten.

Het kan wel helpen als je eens je huidige databankstructuur deelt. Hoe spreek je de databank aan vanuit Node.js (welke package gebruik je) ?
Argon
Elite Poster
Elite Poster
Berichten: 1265
Lid geworden op: 21 mei 2007, 22:26
Uitgedeelde bedankjes: 20 keer
Bedankt: 49 keer

Dat klopt inderdaad. Even chronologisch schetsen wat er kan gebeuren om het misschien nog wat duidelijker te maken:
- Master account maakt een order aan --> Sla het OrderID op in "masterorderid1"
- onmiddellijk hierna volgt het Slave account --> Sla het OrderID op in "slaveorderid1"
Wat later maakt het Master account nog een order aan:
- Sla dit orderID op in "masterorderid2"
- Onmiddellijk hierna volgt het Slave account --> Sla het OrderID op in "slaveorderid2"

- Master account delete het order in "masterorderid1"
- Slave account volgt en delete zijn order met "slaveorderid1"

Dus net zoals je aanhaalt zit ik altijd met een verbinding tussen een master orderID en een slave orderID. Ik weet gewoon niet hoe ik makkelijk die "verbinding" kan opzetten tussen beiden.

Dit is hoe mijn huidige tabel genaamd "futures" er uitziet. Deze kan natuurlijk volledig anders opgemaakt worden indien nodig :-):

Code: Selecteer alles

CREATE TABLE futures (id SERIAL PRIMARY KEY, coin VARCHAR (15) NOT NULL, pause BOOLEAN NOT NULL, master1 numeric, slave1 numeric, master2 numeric, slave2 numeric, qty NUMERIC, side VARCHAR (10) NOT NULL);
Afbeelding

Ik maak gebruik van "node-postgres"
dean3009
Elite Poster
Elite Poster
Berichten: 813
Lid geworden op: 07 mei 2007, 11:19
Uitgedeelde bedankjes: 84 keer
Bedankt: 43 keer
Recent bedankt: 1 keer

Ik zou (mits ik alles goed begrijp) de volgende structuur gebruiken:

Afbeelding

Zo kan je één future hebben met meerdere gekoppelde orders. In futures_order wordt "future_id" ingevuld met de id uit futures. Als je dan voor een bepaalde trade alle orders wilt ophalen kan je simpelweg "select * from futures_order where future_id = ${futureId}" uitvoeren en krijg je zogezegd het volgende terug:

Code: Selecteer alles

[
  {
    "future_id": 1,
    "master_order_id": 1234,
    "slave_order_id": 5678
  },
  {
    "future_id": 1,
    "master_order_id": 6666,
    "slave_order_id": 7777
  }
]
Als ik niet goed mee ben, zeg maar he :lol:

Een aanrader bovenop node-postgres is knex. Hiermee kan je gemakkelijk inserts doen met objecten en select-query's opbouwen zonder ruwe SQL te schrijven. Ook iets leuks maar waarschijnlijk overkill voor jouw case is MikroORM (wel enkel met TypeScript), dan kan je ineens volledig met klassen werken (zie documentatie) en achterliggend handelt ie alle SQL voor jou af.
FullHD
Pro Member
Pro Member
Berichten: 326
Lid geworden op: 27 mei 2008, 12:04
Uitgedeelde bedankjes: 3 keer
Bedankt: 15 keer

Beetje off topic: de terminologie “master / slave” wordt de laatste tijd wat minder gesmaakt. Je gebruikt in dit geval beter een uitdrukking als “primary / secondary”. :cop:
Plaats reactie

Terug naar “Development”