Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  MySql query märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
geek
HV kasutaja

liitunud: 07.04.2004




sõnum 07.01.2013 18:30:35 MySql query vasta tsitaadiga

Ütleme, et on tabel asukoht. Millel on väljad postikood, linn, tänav.
Tabelis on andmed kujul:
Linn, Postikoodi algus, Tänav.
Tallinn, 43, Lasnamäe tänavad
Tallinn, 431, Kure
Tallinn, 432, Kana
Tallinn, 44, Mustamäe tänavad
Tallinn, 443, Tuvi
Tartu, 55
Narva, 99

Ja mul on vaja teha query. Mis tagastab mulle täieliku postikoodi järgi kõik linna tänavad, mis sobivad postikoodi mustriga. Posti koodi anna ette kujul näiteks 43135

Query mis ma ise mõtlesin, aga nii kahjuks ei toimi.

SELECT * FROM askukoht
WHERE '$postikood%' LIKE postikood



Tulemus mida tahaks näha:
Tallinn, 43, Lasnamäe tänavad
Tallinn, 431, Kure
Kommentaarid: 42 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 41
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 07.01.2013 18:39:03 vasta tsitaadiga

Kui muster on 123, siis puhas SQL oleks selline:
sql:
  1.  
  2.  SELECT * FROM asukoht WHERE postikood LIKE '123%'
  3.  


Pasitab, et sul tuleb see muster PHP-ga sisse, sel juhul midagi sellist:
php:
  1.  
  2. $query="SELECT * FROM asukoht where postikood like '".addslashes($postikood)."%'"
  3.  

Kui sisse tuleb juba LIKE jaoks sobiv pattern, siis võib lõpust % märgi ära jätta.
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
XD
HV kasutaja
XD

liitunud: 12.01.2006



Autoriseeritud ID-kaardiga

sõnum 07.01.2013 18:43:57 vasta tsitaadiga

Kui postikoodid on ilusti hierarhias, võta sisendis olevast postikoodist substring, kas ainult esimene või esimesed kaks numbrit.
SELECT * FROM askukoht
WHERE postikood LIKE substring($postikood,1,2)

Ma peast ei oska öelda kas mysql funktsioone like otsingu sees toetab, võibolla pead selle substringi php? poolelt sisse andma.

_________________
"Kui inimene ei ole rahul tarkvaraga, siis on probleem tõenäoliselt inimeses" M.J.


viimati muutis XD 07.01.2013 18:54:40, muudetud 1 kord
Kommentaarid: 35 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 29
tagasi üles
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 07.01.2013 18:54:37 vasta tsitaadiga

napoleon, küsimus oli ju ikkagi selles, et postikoodi osad on baasis erineva pikkusega? See pole väga ilus, aga peaks töötama:

sql:
  1. SELECT *
  2. FROM asukoht
  3. WHERE postikood = substring('43135', 1, 2) OR
  4. postikood = substring('43135', 1, 3)
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 66
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 07.01.2013 18:59:40 vasta tsitaadiga

Sry, kiiruga lugedes ei vaadanud, et teistpidi match tuleb teha.
Kui muster on alati sama pikk või pikem, on ilusam nii:
sql:
  1.  
  2. SELECT * FROM asukoht WHERE postikood=substring('43135', 1, length(postikood))
  3.  

Või like operaatori abil midagi sellist:
sql:
  1.  
  2. SELECT * FROM asukoht WHERE '43135' LIKE CONCAT(postikood,'%')
  3.  

selle viimase osas pole 100% kindel, aga eeldatavalt toimib kui like operaatorile funtsiooni tulemus patterniks anda
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 09.01.2013 13:27:18 vasta tsitaadiga

napoleoni pakutud lahendustel on üks häda, mis hakkab vähegi suurema andmemahu puhul kohe valusalt lööma - substring või concat operatsioon tehakse iga päringu korral iga tabelis leiduva rea jaoks uuesti. See ei ole kindlasti mõistlik jõudluse mõttes. Lahenduseks oleks funktsionaalne indeks, kus oleks vastav väärtus juba eelnevalt välja arvutatud iga rea kohta, aga paraku MySQL ei paista sellist võimalust omavat kiire guugeldamise põhjal. Asenduslahenduseks pakutakse peamiselt reaalsete veergude lisamist tabelisse, kuhu insert ja/või update triggeritega õiged väärtused välja arvutatakse, et nende järgi pärast pärida.

Keerulisem lahendus oleks muidugi mingi vinge seostabelite struktuur aretada, kus iga indeks oma prefiksitega välisvõtmete kaudus seotud on.. aga tea, kas tasub.. selle võrgustiku korrektne hoidmine nõuab ka omaette põhjalikku läbimõtlemist ilmselt.

PS. Kuidas andmebaasinduses on korrektne tõlkida eesti keelde terminit trigger? Tahtsin kirjutada eestikeelset teksti, aga mitte ei suutnud hoobilt tõlget leiutada. Päästik nagu ei kõla igatahes.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
i485729
HV vaatleja
i485729

liitunud: 05.01.2013




sõnum 10.01.2013 12:01:49 vasta tsitaadiga

Fukiku kirjutas:
napoleoni pakutud lahendustel on üks häda, mis hakkab vähegi suurema andmemahu puhul kohe valusalt lööma - substring või concat operatsioon tehakse iga päringu korral iga tabelis leiduva rea jaoks uuesti. See ei ole kindlasti mõistlik jõudluse mõttes.


Hea märkus, funktsioone on mõistlik päringus kasutada läbimõeldult.

Läheksin tagasi algusesse.

geek, ole hea selgita, kas see tabel on sul ka päriselt sellisel esitatud kujul, või sa plaanid seda luua sellisel kujul? Juhul kui sa alles plaanid, siis tuleks mõelda hoopis optimaalse arhitektuuri loomise peale esmalt ja mistahes päringut tegevetate meetoditega hiljem.

Sinu poolt esitatud tabeli loogika on minu arvates nõrk. Kas sa tahad kasutada lameandmebaasi või ikkagi relatsioonimudelil baseeruvat lahendust. Juhul kui viimast, siis sellisel juhul oleks otstarbekas luua tõhusam struktuur. Pakun kiirelt väga toore lahendusidee, kus oleksid sellised tabelid:

  • indeksid
  • maakonnad
  • linnad
  • aadressid

Kõigi nende tabelite vahel lood adekvaatsed seosed. Nii võiks aadresside tabel koosneda sellistest tulpadest

  • primaarvõti
  • aadress
  • indeks või selle võti


linnade tabel omakorda midagi sellist:
  • primaarvõti
  • linn
  • maakonna võti


jne

Nüüd aga kasutad otsingute puhul erinevaid ristpäringuid, vastavalt otsinguvajadusele, kas soovid otsida indeksi, tänava nime, aadressi, linna, maakonna jms järgi.

Sinu poolt esitatud tabeli puhul on paraku ebaselge, mis tüüpi andmeväljaga on indeksi puhul tegemist. Sellest sõltub ka päringu iseloom.

Kas sa saaksid oma koodinäite puhul täpsustada, et kas see on sul puhas SQL lausend või hoopis PHP muutuja väärtus SQL lausendi koostamiseks või midagi muud?

Soovitatav on alati esmalt luua SQL lausendid ja testida need ning alles seejärel adapteerida äriloogikasse. Kuna pea kõik moodsad andmebaasisüsteemdi võimaldavad kasutada protseduure, siis oleks nutikas SQl lausendeid PHP-s vms programmeeritud rakenduses mitte kasutada, vaid pöörduda otse protseduuri poole, edastades lihtsalt vajalike muutujate väärtused. Nii on võimalik alati teha protseduuris kasutatavas SQL lausendis muutus kui andmebaasis midagi hiljem vaja muuta, ilma, et peaks äriloogika rakenduse kallale minema.

Kui me sõnastaksime nüüd sinu probleemi lihtsalt probleemina, jättes kõrvale tehnilised lahendused, kuidas see kõlaks? Kas see oleks midagi sellist:

Soovin postiindeksite lameandebaasist otsida välja kõik tänavad, mille postiindeksid algavad kasutaja poolt esitatava väärtusega.

Ja nüüd minnes tehnilisemaks:

Kuidas koostada päringut kui mul on järgmised andmvaäljad: jada ((andmeväli, andmetüüp), ..)


Fukiku kirjutas:
PS. Kuidas andmebaasinduses on korrektne tõlkida eesti keelde terminit trigger? Tahtsin kirjutada eestikeelset teksti, aga mitte ei suutnud hoobilt tõlget leiutada. Päästik nagu ei kõla igatahes.

trigger = päästikprotsess
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 10.01.2013 15:59:47 vasta tsitaadiga

päästikprotsess, lameandebaasi, lausendid, adapteerima? Küll on palju uhkeid sõnu aga programmeerimis maailmas on de facto standard inglise keel. Minu keel ei suuda küll triggeri asemel välja öelda päästikprotsess - kõlab ikka täieliku pornograafiana.

Ma nüüd laksan risti vastupidi, progrejate geto keeles:
Stored proccide/funktsioonide kasutamine sõltub DBst ning businessi soovidest/rahast. Oluliselt kirvem/raskem on ehitada ja hallata rakendust, mille äriloogika on viidud DBsse- inimene, kes tuleb välja selliste küsimustega ei saagi sellega normaalselt hakkama ja pole suurt mõtet rääkida sügavast või laiast tabelist või standardsest relatsioonilisest mudelist vs hierarhiline mudel ja plussidest ja miinustest mis sellega kaasnevad. Indexi tüüpidest ei saa enamjaolt aru ka elukutselised kutid. Pigem kirjutada oma sql laused rakenduses kui teha baasi stored proc ja siis seda sealt omakorda SQList välja kutsuda ja imestada miks asjad ei performi.

Kui vaatan esimese postituse näidet ja soovi ning probleemiks saavad suured andmemahud, siis saad väga lihtsalt partitsioneerida. Tekita postiindexi tabelisse uus veerg kus hoiad esimest numbrit, kokku tekib sul 9 partitsiooni ja probleem peaks lahenema mingis mahus. Täitsa ekstreemsuste korral on ka võimalus viia index andmebaasist välja ning teostada otsingud eraldi masinas, mis juba cachib ning teeb otsinguid puhtalt mälus ning mille puhul DB poole pöördutakse ainult primary keyde järgi. Lisaks kui mälu rõvedalt palju üle, võid ka terve tabeli mällu lugeda - jookseb nii et kole kohe. MySQL pakub ka selleks võimalusi.

Soovin edu!
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
YberCyrus
HV vaatleja

liitunud: 27.02.2010




sõnum 11.01.2013 21:39:16 vasta tsitaadiga

Nõustun serki statemendiga, et äriloogika viimine SQLi pole väga hea idee. Sellist lähenemist võib näha finants sektoris (tõenäoliselt vanemad rakendused) kus äriloogika muutub päevast päeva ja varem oli muutuste sisse viimine tülikam. Procide updatemine on märksa lihtsam kui hunnikute serverite redeploymine.

Tänapäeval pole see väga keeruline võttes arvesse .NETi/Java redeployment võimalusi. Javas on täitsa võimalik kasutada hot deplymenti OSGi standardis või siis kasutada kaasmaalaste toodet LiveRebel. Isiklikult ma PHPd mission critical rakenduste kasutamiseks ei kasutaks aga PHPs on updatede sisse viimine kõige lihtsam (ei oska argumenteerida kompileeritud PHP koodiga mida võimaldavad teatud rakendused nagu HipHop).

Rääkides natuke object relational mapperitest mis on väga populaarsed librarid DBga suhtlemiseks ja võttes esmalt ette Hibernate/NHibernate siis üks benefit selle kasutamisel on multi SQL dialecti support. Võimalik on SQLi providerit vahetada äärmiselt kergelt ja stored procide kasutamine oleks korralik counter argument kuna need tuleks tõenäoliselt käsitsi ümber portida. .NETi Entity Framework by default muid providereid ei toeta peale MSSQLi aga kui SQL provideril on ADO.NET support olema siis takistust ei peaks tekkima. Hibernate/NHibernatel on second level cache mis võimaldab andmebaasi hammerdamist kõvasti leevendada, stored procide kasutamine tõenäoliselt nulliks selle võimaluse.

Eesti keel paneb isegi mõne kogenuma venna pead kratsima kui ülikoolist tulnud vend üritab eesti keeles purssida IT termineid.

Ma pole ise kunagi äriloogikat vägistanud stored procidesse ja pole ka ühtegi enterprise rakendust siiamaani näinud mis seda teeks, seega minu arvamus stored procidest on puht teoreetiline ja vabandan faktivigade pärast mis mu jutust välja võivad paista.
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 11.01.2013 23:59:06 vasta tsitaadiga

YberCyrus kirjutas:
Nõustun serki statemendiga, et äriloogika viimine SQLi pole väga hea idee. Sellist lähenemist võib näha finants sektoris (tõenäoliselt vanemad rakendused) kus äriloogika muutub päevast päeva ja varem oli muutuste sisse viimine tülikam. Procide updatemine on märksa lihtsam kui hunnikute serverite redeploymine.

Tänapäeval pole see väga keeruline võttes arvesse .NETi/Java redeployment võimalusi. Javas on täitsa võimalik kasutada hot deplymenti OSGi standardis või siis kasutada kaasmaalaste toodet LiveRebel. Isiklikult ma PHPd mission critical rakenduste kasutamiseks ei kasutaks aga PHPs on updatede sisse viimine kõige lihtsam (ei oska argumenteerida kompileeritud PHP koodiga mida võimaldavad teatud rakendused nagu HipHop).

Rääkides natuke object relational mapperitest mis on väga populaarsed librarid DBga suhtlemiseks ja võttes esmalt ette Hibernate/NHibernate siis üks benefit selle kasutamisel on multi SQL dialecti support. Võimalik on SQLi providerit vahetada äärmiselt kergelt ja stored procide kasutamine oleks korralik counter argument kuna need tuleks tõenäoliselt käsitsi ümber portida. .NETi Entity Framework by default muid providereid ei toeta peale MSSQLi aga kui SQL provideril on ADO.NET support olema siis takistust ei peaks tekkima. Hibernate/NHibernatel on second level cache mis võimaldab andmebaasi hammerdamist kõvasti leevendada, stored procide kasutamine tõenäoliselt nulliks selle võimaluse.

Eesti keel paneb isegi mõne kogenuma venna pead kratsima kui ülikoolist tulnud vend üritab eesti keeles purssida IT termineid.

Ma pole ise kunagi äriloogikat vägistanud stored procidesse ja pole ka ühtegi enterprise rakendust siiamaani näinud mis seda teeks, seega minu arvamus stored procidest on puht teoreetiline ja vabandan faktivigade pärast mis mu jutust välja võivad paista.


Said must täiesti valesti aru.

Probleemiks on see, et inimesed ei oska kasutada andmebaase ja seetõttu topitakse äriloogika javasse/php'sse/.neti jne ... Sageli peitutakse põhjenduste taha nagu baasi koormuse vähendamine - see ajab juba naerma vaikselt. Sisuliselt võib paralleeli tõmmata Energia Jäävus Seadusega. Ega koormus ei kao kuhugi, see lihtsalt liigub ühest kohast teise. Selle asemel, et teha endale selgeks andmebaasi tööpõhimõtted ja elementaarsed tuunimise viisid, hakatakse kasutama haigusi nagu Hibernate, mingid eriti haiged Cachimise lahendused jne ... Lõppeb see asi kõik sellega(99.9% - 10a kogemused), et rakendus muutub ühel heal päeval täiesti haldamatuks. Esiteks ei suuda keegi sellest enam üle käia ning nõuded rakenduserveritele muutuvad jube kalliks. Veel arusaamatumad on näited, kus andmebaasi hoitakse puhtalt andmete hoidmiseks, isegi triggerid ja sequencid hoitakse baasist väljas ja emuleeritakse rak. serveris. Milleks kurat seda andmebaasi sinna üldse siis vaja on? Hoia oma datat failisüsteemis täielikult, milleks väga head lahendused turul olemas. Aga ei.

"et äriloogika viimine SQLi pole väga hea idee" - Äriloogika enamjaolt tähendab andmetega manipuleerimist ja andmebaas on selleks mõeldud. Ta on selleks optimeeritud ja ta teeb seda väga hästi. Java/.Neti/PHP kutid hakkavad kohe pasundama, et hoiame kokku network roundtrippe ning mälus saame kiiremini tehtud. Jah, aga hetkel kui töötluses saab mälu otsa kolitakse kiiresti baasi SQLide otsa. Absurd. Mitte ükski arendaja pole mulle suutnud veenvalt tõestada, miks on kasulik hoida domeeni mudelit äriloogikat mujal kui baasis - mitte keegi! Korduv argument on see, et see on mugavam ja et "mul pole baasi kogemusi".

Multi SQL Dialect - ei tööta see asi. Mitte ükski portimine ei tööta niisama, vähemalt mitte Enterprise tasemel rakendustes. Ei ole võimalik isegi teatud juhtudel sama baasi upgradei teha ilma tõsiste muudatusteta, rääkimata liikumisest Oraclelt Postgre peale, või Oraclelt MySQLi peale ja vice versa.

"Ma pole ise kunagi äriloogikat vägistanud stored procidesse ja pole ka ühtegi enterprise rakendust siiamaani näinud mis seda teeks" - Kõik Enterprise lahendused hoiavadki äriloogikat baasis või täiesti eraldiseisvas vahekihis(mida mina pole siin mandril veel kohanud, küll Skandinaavia pool). Seal ei olegi muud võimalust. Iga äriloogiline samm mis lisatakse väljapoole baasi tõstab oluliselt rak. serverite mäluvajadust ning mõjutab otseselt UI toimist. Kokkuvõttes ja pikas pespektiivis on odavam hoida äriloogikat andmebaasis ja jätta UI nii lihtsaks kui vähegi võimalik. Elu on näidanud, et äri tahab ca 4-5a tagant UI sisulist ringikirjutamist. Palju õnne, kui enamus äriloogikast on viidud lõppkihti.
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 12.01.2013 00:33:21 vasta tsitaadiga

serk kirjutas:

Veel arusaamatumad on näited, kus andmebaasi hoitakse puhtalt andmete hoidmiseks, isegi triggerid ja sequencid hoitakse baasist väljas ja emuleeritakse rak. serveris. Milleks kurat seda andmebaasi sinna üldse siis vaja on? Hoia oma datat failisüsteemis täielikult, milleks väga head lahendused turul olemas. Aga ei.


Üldiselt olen sinuga nõus. Aga näiteks SAP ainult andmete salvestamiseks baasi kasutabki ja samas on tegemist maailmas päris suure ja tuntud tegijaga. Kuna puutun sellega igapäevaselt kokku, siis seda ikka vahel kirun, et isegi trigger-t teha ei saa(sellele mõnes muus kihis alternatiivset lahendust ei pakuta).

serk kirjutas:

Iga äriloogiline samm mis lisatakse väljapoole baasi tõstab oluliselt rak. serverite mäluvajadust ning mõjutab otseselt UI toimist. Kokkuvõttes ja pikas pespektiivis on odavam hoida äriloogikat andmebaasis ja jätta UI nii lihtsaks kui vähegi võimalik. Elu on näidanud, et äri tahab ca 4-5a tagant UI sisulist ringikirjutamist. Palju õnne, kui enamus äriloogikast on viidud lõppkihti.


Räägid nagu oleks ainult baas ja UI. Praktikas on tihti nagu on, aga ideaalis võiks äriloogika ja UI siiski lahutatud olla olenamata sellest kus nad asuvad.
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
i485729
HV vaatleja
i485729

liitunud: 05.01.2013




sõnum 12.01.2013 10:06:37 vasta tsitaadiga

YberCyrus kirjutas:
Ma pole ise kunagi äriloogikat vägistanud stored procidesse ja pole ka ühtegi enterprise rakendust siiamaani näinud mis seda teeks, seega minu arvamus stored procidest on puht teoreetiline


Seega pole sa kokku puutunud mastaapsete lahendustega, kus arendustööd teevad näiteks mitmed meeskonnad üle maailma. Ühel ja samal süsteemil võib olla kümneid erinevaid UI rakendusi, mis kõk kasutavad sama andmebaasi. Sellisel puhul muutub kohe oluliseks, et identsetele päringutele eri UI-des tuleksid alati identsed vastused. Protseduurid ja funktsioonid andmebaasi tasemel on pea ainus võimalus kuidas otstarbekalt, efektiivselt ja soodsalt seda ülesannet lahendada. Nii teevad kõik erinevad UI-d etteantud protseduuride kaudu päringuid baasi. Sisuliselt on protseduuride ja funktsioonide kasutamine lahenduses API loomine UI arendajate jaoks.

Suuremate ärilahenduste puhul tuleb sageli töödelda peale ühe kirje lisamist või muutmist veel mitmeid või mitmeid kümneid kirjeid. Sellisel juhul on protseduurid ja funktsioonid ainus tee kuidas tagada, et misthes UI-st tehtud indentse käsu peale, toimuks baasis identne muutus. Niisugusel puhul tuleb viga parandada ainult ühes kohas, ühes protseduuris. Vastasel korral aga võib olla 20-nes erinevas moodulis vms. Näiteks ehituses püütakse lamekatuste puhul välitda mitme kattekihi kasutamist, sest kui vesi jookseb mitmete kihtide vahele, ei ole enam võimalik laes näha oleva lekkimiskoha järgi tuvastada, kus kõige pealmises kihis on auk. Analoogne pritntsiip kehtib ka ärirakenduste arendamisel. Vead on paratamatu osa rakendustest, kuid arhitektuur peab tagama ka soodsa ja operatiivse tee veaparanduseks.
tagasi üles
vaata kasutaja infot saada privaatsõnum
YberCyrus
HV vaatleja

liitunud: 27.02.2010




sõnum 12.01.2013 17:16:41 vasta tsitaadiga

serk kirjutas:

Said must täiesti valesti aru.

Probleemiks on see, et inimesed ei oska kasutada andmebaase ja seetõttu topitakse äriloogika javasse/php'sse/.neti jne ... Sageli peitutakse põhjenduste taha nagu baasi koormuse vähendamine - see ajab juba naerma vaikselt. Sisuliselt võib paralleeli tõmmata Energia Jäävus Seadusega. Ega koormus ei kao kuhugi, see lihtsalt liigub ühest kohast teise. Selle asemel, et teha endale selgeks andmebaasi tööpõhimõtted ja elementaarsed tuunimise viisid, hakatakse kasutama haigusi nagu Hibernate, mingid eriti haiged Cachimise lahendused jne ... Lõppeb see asi kõik sellega(99.9% - 10a kogemused), et rakendus muutub ühel heal päeval täiesti haldamatuks. Esiteks ei suuda keegi sellest enam üle käia ning nõuded rakenduserveritele muutuvad jube kalliks. Veel arusaamatumad on näited, kus andmebaasi hoitakse puhtalt andmete hoidmiseks, isegi triggerid ja sequencid hoitakse baasist väljas ja emuleeritakse rak. serveris. Milleks kurat seda andmebaasi sinna üldse siis vaja on? Hoia oma datat failisüsteemis täielikult, milleks väga head lahendused turul olemas. Aga ei.

Siinkohal väga ei mõista su viha ORM toolide vastu. Kui need oleks kasutamatud siis keegi neid ei kasutaks, kuid reaalsus on see, et need on väga väga populaarsed tööriistad ja tõstavad arendajate produktiivust (eeldades, et arendajal mõistus käib ORMist üle, ega Hibernate pole väga lihtne riistapuu, on lihtsamaid ORMe ka olemas). Mälu kohta niipalju, et see pole enam kullahinnaga. Tõepoolest Java standard VMidega tekib mingilt maalt probleem kui heap kasvab üle mitmekümne GB aga siinkohal tuleb appi Azul Zing VM mis suudab scaleda mälukasutust kuni 512GB ilma stop the world pausideta, kui just rakendust ei peaks olema võimalik horisontaalselt scaleda.

serk kirjutas:

"et äriloogika viimine SQLi pole väga hea idee" - Äriloogika enamjaolt tähendab andmetega manipuleerimist ja andmebaas on selleks mõeldud. Ta on selleks optimeeritud ja ta teeb seda väga hästi. Java/.Neti/PHP kutid hakkavad kohe pasundama, et hoiame kokku network roundtrippe ning mälus saame kiiremini tehtud. Jah, aga hetkel kui töötluses saab mälu otsa kolitakse kiiresti baasi SQLide otsa. Absurd. Mitte ükski arendaja pole mulle suutnud veenvalt tõestada, miks on kasulik hoida domeeni mudelit äriloogikat mujal kui baasis - mitte keegi! Korduv argument on see, et see on mugavam ja et "mul pole baasi kogemusi".

Huvitav siis mis keeles arendaja seda ei väidaks? Ja ega väga ei saa oodata arendaja poolt sügavaid DBA teadmisi ja pealegi ORMi kasutamine on kiirem ja vajab vähem koodi kirjutamist kui käsitsi queryde kirjutamist ja nende executemist baasi vastu. Samahea oleks .NET/Java asemel hakata rakendusserverit kirjutama kuskil low level keeles ala C, kuna see sööb vähem mälu. GL projektijuhile deadline teatamisest.

serk kirjutas:

Multi SQL Dialect - ei tööta see asi. Mitte ükski portimine ei tööta niisama, vähemalt mitte Enterprise tasemel rakendustes. Ei ole võimalik isegi teatud juhtudel sama baasi upgradei teha ilma tõsiste muudatusteta, rääkimata liikumisest Oraclelt Postgre peale, või Oraclelt MySQLi peale ja vice versa.

Isiklikult olen ilma suurema vaevata Hibernates Postgre pealt MSSQLi peale kolinud. Entity mappingutes oli vaja sisse viia minimaalselt muudatusi ala sequencid vahetada identity vastu.

serk kirjutas:

"Ma pole ise kunagi äriloogikat vägistanud stored procidesse ja pole ka ühtegi enterprise rakendust siiamaani näinud mis seda teeks" - Kõik Enterprise lahendused hoiavadki äriloogikat baasis või täiesti eraldiseisvas vahekihis(mida mina pole siin mandril veel kohanud, küll Skandinaavia pool). Seal ei olegi muud võimalust. Iga äriloogiline samm mis lisatakse väljapoole baasi tõstab oluliselt rak. serverite mäluvajadust ning mõjutab otseselt UI toimist. Kokkuvõttes ja pikas pespektiivis on odavam hoida äriloogikat andmebaasis ja jätta UI nii lihtsaks kui vähegi võimalik. Elu on näidanud, et äri tahab ca 4-5a tagant UI sisulist ringikirjutamist. Palju õnne, kui enamus äriloogikast on viidud lõppkihti.

Siinkohal ei väitnud, et äriloogika tuleks ilmtingimata UIga samase rakendusse väänata, tänapäeval on väga populaarne 3-tier arhitektuur http://en.wikipedia.org/wiki/Multitier_architecture#Three-tier_architecture, sellejaoks on igasugu vidinaid (SOA, ESB, etc.), et seda efektiivselt saavutada.

Ma vist väljendasin ennast kehvasti. Ma pidasin "enterprise" all silmas enterprise suunitlusega tarkvara. Firmad mis ehitavad tooteid enterprise kasutuseks nagu MS, Atlassian, HP, etc... Tooted mida peavad kolmandad osapooled installima. Paljudel nendel toodetel on rohkem kui 1 DB valik ja siinkohal tulevadki ORMid mängu.
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 12.01.2013 22:02:03 vasta tsitaadiga

"Ja ega väga ei saa oodata arendaja poolt sügavaid DBA teadmisi ja pealegi ORMi kasutamine on kiirem ja vajab vähem koodi kirjutamist kui käsitsi queryde kirjutamist ja nende executemist baasi vastu. "

Nagu ennist ütlesin, et see tüüp vastus Java arendajate poolt.
Tõstavad arendajate produktiivsust? Suhteline. Neid inimesi kes näiteks Hibernatei tõesti hästi tunnevad, on ikka väga vähe. Varem või hiljem juhtub mingi jama kas transkatsioonidega või performanciga ja sinna hakatakse päris tõsiselt aega ja ressurssi toppima. Lisaks on Hibernateis vähegi keerukamat äriloogikat täiesti võimatu rakendada. Mul on läbi ajaloo kümneid ja kümneid programme, kus algselt on tehtud ilus domeeni mudel javasse ja ühel hetkel kui asi on üle käte läinud, loodud kõrvale NativeSQLid. Ehk kokku on keeratud täiesti mõttetu kompott. Ühelt poolt on mega mölakas entity mapping, mida üks kurat ei julge enam muuta ja teisalt on kõrval NativeSQLide laadung. Kuna ma tean milleks on tänapäeva andmebaasid võimelised, siis seetõttu olen ka väga kriitiline.

SOA on tore ja kahe käega poolt. Tubli!
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
i485729
HV vaatleja
i485729

liitunud: 05.01.2013




sõnum 13.01.2013 14:35:11 vasta tsitaadiga

serk kirjutas:
"Ja ega väga ei saa oodata arendaja poolt sügavaid DBA teadmisi ja pealegi ORMi kasutamine on kiirem ja vajab vähem koodi kirjutamist kui käsitsi queryde kirjutamist ja nende executemist baasi vastu. "

Nagu ennist ütlesin, et see tüüp vastus Java arendajate poolt.
Tõstavad arendajate produktiivsust? Suhteline. !


Harjumusi tarkvara arendamisel on erinevaid. Pahatihti taandub kõik rohkem harjumuste või ka arendusettevõtte muude majandushuvide (soodsad litsentsid, odavam tööjõud, tootmismudel jne) taha. Samuti on kliendil pahatihti suurem huvi nähtava ja katsutava vastu, kui selle vastu, milline on allolev andmebaas ja sellega seonduv. Alles peale seda kui klient on korra läbi elanud põrgu, mis tuleneb probleemidest, et andmebaas pole lihtsalt ristkasutatav, hakatakse ka andmekihi vastu tõsisemat huvi tundma. Paraku on selleks ajaks suur hulk raha ära kulutatud ja tulemuseks on mingi veider kemüüse/lapitekk.

Näiteks osades arendustes loovad ka andmebaasi just needsamad UI arendajad, kelledel sügavaid DB teadmisi pole, nii tuleneb ka andmebaasi arhitektuur UI/ärikihi loomise käigus tekkinud vajadustest, mille tulemusena on enamik modernseid võimalusi lihtsalt kasutamata. Õnnega koos on need, kus projekti arendusse on kaasatud hea andmebaasi guru, kes loob UI arendajatele andmebaasi vahenditega nö API. Viimase lähenemise plussiks on, et väga kerge on hiljem luua kõrvale uusi rakendusi, mistahes tehnoloogial ja tehnoloogiatele.

Võtame reaalse näite ärivajadusest. Toon lihtsustatud näite. Müüakse pileteid. Igal pileti müügil peab minema % kliendi boonuskontole, fikseeritud summa erimaksuks, jne. Kõik see on ehitatud väljapoole andmebaasi, mingisse ärikihti. Pole mingit probleemi, kuna piletimüügiks on ainult üks lahendus. Nüüd kui ettevõtte laieneb, on vaja mobiilsete seadmete jaoks müügikioskeid, samuti mooduleid, mis on integreeritavad kolmandate osapoolte süsteemidesse. Nüüd ollaksegi lõhkise küna ees, sest ärikiht pole kasutatav uutes lahendustes. Oleks asi lahendatud andmebaasis, siis taolist vastuolu ei tekiks.

Asja point on selles, et tänaseks on andmebaasisüsteemidesse sisse ehitatud võimalused, mida omal ajal polnud. Kuna varem selliseid võimalusi polnud, arendati ka nö tugevat ärikihti, mis toimetas UI ja andmebaasi vahel. Tänaseks saab kõik andmete manipuleerimisega seonduva teha ära andmebaasis, sest seal on olemas kõik vajalikud tööriistad juba. Ehk siis kokkuvõtteks, moodsad andmebaasisüsteemid ongi juba 2in1 lahendused (andmed + äriloogika). Selline väga unine pühapäevane mõlgutus minu poolt siia teemasse icon_wink.gif
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 14.01.2013 13:05:48 vasta tsitaadiga

Viskaks oma kaks senti ka siia üldteoreetilisse arutellu, mille võiks ilmselt praegu juba eraldi alateemasse tõsta võrreldes esialgse küsimusega. icon_smile.gif

Ilmselt ei saa mind lugeda küll mingis tohutult kogenud veebiarendajaks ning samuti tuleb tõdeda mu erialase hariduse puudulikkust (kuigi natuke sai ikka akadeemilist IT-d ka nuusutatud oma stuudiumi jooksul vabaainete formaadis).

Enda arvamused teemal "äriloogika baasis" jõudsid igatahes selle nelja aasta jooksul, mil ma ühes Eesti suuremas tarkvarafirmas rügasin, seinast seina ära käia.. Samuti võis näha suhtumise muutusi ajas ja erinevate meeskondade vahel, kus oli võimalus töötada. Praegu mulle igatahes tundub selgelt, et tihti on äriloogika baasi tõstmine täiesti õigustatud ja probleem, miks see tihti ilmselt arendajatele vastukarva on (ja ma ise olen seda ka mingitel hetkedel tundnud), on ilmselt tingitud pigem sellest, et see nõuab ühe täiendava kompetentsi suhteliselt heal tasemel valdamist lisaks oma põhikeelele. PL/SQL tõepoolest nõuab mõnevõrra teistsugust ajuehitust ja mõningast harjumist, kui aastaid on ainult Javat söögi alla ja peale toodetud.

Vastuseks siin YberCyruse väidetule võin oma kogemusest öelda, et olen vähemalt kahte Eesti mõistes väga suurt süsteemi näinud, kus arvestatav osa oluliselt äriloogikast elas Oracle otsas. Osaliselt räägiti mõlemal juhul põhjustena muuhulgas ka sellest, et kunagi ammusel aal on Oracle võlurid organisatsiooni tekkinud ja asja üles ehitanud ja nüüd läheb vanast inertsist.. (sealjuures humoreskina võib mainida, et ühes organisatsioonis oli selleks võluriks vanem naisterahvas klassikalise Eesti nimega, mida omistaks ainult sokki kuduvatele vanaemadele...) Samas ühes organisatsioonis oli selgeks plussiks sellel süsteemil ka see, et seal otsas tõesti istus kaks erinevat komplekti rakendusi, nagu ka i485729 siin välja toonud on - avalikud veebirakendused kodanikele ja majasisesed ametnikurakendused. Kogu loogika dubleerimine oleks arvatavasti küll ainult ühe suure bugirägastiku tekitanud..

Oma viimases projektis sai ka iseenda peal loomkatse tehtud poolkogemata.. Oli kaks üsna sarnase sisuga tööülesannet mul ees, kus oli vaja baasis terve hunnik seoseid ära muuta objektide küljes (allüksuse liigutamine ühe vanemüksuse alt teise alla vms.) Esimese komponendi juures hakkasin otsast pihta andma ja üritasin kogu selle keemia Javas ära teha - tõmbad objektid baasist alla, muudad asjakohased väljad ära ja salvestad uuesti. Igavene kepp ja keberniit oli, et seda tööle saada.. Teisel sarnasel komponendil mõtlesin, et prooviks PL/SQL lähenemist asjale .. kirjutasin baasi ühe protseduuri mingi kahe või kolme sisendiga, sisuks hunnik insert/update/delete kraami.. ja kõik läks märksa valutumalt. Ehk siis nagu eelpool korduvalt on mainitnud - Hibernate ja muud ORM-id on mänguprojektide jaoks täitsa head.. aga kui on vaja tõsisemaid andmeoperatsioone teha, siis lähed ikka halliks seal otsas ja hakkavad igasugu toredad asjad sulle jalga tulistama ühest ja teisest suunast.

Ja üks asi, mida ma olen õppinud armastama, on view'de kasutamine.. taaskord on märksa mõnusam kirjutada rõvedalt keerulise päringu asemel baasi poolele üks view ja Javast selle poole lihtsa "select *" päringuga pöörduda, kui sedasama päringut Javas kokku vägistada. Triggeritega ajalootabelite hoidmine jms teema on ka täitsa mõnus ja mugav.

Sai nüüd natuke laialivalguv see jutuke.. aga välja tahtis ta minust tulla.

PS. praegu ei tegele enam programmeerimisega põhitööna, aga üks väike projektike jäi jälle ette.. esimese asjana kirjutasin baasile view, millest oma andmed kätte saada, kuigi kasutatavad arendusvahendid lubasid otse baasi pealt mulle kohe ORM mappingud genereerida ja muud roosamannat.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 14.01.2013 13:27:45 vasta tsitaadiga

Mina pooldaks samuti võimalusel äriloogika baasis hoidmist kuigi paljud vaidelvad sellele vastu põhjendusega, et see seob rakenduse ühe konkreetse baasi külge. Samas suurtes organistatsioonides võivad põhjused miks asju üht- või teistmoodi tehakse hoopis teistsugused olla.
Spoiler Spoiler Spoiler
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 14.01.2013 15:50:36 vasta tsitaadiga

Pean ka sõna sisse ütlema. Äriloogika asukoht võiks eelkõige sõltuda ikkagi rakenduse tüübist, vajaminevast funktsionaalsusest, hallatavuse nõudest ning tuhandetest teistest muutujatest. Üheselt ei saa öelda, "pane äriloogika baasi või go home". Kui kogu "loogika" on mingi keeruline formula mis pannakse 10st eri tükist vastavalt muutujale kokku ning mis ühel hetkel tahab ka baasist andmeid saada - no ei hakka ju SP'd tegema selle jaoks. Võin välja tuua ühe süsteemi mida ma aasta aega tagasi tegin, kus andmebaas hoiab ainult tulemit. Kogu loogika pannakse dünaamiliselt domeenikihis kokku vastavalt kasutaja valitud komponentidele ning seadetele. Kuna kasutajal peab olema võimalus ka valemeid muuta on the fly, siis kiiremalt ja lihtsamalt sai see tehtud CSharpCodeProvideriga kui oleks andmebaasis oleva loogikaga ettegi suutnud kujutada.

Mitte ükski asi tarkvaraarenduses ei ole must ega valge. Kõik sõltub vajaminevast lahendusest. Arendajad teevad lahendusi. Programmeerijad kirjutavad ainult koodi ja ei mõtle kuidas kõige mõttekam oleks vajadusele läheneda. Vahest on parem kui loogika istub baasis, vahest kui istub rakenduses. Ning vahetevahel juhtub ka nii, et kasutada tuleb mõlemat. Ei ole ühte ja õiget lahendust. Jah, ka harjumus tuleb mängu, aga lõpptulemuse huvides tuleb aeg-ajalt harjumustest üle vaadata ja teha nii, kuidas parem on.

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  MySql query
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.