Három tábla egyenrangú kapcsolata
Sziasztok!
Van három táblám:
INGATLANOK (id, cím, tulajdonos, ...)
INGATLANRÉSZEK (id, név, ...)
TULAJDONSÁGOK (id, név, ...)
A felhasználó az igényeinek legjobban megfelelő ingatlant keresi a nyilvántartott ingatlanok tulajdonságai között szűrve. Egy tulajdonság lehet pl.: az épület falának anyaga, vagy a padló burkolata. Előbbi az egész ingatlan tulajdonsága, utóbbi viszont ingatlanrészenként (nappali, fürdőszoba stb) más és más lehet (ezért hozom létre az INGATLANRÉSZEK táblát, amelynek egyik rekordja az "egész ingatlan").
A fenti táblák mindegyikének másik kettővel alkotottt páros kapcsolataihoz is rendelehetők attribútumok (az ingatlan itt csak példa, egyik másik kapcsolat ezek közül erőltetett), ezért ezekre a kapcsolótáblákra is szükség van:
INGATLANOK_TULAJDONSÁGOK (id, ingatlan_id, tulajdonság_id, további mezők)
INGATLANRÉSZEK_TULAJDONSÁGOK (id, ingatlanrész_id, tulajdonság_id, további mezők)
INGATLANOK_INGATLANRÉSZEK (id, ingatlanrész_id, ingatlan_id, további mezők)
Az egyes ingatlanok, egyes ingatlanrészeihez rendelt tulajdonságoknak (több is lehet) még nincs értéke, ezért kell egy, a fenti három táblát összekapcsoló kapcsolótábla is.
A kérdés: ha azt feltételezzük, hogy jóval több lesz a tulajdonságok alapján való keresés, mint az adatbevitel, akkor a három táblát összekapcsoló negyediket hogyan hozzam létre, melyik az optimális (vagy nincs jelentősége)?
Így:
INGATLANOK_INGATLANRÉSZEK_TULAJDONSÁGOK (id, ingatlan_ingatlanrész_id, tulajdonság_id, érték)
..vagy így:
INGATLANOK_INGATLANRÉSZEK_TULAJDONSÁGOK (id, ingatlan_id, ingatlanrész_tulajdonság_id, érték)
..vagy így:
INGATLANOK_TULAJDONSÁGOK_INGATLANRÉSZEK (id, ingatlan_tulajdonság_id, ingatlanrész_id, érték)
..vagy netalán így:
INGATLANOK_TULAJDONSÁGOK_INGATLANRÉSZEK (id, ingatlan_id, tulajdonság_id, ingatlanrész_id, érték)
■ Van három táblám:
INGATLANOK (id, cím, tulajdonos, ...)
INGATLANRÉSZEK (id, név, ...)
TULAJDONSÁGOK (id, név, ...)
A felhasználó az igényeinek legjobban megfelelő ingatlant keresi a nyilvántartott ingatlanok tulajdonságai között szűrve. Egy tulajdonság lehet pl.: az épület falának anyaga, vagy a padló burkolata. Előbbi az egész ingatlan tulajdonsága, utóbbi viszont ingatlanrészenként (nappali, fürdőszoba stb) más és más lehet (ezért hozom létre az INGATLANRÉSZEK táblát, amelynek egyik rekordja az "egész ingatlan").
A fenti táblák mindegyikének másik kettővel alkotottt páros kapcsolataihoz is rendelehetők attribútumok (az ingatlan itt csak példa, egyik másik kapcsolat ezek közül erőltetett), ezért ezekre a kapcsolótáblákra is szükség van:
INGATLANOK_TULAJDONSÁGOK (id, ingatlan_id, tulajdonság_id, további mezők)
INGATLANRÉSZEK_TULAJDONSÁGOK (id, ingatlanrész_id, tulajdonság_id, további mezők)
INGATLANOK_INGATLANRÉSZEK (id, ingatlanrész_id, ingatlan_id, további mezők)
Az egyes ingatlanok, egyes ingatlanrészeihez rendelt tulajdonságoknak (több is lehet) még nincs értéke, ezért kell egy, a fenti három táblát összekapcsoló kapcsolótábla is.
A kérdés: ha azt feltételezzük, hogy jóval több lesz a tulajdonságok alapján való keresés, mint az adatbevitel, akkor a három táblát összekapcsoló negyediket hogyan hozzam létre, melyik az optimális (vagy nincs jelentősége)?
Így:
INGATLANOK_INGATLANRÉSZEK_TULAJDONSÁGOK (id, ingatlan_ingatlanrész_id, tulajdonság_id, érték)
..vagy így:
INGATLANOK_INGATLANRÉSZEK_TULAJDONSÁGOK (id, ingatlan_id, ingatlanrész_tulajdonság_id, érték)
..vagy így:
INGATLANOK_TULAJDONSÁGOK_INGATLANRÉSZEK (id, ingatlan_tulajdonság_id, ingatlanrész_id, érték)
..vagy netalán így:
INGATLANOK_TULAJDONSÁGOK_INGATLANRÉSZEK (id, ingatlan_id, tulajdonság_id, ingatlanrész_id, érték)
Három tábla egyenrangú kapcsolata
normalizált relációs táblák, összekapcsoló negyedik tábla nélkül.
Ezt meg én nem értem :)
Egyenrangú?
De egyébként n:m hozzárendelést külső kapcsolótáblával tudsz csinálni, másképp nem.
Szerintem
Egyenrangú ?
Én erre gondoltam :
INGATLANOK (ingatlan_id, cím, tulajdonos, ...) primar key ingatlan_id
INGATLANRÉSZEK (ingatlan_id,ingatlanresz_id) primary key ingatlan_id,ingatlanresz_id
-----
INGATLANOK_TULAJDONSÁGAI ( ingatlan_id, ingatlan_tulajdonság_id)
primary key - ingatlan_id,ingatlan_tulajdonságok_id
INGATLANRÉSZEK_TULAJDONSÁGAI ( ingatlan_id,ingatlanrész_id,ingatlanrész_tulajdonság_id)
primary key - ingatlan_id,ingatlanrész_id,ingatlanrész_tulajdonság_id
-----
INGATLAN_TULAJDONSÁGOK ( ingatlan_tulajdonság_id, tulajdonság,érték, .....)
primary key - ingatlan_tulajdonság_id
INGATLANRÉSZ_TULAJDONSÁGOK ( ingatlanrész_tulajdonság_id, tulajdonság,érték, .....)
primary key - ingatlanrész_tulajdonság_id
------
Még lehetne tovább menni ÉRTÉKEK(érték_id,érték) , de ingatlannál nem hiszem hogy ennyire variálni kellene.
Ingatlanrészek?
INGATLANOK (ingatlan_id, cím, tulajdonos, ...) primar key ingatlan_id
INGATLANRÉSZEK_INGATLANOK (ingatlan_id,ingatlanresz_id) primary key ingatlan_id,ingatlanresz_id
INGATLANRÉSZEK (ingatlanresz_id, egyéb mezők...) primary key ingatlanresz_id
Én úgy látom, hogy az értéket az INGATLANOK_TULAJDONSÁGOK táblába kéne tenni az INGATLAN_TULAJDONSÁGOK helyett, mert egy tulajdonság egy konkrét ingatlannal kapcsolatban vesz fel értéket (a "szobák száma" a Cica u. 3.-ban 5).
Ingatlanrészek ?
INGATLANRÉSZ_NEVEK (ingatlanrész_id, ingatlanrész neve)
primary key ingatlanrész_id
Ingatlanrészek
amik az ingatlanrészre. Akkor ehhez kell kötödnie az értékeiknek is. Lesznek olyan jellemzők
a szobaszám mellet, mint pl. a fűtés módja, az olyan dolgokról nem beszélve, ha kiderül, hogy az ingatlannak
három tulajdonosa van stb.
Az értékeket persze veheted egy közös halmazból is.
Ha egy ingatlan öszes tulajdonságára és azok értékeira vagy kiváncsi - ingatlan , ingatlanrész -
akkor kicsit bonyolultabb a lekérdezés persze (pl. UNION-nal ).
Igaz
Igaz
Viszont ha jól sejtem, akkor igy lesz olyan azonosítód ami fixen be lesz égetve a
programba, és hát majd három év múlva , ha módosítani kell ......
Beégetve?
Fürdőszoba
Vallomás
INGATLANOK <-> INGATLANRÉSZEK <-> TULAJDONSÁGOK (id, ingatlan_id, ingatlanrész_id, tulajdonság_id, érték)
hanem az egyik biner kapcsolat azonosítóit használva ilyen:
INGATLANOK <-> INGATLANRÉSZEK_TULAJDONSÁGOK(id, ingatlan_id, ingatlanrész_tulajdonság_id)
UI.: Az egyik biner kapcsolat tehát értelmetlen, a másik a terner kapcsolat alapja lesz, a harmadik (a példában az INGATLANOK_INGATLANRÉSZEK) pedig kiolvasható lesz a terner kapcsolatot megvalósító kapcsolótáblából (amelyik INGATLAN-hoz tartozik valamilyen érték egy INGATLANRÉSSZEL kapcsolatban, abban van olyan ingatlanrész.)
Vissza a kezdetekhez
Kapcsolatok
A szóhasználatom is félrevezető volt, mert némely ternerek valójában binerek :). Ha van három egyedem: EGYIK, MÁSIK és HARMADIK és ezek között (mindegyiknek mindegyikkel) M:N fokú biner kapcsolatok: EGYIKésMÁSIK, EGYIKésHARMADIK és MÁSIKésHARMADIK akkor a mindhárom alapegyedet egyszerre összekapcsoló tábla csak így terner:
EGYIKésMÁSIKésHARMADIK(egyik_id, másik_id, harmadik_id), így például csak biner:
EGYIKésMÁSIKésHARMADIK: (egyik_és_másik_id, harmadik_id)
A fő gondot az okozta, hogy nem tudtam, hogy az egyik biner (és főleg melyik és miért pont az) kapcsolat legyen a "terner" (ekkor valójában ez is biner) alapja, vagy a kapcsolat legyen valóban terner. Most ott tartok, hogy nem három biner kapcsolat közül kell kiválasztani a "terner" kapcsolatban résztvevő egyik felet, hanem csak kettőből (ennyiből meg már sikerül választani) és a valóban terner kapcsolat létjogosultságát is elvetettem.
Azért van még itt kérdés
CÉLOBJEKTUMOK
OBJEKTUMRÉSZEK
TULAJDONSÁGOK
Egy tulajdonságértéket csak a fenti három egyed összekapcsolásával nyert csoporthoz lehet rendelni, tehát terner kapcsolat van ezek között, de értelmezhetőek a biner kapcsolatok is. A három lehetséges biner M:N kapcsolat közül a CÉLOBJEKTUMOK-TULAJDONSÁGOKnak nincs értelme, tehát marad kettő:
CÉLOBJEKTUMOK-OBJEKTUMRÉSZEK
OBJEKTUMRÉSZEK-TULAJDONSÁGOK
A három alaptábla kapcsolatát terner kapcsolattal lehet megvalósítani (bár ezt az esetet zárójelbe tenném, csak elvi lehetőség):
OBJEKTUMRÉSZEK <-> TULAJDONSÁGOK <-> CÉLOBJEKTUMOK
vagy a fenti két biner kapcsolótábla egyikéhez rendelem a harmadikat az alaptáblák közül (a kapcsolat itt is M:N):
CÉLOBJEKTUMOK-OBJEKTUMRÉSZEK <-> TULAJDONSÁGOK vagy
OBJEKTUMRÉSZEK-TULAJDONSÁGOK <-> CÉLOBJEKTUMOK
Kétféle fő módon lehet használni ezt az adatbázist:
Az egyik az adatok bevitele, amikor új CÉLOBJEKTUMOKAT hozunk létre (új rekord az OBJEKTUMOK táblában), azokhoz OBJEKTUMRÉSZEKET rendelünk (új rekordok az OBJEKTUMOK-OBJEKTUMRÉSZEK kapcsolótáblában), majd az új OBJEKTUMOK-OBJEKTUMRÉSZEK rekordokhoz TULAJDONSÁGOKAT (és rögtön értékeket is) rendelünk. Ez a műveleti sorrend ezt a sémát sugallja:
OBJEKTUMOK-OBJEKTUMRÉSZEK <-> TULAJDONSÁGOK
A másik használati mód a CÉLOBJEKTUMOK keresése. A felhasználó kiválasztja az OBJEKTUMRÉSZT és értékeket rendel az adott OBJEKTUMRÉSZHEZ tartozó TULAJDONSÁGOKHOZ, hogy eljusson az ilyen tulajdonságokkal rendelkező CÉLOBJEKTUMHOZ. Ez a felhasználási mód a következő szerkezetet sugallaná:
OBJEKTUMRÉSZEK-TULAJDONSÁGOK <-> CÉLOBJEKTUMOK
Ha feltesszük, hogy a keresések száma lényegesen nagyobb lesz, mint az adatbeviteleké, akkor célszerűbb-e az utóbbi szerkezetet választani (gyorsaság, hatékonyság), vagy totál semmi jelentősége?
Vissza a kezdetekhez
Jó amit irsz, a negyedik táblának ezt választanám:
INGATLANOK_TULAJDONSÁGOK_INGATLANRÉSZEK (id, ingatlan_id, tulajdonság_id, ingatlanrész_id, érték)
Logikailag ez a legjobb, az adatbáziskezelők az elsődleges kulcsokat jól kezelik. Módosítanék a sorrenden, de ezt is csak olvasási, logikai ok miatt tenném:
INGATLANOK_INGATLANRÉSZEK_TULAJDONSÁGOK (ingatlan_id, ingatlanrész_id, tulajdonság_id, érték... )
Az id nem kell, mivel további altulajdonságok nem lesznek.
Fölösleges az
INGATLANRÉSZEK_TULAJDONSÁGOK (id, ingatlanrész_id, tulajdonság_id, további mezők)
tábla, ebben csak azt rögzítenéd, hogy milyen ingatlanrész milyen tulajdonságokat vehet fel.
A tulajdonság nem igy szerepel ahogy írod.
A kapcsolatok:
ingatlan-ingatlanrész 1:n
ingatlanrész - ingatlanrész tulajdonság 1:n
ingatlan-ingatlan tuljdonság 1:n
ingatlan_tulajdonság - ingatlanrész_tulajdonság n:m
A kapcsolótáblával n:m kapcsolatoknál 1:n kapcsolatot hozhatunk létre,
amit te kapcsolótáblának hivsz, az sima tábla összetett kulccsal, itt nincs ilyen.
A kiindulási pontnál hibázol, az ingatlan egyed, az ingatlanrész egyed és most ne lepődj
meg :) a tulajdonság az tulajdonság, nem pedig egyed, röviden.
Nem érteni
Az ingatlan_tulajdonság (és az ingatlanrész_tulajdonság) így néz ki (így értetted, hogy a "tulajdonság az tulajdonság"))?
INGATLAN(RÉSZ)TULAJDONSÁGOK (id, ingatlan(rész)_id, tulajdonságnév, érték)
Ezt a kapcsolatot egyáltalán nem értem:
UI.: Ja és még valami: nálad az ingatlanok-ingatlantulajdonságok (és az ingatlanrészek-ingatlanrésztulajdonságok) 1:N fokú kapcsolatok. Nálam azért lett M:N, mert például a "fal" ingatlanrésznek és a fürdőszobai "szanitereknek" is lehet "szín" tulajdonságuk és ki akartam küszöbölni az ismétlődést. Most már látom, hogy ez hülyeség, a "színt" mint fogalmat tényleg értelmetlen külön kezelni.
UUI (jan. 27).: a TULAJDONSÁGOK azért lett tábla, mert ha csak attribútum, akkor egy füdőszobához hozzárendelhetnénk a "kovácsjózsi" tulajdonságot (érvényesítő tábla). Ezt Te is említed, de miért veted el?
máshogy
csinálnék egy fát az objektumoknak és a részeiknek, ezt egy táblában tárolnám (elég sok megvalósítás létezik, attól függően, hogy mennyi adatot akarsz tárolni), és a fa részeihez lehetne a tulajdonságokat csatolni.
a tulajdonságokat típusokba szervezném (a fa elemei is ugyanezt a típust), mert ha pl. egy nappalit vesznek fel, ott mondjuk nem azok a tulajdonságok fontosak, mint a konyhánál, de ezt elsősorban az adatrögzítés könnyítése miatt tenném.
a keresés így a tulajdonságok között is egyszerűsödne (ha mondjuk a nevet is tulajdonságként kezeled)
Persze
Szerintem ezt nem zárja ki sem az M:N, sem az 1:N fokú objektumok_objektumrészek kapcsolat.
Ezt ki kéne fejtened..
Fa
+épület paraméterei: hány nm, stb
+fürdőszoba 1 paraméterei: wc csésze mérete, tükör nagysága
+fürdőszoba 2 paraméterei: wc csésze mérete, tükör nagysága
+sufni..
+traktor...
És itt a howto:
http://weblabor.hu/cikkek/hierarchikusadatkezeles1
http://weblabor.hu/cikkek/hierarchikusadatkezeles2
Joe Celko
(a http://dev.mysql.com/tech-resources/articles/hierarchical-data.html -en is rá hivatkoznak)
Mér' nem fa?
Köszi a linkeket! Halassy Béla könyvekkel kelek és fekszem :) Pl.: ez.
CakePHP
Más: talán már túlragozom a dolgot, de lehet, hogy két faszerkezet is van egyszerre (?). Az egyik a lehetséges alkotórészek lehetséges hierarchiája (pl. a "tető" a "sufni" és a "ház" alkotórésze is lehet, de a "mosdókagylóé" nem, vagy a "WC" lehet a "ház", vagy a "fürdőszoba" alkotórésze, de a "hálószobáé" nem, ezek a megszorítások konkrét ingatlan-előfordulástól függetlenül is fennállnak), a másik a konkrét ingatlan-előfordulások alkotórészeinek egyedi hierarchiája (az egyik ingatlan "ház" alkotórésze egy, a másiké két "fürdőszobát" tartalmaz egy "WC"-vel, míg a harmadikban a "ház" tartalmazza a "fürdőszobát" és a "WC"-t, ugyanakkor egyetlen konkrét ingatlannál sem lehet "teteje" a "mosdókagylónak"). Ez utóbbi fa csomópontjaihoz köthetők a konkrét tulajdonságok és tulajdonság-értékek, míg az elsőhöz a lehetséges tulajdonságok (a "szobához" kapcsolható az "alapterület", a "kazán"-hoz nem).
Tehát: hogyan néz ki egy lehetséges alá-fölérendeléseket definiáló tábla és hogyan érvényesítem az így meghatározott megszorításokat a konkrét hierarchia-előfordulásokra nézve (az érvényesítő tábláról nagyjából tudom, hogy mi)?