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
