[ oracle_kid @ 07.01.2023. 23:37 ] @
naime ovako uprosceno

2 tabele

Glavna (id, vrstaTransakcijeFK VARCHAR, iznos)
Vrstatransakcije (uplata,isplata VARCHAR)

tabele su linkovane radi provere constrainta

pitanje

Da li je ovakva tabela nenormalizovana :) , tj da li se vrednosti (uplata, isplata) upisuju u obe tabele, i da li mi je onda potrebna tabela VrstaTransakcije? I kako poboljšati
[ bogdan.kecman @ 07.01.2023. 23:49 ] @
paaaa tako kako si napisao moze da bude sta oces :D

ovako nesto si verovatno hteo

Code:


CREATE TABLE IF NOT EXISTS `transakcija` (
  `transakcija_id` INT NOT NULL AUTO_INCREMENT,
  `transakcija_vrsta` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`transakcija_id`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `glavna` (
  `glavna_id` INT NOT NULL AUTO_INCREMENT,
  `glavna_iznos` DECIMAL NOT NULL,
  `transakcija_id` INT NOT NULL,
  PRIMARY KEY (`glavna_id`),
  INDEX `transakcija_id_idx` (`transakcija_id` ASC) VISIBLE,
  CONSTRAINT `transakcija_id`
    FOREIGN KEY (`transakcija_id`)
    REFERENCES `transakcija` (`transakcija_id`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT)
ENGINE = InnoDB;




pitanje je sta je to "isplata" koju si hteo da stavis u "transakcija" ? sta je to trebalo da predstavlja, tu svakako ne treba da stoji


[ oracle_kid @ 08.01.2023. 00:11 ] @
mozda sam dao pogresan naziv, ovo je mala kucna evidencija, mozda bi trebalo da bude ‘zaduzenje’ i ‘uplata’
u svakom slucaju mislis da bi uvodjenjem id-a za povezane tabele dobio pravilnije resenje?
posle bi morao da radim JOIN-ove za izvestaj
[ oracle_kid @ 08.01.2023. 00:30 ] @
a sad tek videh, isplata(zaduzenje) i uplata su jedine moguce vrednosti u tabeli vrstaTransakcije(opis)
[ bogdan.kecman @ 08.01.2023. 01:20 ] @
nemam pojma sta radis, realno tabela sa tipovima transakcija (u mom primeru `transakcija`) treba da ima ID tipa transakcije i IME tipa transakcije i to je to

sta su ti ti tipovi pojma nemam

tabela `glavna` ima `glavna`.`glavna_iznos` ... taj iznos je neki decimal (ne znam sto bi ti iznos bio string?) i ako si nekom platio onda je minus ako je tebi neko platio onda je neki plus ... mozes umesto `glavna`.`glavna_iznos` da imas `glavna`.`glavna_uplata`i `glavna`.`glavna_isplata` koji bi uvek bili pozitivni ali cemu?

dalje u `glavna` ti realno fali `glavna`.`glavna_datum`, `glavna`.`glavna_opis` i bem li ga sta sad jos ali to je ideja
[ dragancesu @ 08.01.2023. 08:31 ] @
Ako sam dobro shvatio šta je pokretač teme pitao, u pitanju je vođenje evidecije kućnog budžeta, zaduženja i plaćanja obaveza
U tom slučaju mu trebaju dve tabele

VRSTA
-----------------
vrsta naziv
1 STRUJA
2 VODA
3 GREJANJE
4 INTERNET
5 TELEFON1
6 TELEFON2
7 TELEFON3 ...

PROMENE
-----------------
VRSTA
OPIS
DATUM_ZADUZENJA
ZADUZENJE
DATUM_UPLATE
UPLATA

[ S A J A @ 08.01.2023. 09:17 ] @
ChatGPT:


Create sql code for 2 MySQL tables. One for household finances, second with transaction types, and to be in a relationship. Main table should be filterable and searchable.

Code:
CREATE TABLE household_finances (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    transaction_type_id INT(11) NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    date DATE NOT NULL,
    description VARCHAR(255) NOT NULL,
    INDEX (transaction_type_id),
    FOREIGN KEY (transaction_type_id) REFERENCES transaction_types(id)
);

CREATE TABLE transaction_types (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description VARCHAR(255) NOT NULL
);


SELECT * FROM household_finances WHERE amount > 500 AND transaction_type_id = 1;

SELECT * FROM household_finances WHERE date BETWEEN '2020-01-01' AND '2020-12-31';

SEARCH TABLE household_finances WHERE description LIKE '%rent%';
[ oracle_kid @ 08.01.2023. 10:53 ] @
treba mi upravo to sto je draganescu rekao
imam jedno potpitanje
ako zelim konkretno da navedem da recimo placeno grejanje, mozda u celosti mozda ne, da li unosim novi red ili da ostavim polje uplata za svaki red kao sto je draganescu definisao

hvala svima na odgovorima
[ Predrag Supurovic @ 08.01.2023. 12:17 ] @
Uvedeš još jednu tabelu u koju ćešp da evidentiraš račune a svaki rčaun iam tip zaduženje, što ti je u stvari isto što i tip uplate.
Pa zaduženja vodiš u tabeli računa a uplate u tabeli uplata i onda sabereš jedno s drugim i vidiš šta imaš neplaćeno.

U uplatama naravno može da bude više uplata istog tipa pa čak i po istom računu, ako i uplatama dodaš polje za vezu sa računom koji se razdužuje tom ulatom.
[ dragancesu @ 08.01.2023. 17:54 ] @
Ove je jednostavan primer koji može da se komplikuje

Mislim da ti je za početak dovoljno ono što sam napisao (strukture), ako platiš u celosti to je jedan red
ako se plaća iz više puta dupliras red, ali polje zaduzenje ostaje prazno (0)

[ bogdan.kecman @ 08.01.2023. 19:00 ] @
realno tabela ovde koja se zove "glavna" ne treba da postoji :D


da je odma rekao sta hoce mozda bi svima bilo lakse da mu pomognemo ... realno imas


Code:


CREATE TABLE uplata_tip (
    uplata_tip_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uplata_tip_ime VARCHAR(255) NOT NULL,
    uplata_tip_opis VARCHAR(255) NOT NULL
);

CREATE TABLE isplata_tip (
    isplata_tip_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    isplata_tip_ime VARCHAR(255) NOT NULL,
    isplata_tip_opis VARCHAR(255) NOT NULL
);


CREATE TABLE uplata (
    uplata_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uplata_tip_id INT NOT NULL,
    uplata_vrednost DECIMAL,
    uplata_datum TIMESTAMP NOT NULL DEFAULT(NOW()),
    uplata_opis VARCHAR(255),
    INDEX (uplata_tip_id), FOREIGN KEY (uplata_tip_id) REFERENCES uplata_tip(uplata_tip_id) ON DELETE RESTRICT ON UPDATE RESTRICT
);

CREATE TABLE isplata (
    isplata_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    isplata_tip_id INT NOT NULL,
    isplata_vrednost DECIMAL,
    isplata_datum TIMESTAMP NOT NULL DEFAULT(NOW()),
    isplata_opis VARCHAR(255),
    INDEX (isplata_tip_id), FOREIGN KEY (isplata_tip_id) REFERENCES isplata_tip(isplata_tip_id) ON DELETE RESTRICT ON UPDATE RESTRICT
);




ne moras da imas uplate i isplate u istoj tabeli ako ne zelis da ih vodis kao + i - za "vrednost"

varijanta da imas tabelu transakcija u kojoj imas kolonu uplata i kolonu isplata je pogresna ... dakle ili ides sa dve tabele, jedna za uplate druga za isplate ili ides sa jednom tabelom i koristis jednu kolonu za uplate i isplate stim da je jedno u plusu a drugo u minusu ...

takodje moze da se spoji uplata_tip i isplata_tip u jednu tabelu mada lepse ovako odvojeno

ono sto moze da se uradi dodatno je da uplata_id i isplata_id ne budu AUTO_INCREMENT i da nemaju uplata/isplata_datum vec da imas ovako nesto

Code:


CREATE TABLE transakcija_tip (
    transakcija_tip_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    transakcija_tip_ime VARCHAR(255) NOT NULL,
    transakcija_tip_opis VARCHAR(255) NOT NULL
);

CREATE TABLE transakcija (
    transakcija_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
);


CREATE TABLE uplata (
    uplata_id INT NOT NULL  PRIMARY KEY, -- obrati paznju nije AUTOINC
    transakcija_tip_id INT NOT NULL,
    uplata_vrednost DECIMAL,
    uplata_datum TIMESTAMP NOT NULL DEFAULT(NOW()),
    uplata_opis VARCHAR(255),
    INDEX (transakcija_tip_id), 

    CONSTRAINT `fk1` FOREIGN KEY (transakcija_tip_id) REFERENCES transakcija_tip(transakcija_tip_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT `fk2` FOREIGN KEY (uplata_id) REFERENCES transakcija (transakcija_id)  ON DELETE RESTRICT ON UPDATE RESTRICT

);

CREATE TABLE isplata (
    isplata_id INT NOT NULL PRIMARY KEY, -- obrati paznju nije AUTOINC
    transakcija_tip_id INT NOT NULL,
    isplata_vrednost DECIMAL,
    isplata_datum TIMESTAMP NOT NULL DEFAULT(NOW()),
    isplata_opis VARCHAR(255),
    INDEX (transakcija_tip_id), 
    CONSTRAINT `fk1` FOREIGN KEY (transakcija_tip_id) REFERENCES transakcija_tip(transakcija_tip_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT `fk2` FOREIGN KEY (isplata_id) REFERENCES transakcija (transakcija_id)  ON DELETE RESTRICT ON UPDATE RESTRICT
);




tako da prvo napravis auto_increment slog u `transakcija` i onda koristis taj insert_id da kreiras slog u uplata ili isplata ...
onda to moze jos malo da se ulepsa jer imamo zajednicka polja u uplata i isplata koja su vezana u stvari za transakciju pa onda dodjemo do


Code:


CREATE TABLE transakcija_tip (
    transakcija_tip_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    transakcija_tip_ime VARCHAR(255) NOT NULL,
    transakcija_tip_opis VARCHAR(255) NOT NULL
);

CREATE TABLE transakcija (
    transakcija_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    transakcija_datum TIMESTAMP NOT NULL DEFAULT(NOW()),
    transakcija_opis VARCHAR(255),
    transakcija_tip_id INT NOT NULL,
    INDEX (transakcija_tip_id), 
    CONSTRAINT `fk1` FOREIGN KEY (transakcija_tip_id) REFERENCES transakcija_tip(transakcija_tip_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
);


CREATE TABLE uplata (
    uplata_id INT NOT NULL  PRIMARY KEY, -- obrati paznju nije AUTOINC
    uplata_vrednost DECIMAL,
    CONSTRAINT `fk2` FOREIGN KEY (uplata_id) REFERENCES transakcija (transakcija_id)  ON DELETE RESTRICT ON UPDATE RESTRICT

);

CREATE TABLE isplata (
    isplata_id INT NOT NULL PRIMARY KEY, -- obrati paznju nije AUTOINC
    isplata_vrednost DECIMAL,
    CONSTRAINT `fk2` FOREIGN KEY (isplata_id) REFERENCES transakcija (transakcija_id)  ON DELETE RESTRICT ON UPDATE RESTRICT
);



A ovde realno vidimo ono sto rekoh s'pocetka uplata i isplata su beskorisni jer to sve moze da se spoji u jednu tabelu:


Code:

CREATE TABLE transakcija_tip (
    transakcija_tip_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    transakcija_tip_ime VARCHAR(255) NOT NULL,
    transakcija_tip_opis VARCHAR(255) NOT NULL,
    transakcija_tip_uplata_isplata ENUM('UPLATA', 'ISPLATA') -- ako nam nije dovoljno sto je transakcija.transakcija_vrednost pozitivno ili negativno mozemo i ovo da dodamo
);

CREATE TABLE transakcija (
    transakcija_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    transakcija_datum TIMESTAMP NOT NULL DEFAULT(NOW()),
    transakcija_opis VARCHAR(255),
    transakcija_tip_id INT NOT NULL,
    transakcija_vrednost DECIMAL, -- pozitivno je uplata, negativno je isplata
    INDEX (transakcija_tip_id), 
    CONSTRAINT `fk1` FOREIGN KEY (transakcija_tip_id) REFERENCES transakcija_tip(transakcija_tip_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
);




i na kraju svega, opet, ne znam sta je poenta, ali za kucne finansije, ako ti excell tabela ne radi posao ovo je po meni vrh resenje:
https://gnucash.org/

uzdravlje
[ Predrag Supurovic @ 08.01.2023. 22:29 ] @
Citat:
bogdan.kecman
varijanta da imas tabelu transakcija u kojoj imas kolonu uplata i kolonu isplata je pogresna ... dakle ili ides sa dve tabele, jedna za uplate druga za isplate ili ides sa jednom tabelom i koristis jednu kolonu za uplate i isplate stim da je jedno u plusu a drugo u minusu ...


Jeste da nama laicima zvuči totalno nelogično ali knjigovođe imaju ozbiljan razlog što uvek imaju kolone duguje i potražuje i nikad im se ne pojavljuju minusne vrednosti iznosa u tim kolonama.
[ S A J A @ 08.01.2023. 22:32 ] @
Iako mogu zaduženja i uplate da idu u istu tabelu, pa čak i u istu kolonu (pozitivno/negativno), moj predlog je sličan Predragovom, da se odvoje tabele. To je čistije rešenje i bolje ako hoćeš kasnije da dodaješ nešto. Napravio sam primer koji ima 3 tabele: vrsta računa, računi i uplate.






Code:

CREATE TABLE vrste (
  id INT NOT NULL AUTO_INCREMENT,
  naziv VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (id)
)

CREATE TABLE racuni (
  id INT NOT NULL AUTO_INCREMENT,
  broj VARCHAR(30) DEFAULT NULL,
  opis VARCHAR(512) DEFAULT NULL,
  vrsta INT DEFAULT NULL,
  datum DATETIME DEFAULT (now()),
  iznos DECIMAL(19, 4) DEFAULT 0.0000,
  PRIMARY KEY (id)
)

ALTER TABLE racuni 
  ADD CONSTRAINT FK_racuni_vrsta FOREIGN KEY (vrsta)
    REFERENCES vrste(id);
    
CREATE TABLE uplate (
  id INT NOT NULL AUTO_INCREMENT,
  racun_id INT DEFAULT NULL,
  datum DATETIME DEFAULT (now()),
  iznos DECIMAL(19, 4) DEFAULT 0.0000,
  PRIMARY KEY (id)
)

ALTER TABLE uplate 
  ADD CONSTRAINT FK_uplate_racun_id FOREIGN KEY (racun_id)
    REFERENCES racuni(id);

[ bogdan.kecman @ 09.01.2023. 02:18 ] @
@pedja, da, zato za njih napravis view da dobiju sta ocekuju :) u svakom slucaju ja sam mu napravio sve moguce varijante normalizovano gore pa moze bira koju zeli, oce odvojeno, oce spojeno... realno ako mu nije cilj da uci sql i da vezba programiranje nego samo hoce resi problem https://gnucash.org/ je brze i bolje resenje :)

@saja, ali fale ti isplate :D ...
[ S A J A @ 09.01.2023. 08:27 ] @
Citat:
bogdan.kecman
@saja, ali fale ti isplate :D ...


Šta su isplate?

Za finansijsko vođenje nečega, trebaju ti dve strane: koliko duguješ, odnosno zaduženje (ja sam to nazvao račun) i koliko si platio, odnosno razduženje (nazvao uplata). I jedno i drugo može biti negativno ako treba (recimo povraćaj). Tako da nije jasno šta bi bila isplata.
[ bogdan.kecman @ 09.01.2023. 08:36 ] @
pa imas ulaz i imas izlaz ... uplata i isplata

nisam obratio paznju da si ti racun stavio kao isplatu, nije mi logicno tako nikako :D jer imas za jedan racun samo jednu isplatu (racuni.iznos) i vise uplata, imas za isti racun razlicit datum za razlicite uplate i za sam racun ...
[ S A J A @ 09.01.2023. 08:59 ] @
Citat:
bogdan.kecman: pa imas ulaz i imas izlaz ... uplata i isplata

nisam obratio paznju da si ti racun stavio kao isplatu, nije mi logicno tako nikako :D jer imas za jedan racun samo jednu isplatu (racuni.iznos) i vise uplata, imas za isti racun razlicit datum za razlicite uplate i za sam racun ...


Frljimo se sa terminologijom pa dolazi do nesporazuma ;)

Kod mene račun ima značanje fakture. Dokument. Znači jedan dokument, neko te je zadužio, i onda imaš više uplata na njega (posebna tabela). Na primer, račun za struju, telefon, internet, zakup, prodavnicu...

Ti pod račun verovatno misliš na konto. Pa unutra uplata i isplata. Može i tako da se gleda, ali isto ti dođe, sve zavisi od percepcije. Kod mene je konto vrsta računa. Na kraju imaš 3 tabele (konto/vrsta, račun/duguje, plaćeno/potražuje).

[ bogdan.kecman @ 09.01.2023. 10:20 ] @
ne mislim - meni "Racun" ne znaci nista

covek je reko oce "kucni budzet" za kucni budzet imas
- primio X dinara kao platu
- primio Y evra od rente za garazu
- primio Z dolara oteo od rusa
- primio W dinara ukrao u busu
- isplatio A dinara za struju
- isplatio B dinara za infostan
- isplatio C dinara za krompir
- isplatio D dinara za kupus
- isplatio E evra da zamenim za dinare da kupim jos kupusa
- primio F dinara od prodatih evra
- isplatio G dinara za kupus
...

nema tu nikakvih faktura, imas uplate ka kucnom budzetu i isplate iz kucnog budzeta


zato ti kazem, po tvom sistemu, ja sam ga u startu tako razumeo, imas X uplata koje cine 1 racun i taj racun ima reduntant iznos koji mora bude zbir svih uplata, aj kazemo da moze da ostane taj iznos da radimo duplu proveru dal je racun.iznos == sum(uplata.iznos) on (racun.id = uplata.racun_id) ali ti i dalje fali isplata .. u kucni budzet pare ulaze i iz njega pare izlaze, tvoj model pamti samo jedan smer, pa dal je uplata u tvom modelu izlaz iz budzeta kuce i uplata raznih potrebstina ili je to uplata u kucni budzet (plata i slicno) abitno je, fali drugi pravac :D
[ S A J A @ 09.01.2023. 13:00 ] @
Citat:
bogdan.kecman:u kucni budzet pare ulaze i iz njega pare izlaze, tvoj model pamti samo jedan smer


Pa da, moj model se odnosi na jednostavnu evidenciju troškova. Ovo tvoje podrazumeva i evidenciju prihoda. Obično prihodi domaćinstva nisu toliko složeni da bi se pravila evidencija za njih, uglavnom to rade programi za firme, no dobro, u tom slučaju bi model bio složeniji. Treba više tabela:

Kategorije prihoda
Prihodi
Kategorije troškova
Troškovi (računi)
Plaćanje računa

Otprilike tako nekako. Ono moje plus dve prve tabele. U suštini ovo je teško modelovati jer nemamo precizan zahtev. Ovakve stvari mogu da budu ultra jednostavne (jedna tabela) pa do toga da napraviš full knjigovodstveni program. Kompleksnost raste eksponencijalno.
[ bogdan.kecman @ 09.01.2023. 13:17 ] @
pa zato sam mu ja i dao 4 verzije (pogledaj njegov prvi post ima i uplatu i isplatu samo na pogresnom mestu) a realno pitanje dal se igra da uci nesto ili mu treba sw za to pa si pravi, ako mu treba sw gnucash je do jaja, jednostavan, i dede nauce da koriste za par dana a kamoli pismeni ljudi, ima sve sto ti treba za kucu i nema sta mislis vec je sve sto mozes da zamisis tu :D ... jedini problem je ne mozes da spojis ni sa jednom domacom bankom jer su za API culi samo kao za ime banke, cak nisu u stanju da ti fizicki exportuju podatke ... nekoliko banaka je sada dobilo da mozes, ali samo preko mobilne aplikacije, da exportujes "view" ?!?!! znaci jbt za pobiti ...