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?
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/
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?
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.
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å?
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 */
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
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.
133 ms totalt · 3 externa anrop · v20260731065814-full.b746b907