webForumDet fria alternativet

Tankar kring relationer

7 svar · 823 visningar · startad av Travoni

TravoniMedlem sedan okt. 20041 538 inlägg
#1

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... :)

LaspMedlem sedan juli 200010 197 inlägg
#2

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/

nitro2k01Medlem sedan aug. 20037 630 inlägg
#3

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?

TravoniMedlem sedan okt. 20041 538 inlägg
#4

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.

TravoniMedlem sedan okt. 20041 538 inlägg
#5

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å?

nitro2k01Medlem sedan aug. 20037 630 inlägg
#6

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 */
TravoniMedlem sedan okt. 20041 538 inlägg
#7

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
LaspMedlem sedan juli 200010 197 inlägg
#8

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.

Genererad på 373 ms · cache AV · v20260730165559-full.f96bc7eb