[SQL] 1 foreign key naar samengestelde primary key

Pagina: 1
Acties:

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Ik heb een vraagje voor de SQL wizards onder ons:

Ik heb 3 GPSen, 3 Temperatuursensors en 2 snelheidsmeters waarvan ik op random intervallen data van binnen krijg. Ik wil elke verandering opslaan en bijhouden wat de status is van de andere apparaten op een bepaald tijdstip. Dus dat ik simpelweg kan zeggen"Hoesnel werd er bewogen op tijdstip y, en wat was de meest actuele temperatuur toen?"

Ik heb de volgende tabellen gedefinieerd:
Positie
-PositieID
-GPSMeterNr
-Long
-Lat

Primary key: PositieID,GPSMeterNr

Snelheid
-SnelheidID
-SnelheidMeterNr
-Snelheid

Primary key: SnelheidID,SnelheidMeterNr

Temperatuur
-TempID
-TempMeterNr
-Temperatuur

Primary key: TempID,TempMeterNr

-AlgLog
-TempID
-TempIDRecent (boolean)
-SnelheidID
-SnelheidIDRecent (boolean)
-PositieID
-PositieIDRecent (boolean)
-DateTime

Primary key: DateTime

Alle sensoren van 1 type komen tegelijkertjid binnen.
Nu wil ik de TempID,SnelheidID en PositieID velden koppelen aan de bijbehorende tabellen, en hier komt het probleem. De SQL server staat mij niet toe om deze links te maken omdat de primary keys in de 3 tabellen samengestelde keys zijn van het ID en het meternummer.

Is er een manier om dit te omzeilen en het toch mogelijk te maken dat ik de foreign key kan maken?

Mess with the best, die like the rest


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
PositieID en SnelheidID etc lijken surrogate keys, maar je maakt er dan toch een samengestelde sleutel van samen met de meterID, waarom doe je dat?

Verder kun je gewoon relaties aanleggen met een FK waarbij 2 velden gematcht worden.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Grijze Vos schreef op donderdag 10 december 2009 @ 15:10:
PositieID en SnelheidID etc lijken surrogate keys, maar je maakt er dan toch een samengestelde sleutel van samen met de meterID, waarom doe je dat?

Verder kun je gewoon relaties aanleggen met een FK waarbij 2 velden gematcht worden.
Omdat er meerdere velden met 1 id kunnen voorkomen maar dan met een ander meternummer, bijv:

SnelheidID - SnelheidMeterNr - Snelheid
0 1 5
0 2 5
1 1 8
1 2 8

Op deze manier kan ik dus per update bijhouden in de AlgLog elke sensoren allemaal veranderd zijn en toch een minumum aan aantal records krijgen. (het is onzin om 2 records te schrijven voor eenzelfde sensorverandering waarvan ik toch weet dat hij tegelijkertijd met de rest van hetzelfde type sensors gebeurd).

Ik wil een relatie van AlgLog.PositiieID naar Positie.PositieID. Maar dit is niet mogelijk volgens SQL omdat de primary key van de tabel Positie: PositieID,GPSMeterNr is

Mess with the best, die like the rest


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ThaStealth schreef op donderdag 10 december 2009 @ 15:16:
[...]

Maar dit is niet mogelijk volgens SQL omdat de primary key van de tabel Positie: PositieID,GPSMeterNr is
SQL is een taal, geen software. "Volgens SQL" betekent dus niks. Welk DBMS gebruik je?

Daarnaast: als het niet gaat, waarom maak je dan niet een apart key-veld dat je alleen hiervoor gebruikt?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
NMe schreef op donderdag 10 december 2009 @ 15:40:
[...]

SQL is een taal, geen software. "Volgens SQL" betekent dus niks. Welk DBMS gebruik je?

Daarnaast: als het niet gaat, waarom maak je dan niet een apart key-veld dat je alleen hiervoor gebruikt?
MySQL, sorry dat ik het niet duidelijker vermeldh eb.

Heb idd een apart keyveld gemaakt, leek mij de beste oplossing. Misschien waren er nog betere oplossingen of zag ik iets over het hoofd.

Probleem is iig opgelost :)

Mess with the best, die like the rest