Opzetten database met meer op meer relaties

Status
Niet open voor verdere reacties.

Kickkick

Gebruiker
Lid geworden
24 feb 2012
Berichten
12
Beste helden!

Bij het ontwerpen dan een database voor het bijhouden van fuel administratie voor boten liep ik tegen het volgende probleem aan. Hoe krijg ik al die meer op meer relaties op een juiste manier in een database. Ik heb al veel forums afgestruind en ik kwam op de oplossing van het gebruiken van koppeltabellen. Hiermee ben ik aan de slag gegaan en ik heb nu het volgende (Database opzet.jpg). Helaas als ik nu een query wil gaan maken moet Access heel lang denken en geeft de melding dat die niet meer reageert. Er zit dus ergens een Bug.

Over mijn administratie..

De administratie die ik in access wil opzetten moet per vessel (schip) kunnen bijhouden en rapporteren in welke periode en welke hoeveelheidfuel er gebruikt en dit moet geadministreerd worden tegen de gemiddelde inkoopprijs. Nu kan een vessel ook een indirecte levering krijgen van een andere vessel en kan een vessel gebruik maken van verschillende types fuel.

Met het administreren heb ik de volgende formulier: factuur, consumptie, indirecte levering.

Ik kom uit op de volgende meer op meer relaties:

Vesselnr fuelnr
fuelnr LPOnr
fuel ID consumption ID
fuel ID Delevery ID
week ID vesselnr
week ID fuelnr


Wie o wie helpt mij aan een goede administratie? Alvast bedankt!!!

Gr.

PS: Mocht ik het niet duidelijk hebben uitgelegd, plz let me know!

Database opzet.jpg
 
Ik zou zeggen: maak een werkend voorbeeld, zodat we zelf kunnen zien waar die query op hapert. Gezien de hoeveelheid tabellen, en koppeltabellen, kan ik mij er wel iets bij voorstellen. Overigens zie ik niet waar je de gemiddelde inkoopprijs vandaan haalt, maar dat zit misschien wel in die query?
 
Waar doel je precies naar met een werkend voorbeeld? Het Access bestand? De gemiddelde inkoopprijs wilde ik in een Query laten berekenen inderdaad..
 
Inderdaad: een voorbeeld is een werkende database, zonder echte data uiteraard, maar met dummy gegegevens. Er moet wel genoeg data in de tabellen zitten om het probleem te kunnen reproduceren, want anders is het nog een beetje zoeken naar een speld in een hooiberg.
Maak een kopie van de database, en verwijder gevoelige informatie, en vervang die door wat nepgegevens. Eventueel afbeeldingen verwijderen. Daarna de db comprimeren en herstellen, zodat hij geminimaliseerd wordt. Inpakken met WinZip of WinRar, en daarna uploaden via de knop <Bestand toevoegen>.
Als je toch bezig bent: ik kan op het werk alleen naar 2003 bestanden kijken, dus als je een 2007/2010 db post, wordt het vanavond.
 
db

Hierbij de db in zip met dummie gegevens...

Ik hoop dat je me kan helpen. THnx voor je snelle reactie in ieder geval!!

Gr.
 

Bijlagen

Met db kijkt het een stuk vlotter, dus het begin is er! De query die je hebt meegestuurd doet het overigens prima, en is qua snelheid niet sneller of langzamer dan een gemiddelde query. Maar dat zal wel door de hoeveelheid gegevens komen (weinig namelijk).
Maar laten we bij het begin beginnen: de opzet van de db. Die is in mijn ogen nodeloos ingewikkeld. Alleen kan ik er nog weinig aan sleutelen, omdat ik te weinig weet van de materie, en wat je precies wilt doen. Ik snap dat je boten hebt, en dat daar brandstof in gaat, en dat die brandstof van ofwel vaste tankstations afkomstig is, ofwel van andere (tank)schepen.
Wat ik niet snap, is die wirwar van allerlei kleine tabellen, waar net niks in staat. En die aan elkaar geknoopt zijn op een manier die ik dus niet snap.
Laten we de eerste tabel die volgens mij zomaar weg kan er eens bij pakken: de tabel [Time]. Wat is dat voor tabel? Die tabel slaat geen tijden op, maar weeknummers, en kwartaalnummers. Waarom? Als je brandstof inslaat, maak je een transactierecord aan, en dan kun je heel simpel de aanschafdatum opnemen, en dan heb je in één keer de datum, het weeknummer, het kwartaal en het jaar! Dat leidt je allemaal af van die ene datum namelijk. Bovendien heeft jouw tabelopzet het nadeel dat volgend jaar de weken en kwartalen weer met 1 beginnen, en dan gaan je overzichten gelijk op een hoop…

Wat je zou moeten hebben, is met een paar tabellen wel te doen, denk ik. Om te beginnen: je hebt een tabel met bootgegevens nodig, de tabel [Vessel]. Een andere bron is de tabel [Fuel], want je hebt verschillende soorten brandstof. Je geeft al aan dat een vessel meerdere typen brandstof kan gebruiken, dus je hebt een koppeltabel nodig tussen [Fuel] en [Vessel], de tabel [Vessel_Fuel]. Tot zover klopt de db. In [Vessel_Fuel] leg je voor elk vessel een record vast met de brandstoftypen die ze gebruiken.

Maar nu! Wie gaat de brandstof leveren? Ik mis een tabel [Supplier], zoals ik 'm zelf zou noemen. Die supplier levert vermoedelijk niet alle soorten brandstof, en vermoedelijk ook niet tegen dezelfde prijs als de concurrent, dus ik verwacht in zo'n db ook een tabel [Supplier_Fuel], waarin je vastlegt welke supplier welke fuel levert tegen welke condities. We hebben het dan nog niet eens over de situatie waarin een schip de brandstof van een ander schip betrekt. Dat is op zich voor de kopende partij niet zo'n probleem straks, hij koopt gewoon nieuwe brandstof, maar de verkopende partij is in dit geval geen officiële Supplier, maar een ander schip. Of toch wel? Je kunt twee scenario's bedenken (ik tenminste; jij misschien meer) namelijk: een schip levert eenmalig aan een ander schip, of een schip levert meerdere malen aan andere schepen. In het laatste geval is zo'n schip feitenlijk een supplier, en moet je hem dus opnemen in de tabel suppliers. Maar de manier van brandstof registreren zal in beide gevallen iets anders moeten worden.

In ieder geval heb je een tabel [Fuel_Transactions] nodig, waarin je opslaat welk vessel komt tanken, wie de leverancier is (tankstation of vessel), welke brandstof, de hoeveelheid, de prijs per liter en de datum. Op basis van die gegevens kun je een overzicht maken waarin je per schip kunt uitrekenen wat de gemiddelde prijs is, hoeveel er is getankt etc.

Je geeft in je vraag aan dat je het brandstofverbruik wilt kunnen meten over een bepaalde periode. Dat betekent dus dat je per schip ook de tankinhoud moet vastleggen, en vermoedelijk ook per tank welke brandstof er in gaat. Op het moment dat je een tank bijvult, noteer je de hoeveelheid die er in is gegaan, maar op zich zegt dat natuurlijk niks over het verbruik. Als ik in een auto met een tank van 50 liter ga tanken, en ik vul hem met 30 liter, zit die tank dan vol? Dat is op basis van deze gegevens niet te zeggen. Ik moet dus weten hoeveel liter er nog in de tank zat voordat ik begon met tanken. Je weet uiteraard wel hoeveel je hebt uitgegeven aan het tanken, en de datum en waar je getankt hebt, want dat zijn gegevens die je in die transactie kunt terugvinden.

Dat brengt ons weer terug bij de vraag over welke informatie je eigenlijk wilt kunnen uitleveren. Daarbij is vermoedelijk één aspect minder interessant: de hoeveelheid brandstof die een tankstation per brandstofsoort in voorraad heeft. Want dan zou je die gegevens ook nog eens moeten opslaan. Echter, die informatie is wel relevant voor vessels die brandstof leveren aan andere vessels. Want komt die brandstof uit hun eigen gebruiksvoorraad, of gaat het om aparte tanks die ze gebruiken voor de doorverkoop? Als een vessel uit eigen tank verkoopt, dan moet de tankinhoud van dat betreffende vessel uiteraard naar beneden worden bijgesteld. Als ik uit mijn autotank 15 liter benzine doorverkoop aan een andere automobilist, dan krijgt hij er 15 liter bij, maar mijn tank bevat dan 15 liter minder benzine. Dus een transactie tussen twee vessels heeft consequenties voor twee schepen: de ene krijgt er brandstof bij, en de ander zal dezelfde hoeveelheid brandstof in mindering krijgen. Dat hoef je dus niet bij te houden bij het leverende schip als hij aparte tanks heeft waaruit hij levert, want dan wordt de inhoud van die tank niet gebruikt om te varen en valt er ook geen verbruiksgemiddelde te berekenen.

Ik zal het verhaal niet langer maken, want dit is denk ik al genoeg stof om over na te denken :D
 
Over de tabel tijd had je helemaal gelijk inderdaad deze heb ik nu verwijderd en bij de andere tabellen een kolom date toegevoegd.

Echter het stukje van het tanken is nogal complex. Ik zal het proberen om in een duidelijk manier uit te leggen. Elke schip kan zelf tanken of indirect tanken (doormiddel van de levering van een ander vessel)(indirect bunker). Wanneer dit gebeurd komt deze indirecte tankbeurt op het consumptie rapport te staan van beide schepen hierop wordt de prijs niet vermeld wel de hoeveelheid. Echter gaat dit gewoon uit de 'hoofd' tank waar ook de verbruikbenzine uitgaat. De benzine wordt dus niet doorverkocht maar gewoon geleverd.

Elk schip print elke week zijn verbruik rapport uit. Hierop is te zien hoeveel de begin en eind hoeveelheid te zien en hoeveel er is getankt bij het tankstation of wat verkregen is door een ander schip met fuel soort. Op dit rapport is helaas de prijs van de benzine niet te zien. Deze prijs wilde ik achterhalen met de gemiddelde prijs per benzinesoort van de invoices. Maarja is dit mogelijk..?

De kolom supplier kan ik dus toevoegen bij invoices. Alleen de tabel fuel_transacties kan geen prijs bevatten want deze informatie heb ik niet bij een levering tussen 2 schepen. Door deze reden had ik de tabel indirecte bunker (indirecte levering) aangemaakt. Wel kan hier een kolom supplier bij komen die dan de vessel bevat die de fuel levert en een vessel die de fuel ontvangt. Dit zijn inprincipe dezelfde vessels die ook in de tabel vessel worden opgeslagen..

Ook vroeg ik mij af of het niet mogelijk om de kolommen fuel en vessel aan deze tabel te linken met het Indirect ID(Indirecte levering)? Anders komt die namelijke dubbel in de db te staan.

De hoeveelheid van de tankstations maakt mij inderdaad niet heel veel uit. Maar die van de schepen natuurlijk wel.

Ik hoop dat je me verder kan helpen.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan