Meerdere foreign keys op een record

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • engineer88
  • Registratie: December 2011
  • Laatst online: 21-05 18:11
Ik heb een database met meerder tabellen waarbij ik relaties wil aanbrengen tussen twee tabellen. Dit doe ik momenteel met SQLite Studio 3.
Op basis van de waarde gekozen in tabel1 moeten er nog maar bepaalde waarden overblijven in tabel2. Dit heb ik al werkend middels een Foreign Key op tabel2 die verwijst naar tabel1. Echter, ik wil dat een waarde in tabel2 niet gekoppeld is aan één waarde in tabel2, maar aan twee of meer.

Tabel1Tabel2
IDWaardeIDWaardeForeign_ID_Tabel1
1Waarde11Waarde63
2Waarde22Waarde73,4
3Waarde33Waarde81,3,5
4Waarde44Waarde92
5Waarde55Waarde101


Is dit mogelijk in SQL of moet ik dan een waarde dubbel in de tabel zetten (waarde7 bijvoorbeeld 2x)?

In SQLite Studio gaat praktisch bijna alles via een GUI, dus ik ben niet helemaal bedreven met SQL statements, maar is eventueel wel mogelijk.

Beste antwoord (via engineer88 op 20-12-2021 16:03)


  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 00:53

CyBeRSPiN

sinds 2001

Hangt er allemaal vanaf hoe je datamodel is inderdaad.
De genormaliseerde manier om dit aan te pakken is een derde tabel:
IDTabel1_IDTabel2_ID
113
223
324
431
533
635
742
851

Alle reacties


Acties:
  • 0 Henk 'm!

  • erwn
  • Registratie: November 2020
  • Niet online
Het lijkt me inderdaad het makkelijkst om dan meerdere rijen aan te maken in Tabel2, maar het antwoord op je vraag is eigenlijk afhankelijk van het soort data dat je hebt. Hoe ziet je (functionele) datamodel eruit? Is het ook 'logisch' om meerdere rijen in Tabel2 te maken? Wat zou 'Waarde8' bijvoorbeeld zijn en is dat precies hetzelfde voor Tabel1 rij 1, 3 en 5?

Acties:
  • +1 Henk 'm!

  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 19:42
Klinkt alsof je een kruistabel wilt hebben tussen tabel1 en tabel2.

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 00:53

CyBeRSPiN

sinds 2001

Hangt er allemaal vanaf hoe je datamodel is inderdaad.
De genormaliseerde manier om dit aan te pakken is een derde tabel:
IDTabel1_IDTabel2_ID
113
223
324
431
533
635
742
851

Acties:
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 23:14
Normaalgesproken maak je voor dat soort vraagstukken een koppeltabel:


Tabel 1:
code:
1
2
tbl1_id, 
waarde


Tabel 2:
code:
1
2
tbl2_id,
waarde


Koppeltabel met een naam zoals "tabel1_tabel2":
code:
1
2
tbl1_id,
tbl2_id


Daardoor kan je b.v. in tabel1_tabel2 de volgende waardes zetten:

tbl1_idtbl2_id
11
12
23


Zo koppel je respectievelijk ID 1 en 2 uit tabel 2 aan ID 1 aan tabel 1, en ID 3 uit tabel 2 aan ID 2 aan tabel 1.

Acties:
  • 0 Henk 'm!

  • engineer88
  • Registratie: December 2011
  • Laatst online: 21-05 18:11
erwn schreef op maandag 20 december 2021 @ 15:18:
Het lijkt me inderdaad het makkelijkst om dan meerdere rijen aan te maken in Tabel2, maar het antwoord op je vraag is eigenlijk afhankelijk van het soort data dat je hebt. Hoe ziet je (functionele) datamodel eruit? Is het ook 'logisch' om meerdere rijen in Tabel2 te maken? Wat zou 'Waarde8' bijvoorbeeld zijn en is dat precies hetzelfde voor Tabel1 rij 1, 3 en 5?
Het gaat hier om omschrijvingen voor CAD.

Tabel1Tabel
IDWaardeIDWaardeForeign_ID_Tabel1
1Building
1Column
1,2
2Steelwork
2Floor1,2
3System3Stairs
1
4Acces4Conveyor
5Container
5Left


De waarde Column kan horen bij Building of Steelwork, idem voor Floor. Stairs bijvoorbeeld enkel bij Building.

Acties:
  • 0 Henk 'm!

  • engineer88
  • Registratie: December 2011
  • Laatst online: 21-05 18:11
@CyBeRSPiN en @Merethil

Ik denk inderdaad dat het dit moet zijn.

Dan maak ik in tabel2 een verwijzing naar de koppeltabel?

Acties:
  • +1 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 00:53

CyBeRSPiN

sinds 2001

engineer88 schreef op maandag 20 december 2021 @ 15:27:
@CyBeRSPiN en @Merethil

Ik denk inderdaad dat het dit moet zijn.

Dan maak ik in tabel2 een verwijzing naar de koppeltabel?
Nee, de koppeltabel heeft verwijzingen naar tabel1 en tabel2
Middels een query die een JOIN bevat koppel je alles aan elkaar.

Bijvoorbeeld
SQL:
1
2
3
4
select t1.waarde, t2.waarde 
from tabel3 t3
join tabel1 t1 on t3.tabel1_id = t1.id
join tabel2 t2 on t3.tabel2_id = t2.id

Mogelijk moet je "left join" gebruiken als je ook waarden uit tabel1 of tabel2 wilt tonen die niet aan elkaar gekoppeld zijn.

Ik zou zeggen: begin met een cursus datamodelleren en een cursus SQL :)

[ Voor 16% gewijzigd door CyBeRSPiN op 20-12-2021 15:33 ]


Acties:
  • +1 Henk 'm!

  • luukvr
  • Registratie: Juni 2011
  • Niet online
De foreign key inderdaad niet in het object opslaan. Praat ook in duidelijke termen (tabel 1, 2 en 3 is erg verwarrend)

Tabel: Category
ID (PK)
Name (Bijv. Building)

Tabel: Element
ID (PK)
Name (Bijv. Floor)

Koppel tabel: Element_category
category_id (FK -> category)
element_id (FK -> element)

Door de koppel tabel kan je zoveel FK's plaatsen op je elementen als je wilt. Als je strengere regels hierop wilt toepassen kan dat door eventuele stored procedures & triggers.

Ophalen met joins en potentieel group by's.

Acties:
  • 0 Henk 'm!

  • engineer88
  • Registratie: December 2011
  • Laatst online: 21-05 18:11
luukvr schreef op maandag 20 december 2021 @ 15:45:
De foreign key inderdaad niet in het object opslaan. Praat ook in duidelijke termen (tabel 1, 2 en 3 is erg verwarrend)

Tabel: Category
ID (PK)
Name (Bijv. Building)

Tabel: Element
ID (PK)
Name (Bijv. Floor)

Koppel tabel: Element_category
category_id (FK -> category)
element_id (FK -> element)

Door de koppel tabel kan je zoveel FK's plaatsen op je elementen als je wilt. Als je strengere regels hierop wilt toepassen kan dat door eventuele stored procedures & triggers.

Ophalen met joins en potentieel group by's.
Helder, denk ik. Hoe wordt een koppeltabel in het Engels genoemd? Dat zoek wat makkelijker online. Dan worden de termen mij ook duidelijker lijkt mij.

Acties:
  • +3 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 00:53

CyBeRSPiN

sinds 2001

engineer88 schreef op maandag 20 december 2021 @ 15:49:
[...]


Helder, denk ik. Hoe wordt een koppeltabel in het Engels genoemd? Dat zoek wat makkelijker online. Dan worden de termen mij ook duidelijker lijkt mij.
"Associative tables are colloquially known under many names, including association table, bridge table, cross-reference table, crosswalk, intermediary table, intersection table, join table, junction table, link table, linking table, many-to-many resolver, map table, mapping table, pairing table, pivot table, ..."
Wikipedia: Associative entity

Acties:
  • 0 Henk 'm!

  • PainkillA
  • Registratie: Augustus 2004
  • Laatst online: 22-05 13:40
Vergeet ook niet om een composite unique constraint toe te voegen (combi van beide FK's) aan pivot/koppel/bridge tables om onverwacht gedrag en data inconsistentie te voorkomen
Pagina: 1