Kezdőlap › Fórumok › Programozás › SQL – ez komoly?
- This topic has 8 hozzászólás, 3 résztvevő, and was last updated 20 years, 4 months telt el by
tovis.
-
SzerzőBejegyzés
-
2005-03-20-19:46 #2008961
Adva van egy olyan rendszer ahol egy 32 bites szó mint maszk szerepel, amely eldönti hogy az adat merre menjen (több felé is mehet) – halványan emlékeztet az IP címre.
Ezt nem értem. Ha a maszkot tárolod, akkor milyen értekkel hasonlítod össze? Vagy mindkét komponens tárolva van? Mellesleg, hogy az adatok merre fognak menni, az nem adatbázis szintû probléma.
PostgreSQL -ben úgy tûnik ezt bitstring -ként kellene tárolnom, akkor tudom pl. leválogatni, hogy egy adott irányban mely dolgok mennek! – bitmanipulációs mûveletek. Ez azt jelenti hogy 4 byte helyett ez 32 byte + némely overhead:o(
Biztos hogy ez csak így kivitelezhetõ? – úgy hogy a kommunikációs programok is megértsék és az SQL is tudjon szelektálni a rekordok között bitmaszk alapján.
[align=right][snapback]124833[/snapback][/align]Ez szintén homályos számomra. Nem értem milyen bitmanipulációs mûveletek kellenek neked. Valószínüleg elég lesz egy valamelyik procedurális nyelvû tárolt eljárást írni (pgSQL, perl, python), ahol szelekció és bináris
2005-03-20-20:26 #2008962Ezt nem értem. Ha a maszkot tárolod, akkor milyen értekkel hasonlítod össze? Vagy mindkét komponens tárolva van? Mellesleg, hogy az adatok merre fognak menni, az nem adatbázis szintû probléma.
Ez szintén homályos számomra. Nem értem milyen bitmanipulációs mûveletek kellenek neked. Valószínüleg elég lesz egy valamelyik procedurális nyelvû tárolt eljárást írni (pgSQL, perl, python), ahol szelekció és bináris
2005-03-20-21:00 #2008963SELECT TABLE objektum WHERE mask AND irány = TRUE;
Ha (mask > 0) és (irany > 0) akkor a feltétel igaz. De neked nem ez kell! Az AND nem bitenkénti, hanem logikai
2005-03-20-21:46 #2008964Nem a maskot tartalmazó tábla több tízezer rekordjával, többek között, azt mutatja meg, hogy az adott rekordhoz kapcsolódó adatokat milyen csatornákon kell továbbítani – terminálok, több is lehet (mondjuk 32) így nem elég egy-egy terminál asszociáció.
Viszont ha megakarod kapni, hogy egy adott terminálra mely objetumok vannak „rákötve” meg kell nézned, hogy a rekord megfelelõ maszk bitje be van-e billenttve, vagyis így terminálonként leválogathatóak a rekordok. De ha mondjuk int4 esetleg int8 akkor nem tudsz bitenként2005-03-20-22:45 #2008965Nem a maskot tartalmazó tábla több tízezer rekordjával, többek között, azt mutatja meg, hogy az adott rekordhoz kapcsolódó adatokat milyen csatornákon kell továbbítani – terminálok, több is lehet (mondjuk 32) így nem elég egy-egy terminál asszociáció.
Az elvet értem, de pontos körülmények ismeretének hiányában ez még mindíg tág számomra.
Viszont ha megakarod kapni, hogy egy adott terminálra mely objetumok vannak „rákötve” meg kell nézned, hogy a rekord megfelelõ maszk bitje be van-e billenttve, vagyis így terminálonként leválogathatóak a rekordok. De ha mondjuk int4 esetleg int8 akkor nem tudsz bitenként
2005-03-20-23:32 #2008966No még egyszer nekifutok.
Van egy tábla melynek mineden sora tartalmaz egy maszkot, mely minden egyes bitje egy-egy terminálnak felel meg. Ha egy adott sort elõveszel több terminálra is el tudod küldeni:
0-ás bit = 1 –> elsõ terminálra megy
1-es bit = 0 –> kettes terminálra nem megy
2-es bit = 1 –> hármas terminálra megy
…Ameddig ez egy egyszerû adatbázisban volt ezt a maszkot egy unsigned long típusú mezõben tároltam. Ha lekellett válogatnom mely rekordok mennek mondjuk az második terminálra egyszerüen végig „szaladtam” a rekordokon elõvettem a maszkot és megvizsgáltam az egyes bitet:
if ( (maszk & 2) != 0 )
akkor a rekord az második terminál illetõségébe (is) tartozik.
Az SQL esetében ezt a leválogatást inkább a szerverre bíznám (sávszélesség, gyenge kliens …) de ehhez úgy kell megadnom a maszkot, hogy azt a szerver is értse – tudjon vele mûveletet végezni. Eddig úgy találtam, hogy erre egyedül a bitstring típus alkalmas, viszont ez azt jelenti hopgy az eddig megszokott 32 lehetõséghez harminckét karakter kell! – ez kicsit drága dolognak tûnik. Ráadásul amikor a terminál szelektor õprogramba beolvasom kapásból konvertálnom kell binárisba, hiszen az egy C program.
Még azon morfondírozom. hogy a 32 lehetõséget le korlátozom 31-re (sose volt kihasználva a 32) és akkor egy int4-be belefér, viszont nem tudom hogy az SQL az int4 -el tud-e bitenkénti logikai mûveletet végezni?
Pl.
SELECT * FROM tábla WHERE cast(maszk as bit(31)) & B’1′ > 0;
ahol a maszk – int4 típus
vajon helyes eredményt fog adni? – vagyis minden sort amelynél a maszk 0-ás bitje „1”.2005-03-21-17:45 #2008967Ameddig ez egy egyszerû adatbázisban volt ezt a maszkot egy unsigned long típusú mezõben tároltam. Ha lekellett válogatnom mely rekordok mennek mondjuk az második terminálra egyszerüen végig „szaladtam” a rekordokon elõvettem a maszkot és megvizsgáltam az egyes bitet:
if ( (maszk & 2) != 0 )
akkor a rekord az második terminál illetõségébe (is) tartozik.Aha, itt az egyik probléma. Nem az a maszk, amit annak hívsz. A fenit példában a 2 a maszk, és nem a „maszk” nevû mezõ! A maszk egy „bitszûrõ”. Helyesen a „maszk” mezõ az irány(ok).
Az SQL esetében ezt a leválogatást inkább a szerverre bíznám (sávszélesség, gyenge kliens …) de ehhez úgy kell megadnom a maszkot, hogy azt a szerver is értse – tudjon vele mûveletet végezni.
Látom, neked is problémáid vannak az általam írottakkal. Ha a maszk és az irány is tárolt érték lettek volna, akkor lenne értelme a „szerver vagy kliens?” kérdésnek. Ugyanis szerver oldalon megoldható, hogy egy tárolt eljárásban lekérdezed a maszk mezõt, amit az irány kiválasztásánál közvetlenül fel tudnál használni, vagy egy extra lekérdezéssel kliens oldalon is átadhatnád a maszkot. Mivel a jelen esetben a maszk constans, így nincs értelme ezen gondolkodni.
Eddig úgy találtam, hogy erre egyedül a bitstring típus alkalmas, viszont ez azt jelenti hopgy az eddig megszokott 32 lehetõséghez harminckét karakter kell! – ez kicsit drága dolognak tûnik. Ráadásul amikor a terminál szelektor õprogramba beolvasom kapásból konvertálnom kell binárisba, hiszen az egy C program.
Nem csak a bitstring alkalmas. Javaslom nézd át a halmazelméletet és a bitaritmetikát tüzetesebben. Sima egész értékekkel is meg lehet oldani. A bitenkénti
2005-03-24-10:35 #2008968Bocs, hogy így elhalgattam… mindíg valami közbe jön:o(
Ami leírtál tökéletesen áll. Szépen int4 -nek definiáltam, a szám ábrázolás miatt így ugyan csak 31 irányom lehet (a legfelsõ bit elõjel és kurvára zavar) viszont azzal már teljesen szokásos módon tudom kezelni a „maszkomat”, mind a C oldalról mind a windows kliens oldaláról:-)
Lépegetek tovább – egyenlõre konvertálom a régi adatbázist, nagyon jó tanuló lehetõség a különféle típusok, relációk, és egyéb szabályok tanulgatására.
Egyébként végül maradtam a megszokott Clarion -os környezetben az adatbázis tervezésénél, az UML nekem magas|-( és túldimenzionált.2009-12-04-19:57 #1878921Adva van egy olyan rendszer ahol egy 32 bites szó mint maszk szerepel, amely eldönti hogy az adat merre menjen (több felé is mehet) – halványan emlékeztet az IP címre. PostgreSQL -ben úgy tûnik ezt bitstring -ként kellene tárolnom, akkor tudom pl. leválogatni, hogy egy adott irányban mely dolgok mennek! – bitmanipulációs mûveletek. Ez azt jelenti hogy 4 byte helyett ez 32 byte + némely overhead:o(
Biztos hogy ez csak így kivitelezhetõ? – úgy hogy a kommunikációs programok is megértsék és az SQL is tudjon szelektálni a rekordok között bitmaszk alapján. -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz