---
title: "Tankar kring relationer"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/183026-tankar-kring-relationer"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Travoni"
published: "2010-03-31T21:50:31.000Z"
updated: "2010-04-02T11:11:07.000Z"
replies: 7
views: 847
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/183026-tankar-kring-relationer"
---

# Tankar kring relationer

## #1 — Travoni, 2010-03-31T21:50Z

Jag har en tabell som heter *tbl_person* och en som heter *tbl_relation*
I tabellen tbl_person så lagrar jag personer (id,namn osv.)
I tabellen tbl_relation så tänkte jag lagra vilken relation som personen har med en annan person. Där *pid* är en persons id och *pidr* är den relaterade personens id, och rel är ett värde som visar vilken relation de till varandra. (ex. 1=Förälder, 2=Syskon, 3=Barn, 4=Maka)

```
[U]tbl_person[/U]
id
Name

[U]tbl_relation[/U]
pid
pidr
rel

Så låt säga att dessa personer finns:

1 | Rolf
2 | Åse
3 | Lisa
4 | Pelle

Och de är relaterade så här:

1 | 2 | 4 (Maka)
1 | 3 | 3 (Barn)
3 | 1 | 1 (Förälder)
```

Men nu min fråga, detta kommer ju bli ett jytter av poster och dessutom är det svårt att få integritet så att inte bara Rolf är förälder till Lisa utan också att Lisa är barn till Rolf osv.
Går det att fatta hur jag menar?

Tips om struktur önskas, mycket gärna här...  :)

Permalänk: https://www.webforum.nu/p/183026

## #2 — Lasp, 2010-03-31T23:21Z

Ha du de olika typerna av relationerna i en tabell, dvs. son, dotter, far, mor osv.
Ha en tabell med personer och uppgifter
Den tredje tabellen innehåller knytningar mellan relationstyp och person med ett start och kanske slutdatum för just den relationstypen.
Kolla gärna in hur det är löst i exempelvis "Min släkt"   <http://www.dannbergsdata.se/>

Permalänk: https://www.webforum.nu/p/2232174

## #3 — nitro2k01, 2010-03-31T23:58Z

Förälder och barn är i princip redundanta om du inte vill att relationerna ska kunna finnas oberoende av varandra, t ex att A säger sig vara förälder till B utan att B för den sakens skull ska behöva säga sig vara barn till A. Även syskon är en smått redundant egenskap eftersom den kan räknas ut utifrån föräldraskapet med lite listiga joinar.
Det enda du egentligen behöver här är två parent-attribut, ett för mor och ett för far.

Vidare vad gäller maka... Om det är tänkt att representera biologiskt föräldraskap är även det redundant, det lagras istället bäst indirekt utifrån fälten för mor och far. 

Det beror helt enkelt på vad du vill åstadkomma. Vad exakt vill du lagra? Vem ska redigera informationen?

Permalänk: https://www.webforum.nu/p/2232175

## #4 — Travoni, 2010-04-01T13:27Z

Tack Lasp, det skall jag titta på.
nitro: Det har du rätt i att det räcker att man anger vilka barn en förälder har. Då går det ju att koppla ihop relationerna ändå. Kanske inte behöver mer, så att säga.
Att någon utger sig för att inte var barn till någon osv finns inte här.

Permalänk: https://www.webforum.nu/p/2232277

## #5 — Travoni, 2010-04-02T00:07Z

Jag struntar nu i vilken relation de har till varandra, utan i tabellen *tbl_relation* så har jag två kolumner *parent_id* och *child_id*
och plockar ut barnen med en enkel join:

```
SELECT a.id,a.name FROM tbl_person a
INNER JOIN tbl_relation b ON b.child_id=a.id 
WHERE b.parent_id = 1
```

Och föräldrarna genom att vända på den

```
SELECT a.id,a.name FROM tbl_person a
INNER JOIN tbl_relation b ON b.parent_id=a.id 
WHERE b.child_id = 3
```

No problem so far, men om jag nu även vill hämta den andra föräldern som tillhör barnet/barnen i samma fråga. Och vilka syskon barnet har utifrån barnets id (som då bara har kopplingen till gemensamma föräldrar) 
Hur gör jag då?

Permalänk: https://www.webforum.nu/p/2232318

## #6 — nitro2k01, 2010-04-02T01:21Z

Frågorna bör läsas nerifrån och upp. Notera i båda fallen AND c.id !=1 som plockar bort den person du utgär ifrån från listan. Detta kan självklart plockas bort efter behov.

Få ut den/de andra föräldern/arna: (Om det finns halvsyskon) 

```
SELECT DISTINCT c.id,c.name FROM tbl_person c  /* DISTINCT för att få bort dubletter */
INNER JOIN tbl_relation b ON b.parent_id=c.id
INNER JOIN tbl_relation a ON a.child_id=b.child_id
WHERE a.parent_id = 1 AND c.id !=1     /* Föräldern du utgår från */
```

Få ut syskon:

```
SELECT DISTINCT c.id,c.name FROM tbl_person c  /* DISTINCT för att få bort dubletter */
INNER JOIN tbl_relation b ON b.child_id=c.id
INNER JOIN tbl_relation a ON a.parent_id=b.parent_id
WHERE a.child_id = 1 AND c.id !=1     /* Barnet du utgår från */
```

Permalänk: https://www.webforum.nu/p/2232319

## #7 — Travoni, 2010-04-02T10:14Z

Fett!
Men om jag vill få ut alla "troliga scenarion" så måste jag köra med union all?
Så här:

```
SELECT DISTINCT a.id,a.name FROM tbl_person a
INNER JOIN tbl_relation b ON b.parent_id=a.id 
WHERE b.child_id = 1
UNION ALL
SELECT DISTINCT a.id,a.name FROM tbl_person a
INNER JOIN tbl_relation b ON b.child_id=a.id 
WHERE b.parent_id = 1
UNION ALL
SELECT DISTINCT c.id,c.name FROM tbl_person c
INNER JOIN tbl_relation b ON b.parent_id=c.id
INNER JOIN tbl_relation a ON a.child_id=b.child_id
WHERE a.parent_id = 1 AND c.id !=1
UNION ALL
SELECT DISTINCT c.id,c.name FROM tbl_person c
INNER JOIN tbl_relation b ON b.child_id=c.id
INNER JOIN tbl_relation a ON a.parent_id=b.parent_id
WHERE a.child_id = 1 AND c.id !=1
```

Permalänk: https://www.webforum.nu/p/2232340

## #8 — Lasp, 2010-04-02T11:11Z

En bra start, tänk om omvärlden vore lika klar.
Vilka har inte syskon eller halvsyskon, vilka föräldrar har andra make/maka i en annan tid.
Jag anser att tidpunkt fortfarande är viktig för att fastslå en relation.
Kör inte fast i något som måste ändras med tiden. Tänk framåt.

Permalänk: https://www.webforum.nu/p/2232341

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/183026-tankar-kring-relationer
