Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  13 1062
Hei.

Leker meg litt med å sette opp en liten, enkel webapplikasjon for å dele regninger og utgifter mellom oss som bor i leiligheten her. Men jeg er litt usikker på hvordan jeg best mulig designer database-strukturen, i forhold til det å holde styr på alle "skylde penger"-relasjonene mellom alle personene. Noen som har noen tips?

Slik jeg har tenkt nå er hver person får sin tabell, som har felter for hver relasjon den har til andre personer. I disse feltene lagrer man det man eventuelt skylder eller blir skyldt av denne personen (+ eller - verdi). Men dette virker som en dårlig løsning.. Skalerer veldig dårlig hvis man f.eks. skulle hatt mange flere brukere. (Hver bruker må da få sin egen tabell).

Hvordan ville du løst dette på best mulig måte?


mvh Cryptography
Du oppretter en tabell for brukere i databasen, hvor du registrerer brukere med en primærnøkkel, + navn o.l.
I en annen tabell, holder du oversikt over hvem som skylder hva. Dette gjøres ved å opprette tabellen med to fremmednøkler som ikke kan være null, hvor du registrer hvem som skylder penger, og hvem som skal ha pengene, og hvor mye.

Enklere blir det ikke, tror jeg - og du slipper redundans. Hvis jeg har forstått deg korrekt. Spørringer blir også da ganske enkle å utføre.

Eksempelvis:
BRUKERE(brukerID, Navn)
PENGER(brukerID_skylderPenger, brukerID2_mottarPenger, antall)

Primærnøkkel understreket, fremmednøkkel kursiv.
Sist endret av Restyle; 30. juni 2010 kl. 21:17.
leieboere
------------
id
<navn, etc>

skylder
---------
id
*leieboer_skylder
*leieboer_blir_skyldt
kroner
annet (f.eks. en øl)
aktiv (har disse gjort opp?)

Dette fungerer slik at leieboer_skylder skylder leieboer_blir_skyldt det som står i de resterende feltene. Begge feltene inneholder leieboer_id.
m0b
m0b's Avatar
DonorAdministrator
Nuvel, ville det ikke vært bedre å hatt en tabell som beskriver egne instanser av skyldrelasjon? I pluss og minus. Så kan man enkelt summere flere entries og hele tiden ha fortløpende oversikt over transaksjoner?

Slik jeg ser det er satt opp nå er en rad representativ for hele skylden til en person, og da har du liten mulighet for å se en historisk oversikt over transaksjoner.

Da kan du også tegne opp grafer over tilbakebetalinger og lån til hver enkelt person (grupperinger i spørringen), og samtidig også ha en totaloversikt.

"Den x i x-te lånte jeg deg y kroner, og z i z-te betalte du tilbake" - da har du også oversikt over hvis en person ikke har tilbakebetalt det fulle beløpet.
Sist endret av m0b; 30. juni 2010 kl. 21:44.
Kom ikke helt godt frem, kanskje. Men det er naturligvis en fordel å legge til en egen rad for dato i tabellen over penger. Eventuelt både for når det ble lånt, og når det skal bli tilbakebetalt. Man legger altså til en ny rad for hver gang noen låner/skylder penger. På den måten er det enkelt å spore "transaksjonene".
Sist endret av Restyle; 30. juni 2010 kl. 21:45.
Slik hvis jeg har forstått det?

http://image.bayimg.com/ianliaacg.jpg

Virker litt tungvint, for om jeg vil finne ut skyldeforholdet mellom la oss si person med ID 1 og ID 3, så blir det noe slikt:

"SELECT FROM skylder WHERE leieboer_skylder = 1 AND leieboer_blir_skyldt = 3;"

for så å trekke fra verdiene fra "SELECT FROM skylder WHERE leieboer_skylder = 3 AND leieboer_blir_skyldt = 1;"

Og hvorfor trenger skylder-tabellen ID?
Sist endret av Cryptography; 30. juni 2010 kl. 23:33.
Skylder-tabellen trenger id, fordi det er mulig å ha to like transaksjoner, hvor id er eneste måten å skille dem på.

For å finne forholdet mellom person 1 og person 3 gjør du f.eks.:

Kode

SELECT * FROM skylder WHERE (leieboer_skylder == 1 OR leieboer == 3) AND (leieboer_blir_skyldt == 1 OR leieboer_blir_skyldt == 3)
Enig med at det ble litt tungvindt ja. Kanskje du bør se litt mer på |d13m0b sin løsning?
Sist endret av Ozma; 1. juli 2010 kl. 00:01.
Med mindre du har veldig lyst å gjennomføre dette for læringens skyld, så vil jeg bare nevne at du holder på å gjenoppfinne utgifter.no

Du kan vel se litt på hvilken informasjon de presenterer før du bestemmer deg for strukturen din.
Sitat av Dyret Vis innlegg
Med mindre du har veldig lyst å gjennomføre dette for læringens skyld, så vil jeg bare nevne at du holder på å gjenoppfinne utgifter.no

Du kan vel se litt på hvilken informasjon de presenterer før du bestemmer deg for strukturen din.
Vis hele sitatet...
Er klar over det.. Og det finnes flere slike tjenester som er bedre. billshare.org og shareabill.com f.eks. Men gjør dette hovedsakelig for læringens skyld i tillegg til at jeg har noen ideer som vil gjøre tjenesten enda bedre..
Hvis du legger til dato i skylder-tabellen, vil du eksempelvis kunne fjerne ID fra den tabellen ved å bruke både leieboer_skylder, leieboer_blir_skyldt og dato (+ eventuelt beløp om du vil) som primærnøkkel. Alt ettersom hva du trenger. Store deler i utviklingen av databasedesign, er å planlegge hva man trenger - og det er således litt klønete å gi håndfaste forslag når planene dine ikke er 100% fastsatt.

Nå vet jeg ikke hvordan du ønsker å vise frem denne informasjonen. Fra en webside med søkemuligheter, vha spørringer for hver gang, etc. Det er naturligvis litt klønete (og tungvindt) å måtte skrive slike spørresetninger for hver gang du lurer på noe, der er derimot ikke så vanskelig å sette opp en side som lar deg skrive inn to (eller ett) navn, for deretter å printe ut all historikken for denne relasjonen. Du må rett og slett sette opp en tjeneste som definerer/lager spørringene automatisk etter du har gitt den informasjon - slik at du bare koder setningene én gang.
z0p
uʍop ǝpısdn
z0p's Avatar
Mange sverger jo til å alltid ha en autogenerert unik ID som primærnøkkel. Selv om det ikke nødvendigvis er et skoleeksempel på god databasedesign kan det gjøre utviklingen av applikasjoner noe enklere. Man må da selvfølgelig indeksere nøkkelfeltene man vil bruke i spørringer "manuelt"
▼ ... noen uker senere ... ▼
Henter opp denne tråden med et relatert spørsmål.

Jeg har nå satt opp databasen slik:
http://image.bayimg.com/ianliaacg.jpg

Noen som har gode ideer for hvordan jeg regner ut, og skriver ut skylde-forholdene?
Er lite kreativ for tiden, og klarer ikke å komme på andre måter å gjøre det på enn at det blir umenneskelig tungvint..

Altså jeg vil f.eks. ha skrevet ut "A skylder B 100kr."
$sql = "SELECT * FROM skylder WHERE `leieboer_skylder`='a' AND `leieboer_blir_skyldt`='b'"

Så kjører du en while, og plusser alt sammen i en variabel og skriver ut den.
Sist endret av fulloggal; 30. juli 2010 kl. 12:07.
Takk. Ikke værre en det.. Jeg begynte med "SELECT * FROM bills" og kjørte noen if-setninger. Men enklere slik..

Men jeg må vel også kjøre "SELECT * FROM skylder WHERE `leieboer_skylder`='b' AND `leieboer_blir_skyldt`='a'" for så trekke fra verdiene også..

Men ett lite spørsmål, hvorfor benytter du ` rundt tabell-felt-navnene?

Og en annen ting. Jeg testet spørringen min i database-programmet mitt, og det fungerte strålende.

http://image.bayimg.com/panmeaacp.jpg

Men hvorfor fungerer det ikke her? Syntaxen skal være korrekt.. Det fungerer når jeg endrer spørringen til "SELECT * FROM bills".

Kode

// Print owe relations from DB.
function printOweRelations($u)
	$result = mysql_query("SELECT * FROM bills WHERE `from_id` = '1' AND `to_id` = '2'") or die(mysql_error());
	
	while ($row = mysql_fetch_assoc($result)) {
		$from = findName($row['from_id']);
		$to = findName($row['to_id']);
		$amount = $row['amount'];
		$title = $row['title'];
		echo $to . '<img src="img/arrow-right.png" class="arrowRight" align="texttop" />' . $from;
		echo ' <span>' . $amount . ' Kr for ' . $title;
		echo "</span><br />";
	}
	
}
Fikk fikset det..

Men lurer fortsatt på bruken av tegnet ` istedenfor ingenting.