MySQL tabellen samenvoegen

Status
Niet open voor verdere reacties.

josp16

Gebruiker
Lid geworden
14 jul 2014
Berichten
20
Hoi,

Ik heb een database gemaakt waarin ik 3 verschillende tabellen heb. Nu kom ik er achter dat dit toch niet handig is en wil ik de drie tabellen samenvoegen.
Ik heb het volgende:

2015
Tabel1 ID Timestamp Waarde 1 Waarde 2 Waarde ... Waarde 11
Tabel2 ID Timestamp Waarde 12 Waarde .. Waarde 15
Tabel3 ID Timestamp Waarde 16 Waarde 17

Hoe kan ik dit snel samenvoegen zodat ik krijg:

2015
Tabel1 ID Timestamp Waarde 1 Waarde .. Waarde 17

In elke tabel wordt op hetzelfde moment de waarde geschreven, dus de timestamp komt met elkaar overeen. Is er een eenvoudige manier om dit samen te voegen?
 
Heb je serieus tabellen per jaartal?
 
Ja dan krijg ik elk jaar een nieuwe tabel:

Data 2015
Tabel1 ID Timestamp Waarde 1 Waarde .. Waarde 17

Data 2016
Tabel1 ID Timestamp Waarde 1 Waarde .. Waarde 17
 
Dat is een slechte databasestructuur. Vooral als je genummerde velden hebt.

Wat wil je precies opslaan? Kan je wat meer over je applicatie vertellen?
 
Hoezo dat dan?

Ik heb een weerstation en ik sla iedere minuut de waarden op. Wat er nog meer bij komt in de tabellen zijn statistieken per dag, maand en jaar, dus wat ik krijg is:

Data 2015
Sensorwaarden ID Timestamp Waarde 1 Waarde .. Waarde 17
DagStatistieken ID Dag Statistiek 1 Statistiek.. Statistiek x
MaandStatistieken ID Maand Statistiek 1 Statistiek.. Statistiek x

Data 2016
Sensorwaarden ID Timestamp Waarde 1 Waarde .. Waarde 17
DagStatistieken ID Dag Statistiek 1 Statistiek.. Statistiek x
MaandStatistieken ID Maand Statistiek 1 Statistiek.. Statistiek x

.
.
.

JaarStatistieken Jaar Statistiek 1 Statistiek.. Statistiek x
 
Hoe wil je straks berekening maken over welk jaar gemiddeld het meeste items heeft? En wat als je nu vergeet om op 1 januari een extra tabel aan te maken?

Sla gewoon de data op een genormaliseerde manier op. Je kan de data prima in UNIEKE ENTITEITEN verdelen, en deze dus in aparte tabellen.
Je kan de statistieken een veld meegeven met DATETIME om de datum erin op te slaan.
 
Laatst bewerkt:
Het vergeten zal niet gebeuren, ik heb een scriptje op mijn RPi draaien die om het jaar een nieuwe tabel aan maakt.

Het probleem is denk ik dat ik niet weet wat de genormaliseerde manier is, ik heb ook weinig kennis van MySQL. Ik zie niet eigenlijk ook niet tegen welke problemen ik kan aanlopen als ik mijn data zo op sla.
De statistieken kan ik toch uniek maken door ipv dag, dag-maand-jaar op te slaan?
 
Het vergeten zal niet gebeuren, ik heb een scriptje op mijn RPi draaien die om het jaar een nieuwe tabel aan maakt.
En wat als die cronjob stuk is? Of je rPI er even uit ligt en de waardes in het nieuwe jaar inde oude tabel worden geschreven?

De problemen heb ik al opgenoemd, als je even terug leest.
Lees anders dit eens goed door: https://nl.wikipedia.org/wiki/Databasenormalisatie
Want nu ben je op een zeer foute weg bezig.
 
Laatst bewerkt:
En wat als die cronjob stuk is? Of je rPI er even uit ligt en de waardes in het nieuwe jaar inde oude tabel worden geschreven?

Dit zal in mijn geval niet voor kunnen komen. Ik heb geen MySQL op de RPi draaien, maar gerbuik die van een host waar ook mijn website draait. De RPi kijkt of er een minuut voorbij is en gaat dan kijken in wat voor jaar we zitten en genereert of een nieuwe tabel bij nieuw jaar, of hij gebruikt de tabel van dit jaar. De waarden worden dan weg geschreven. Het enige waar het op fout kan gaan is als de tijd van de RPi niet klopt, dit kan alleen gebeuren als er geen verbinding is. Maar dan gaat ook de data verloren.

De problemen heb ik al opgenoemd, als je even terug leest.

Hoe wil je straks berekening maken over welk jaar gemiddeld het meeste items heeft?

Oke, dit snap ik niet. Welke berekening zou ik moeten maken wat niet meer gaat? Zou je hierin een voorbeeld kunnen geven?


Ik heb het nog niet helemaal gelezen, maar hier staat het volgende boven:
"Databasenormalisatie is een techniek bij het ontwerpen van databases. Ze dient twee doelen: het spaarzaam omgaan met opslagruimte en het vermijden van meervoudige vastlegging van dezelfde data, een potentiele bron van fouten."

Dat is nu de reden waarom ik mijn 3 tabellen wil samenvoegen om de opslagruimte kleiner te maken, want ik heb bij alle drie de tabellen een timestamp en ID die telkens hetzelfde zijn.
Het meervoudige vastlegging van dezelfde data doe ik toch niet?
 
Je moet je database-structuur nooit laten afhangen van aantallen. Deze kunnen altijd verschillend zijn. Ook moet je dan steeds je applicatie aanpassen wat onnodig is, en je applicatie juist lastiger laat onderhouden.

Verder ben ik benieuwd hoe je nu de sensorwaardes in één query berekent van het gemiddelde per maand van de laatste jaren.
 
Deze tabel maakt mijn RPi aan:
2015_Sensorwaarden ID Timestamp Waarde 1 Waarde .. Waarde 17

Ik start iedere dag na 00:00 een PHP script wat de statistieken gaat berekenen. Deze maakt dan de volgende tabellen aan:
2015_DagStatistieken ID Dag Statistiek 1 Statistiek.. Statistiek x
2015_MaandStatistieken ID Maand Statistiek 1 Statistiek.. Statistiek x

JaarGemiddelde ID Jaar Statistiek 1 Statistiek.. Statistiek x


Als ik het gemiddelde per maand van de laatste jaren nodig heb, dan kan ik dat inderdaad niet met één query doen. Hiervoor zou ik dan een PHP script moeten schrijven. In principe heb ik dat ook niet nodig, alles wat ik nodig heb en wil tonen staat al in de tabellen. Waarschijnlijk kan het allemaal veel handiger, maar ik heb er momenteel nog te weinig ervaring met MySQL om het zo voor elkaar te krijgen en voor de time being doe ik het maar op deze manier :) Misschien in de toekomt me meer verdiepen in MySQL.

On topic: Voor de tabellen samenvoegen heb ik een PHP script geschreven :d
 
Daarom een begin om dat gehele artikel eens door te nemen ☺ Iedereen zal het adviseren.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan