Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
02.09.2010 21:54:04
MySQLi optimeerimine |
|
|
On 4 tabelit:
1) recipe_recipes (recipe_id, recipe_name, ...)
2) recipe_ingredients (ingredient_id, ingredient_price, ...) ingredient_price ehk hind on ühe ühiku kohta
3) recipe_ingredient_mapping (map_recipe, map_ingredient, map_quanitity)
4) recipe_related_recipes (related_parent, related_child, related_required)
Ühesõnaga on komponentide tabel, igal komponendil oma hind. Siis on retseptide tabel, igal retseptil nimi ja muud andmeid. Iga retsept koosneb kindlast arvust ja kindla kogusega komponentides. Igal retseptil võib olla seotud retsept, mis on kas nõutud (related_required = 1) või valikuline. Mul on vaja saada kõik retsepti andmed ning kogu retsepti hind.
Hind = SUM(iga retsepti komponendi hind * komponendi kogus) + SUM(iga seotud ja nõutud retsepti hind).
Ise tulin sellise lahendusega lagedale, aga äkki keegi oskab paremini:
sql:
|
SELECT r.*, ROUND(SUM(m.map_quantity * i.ingredient_price), 2) AS hind FROM recipe_recipes r JOIN ( SELECT recipe_id AS id, recipe_id AS osa FROM recipe_recipes UNION SELECT related_parent AS ID, related_child AS osa FROM recipe_related_recipes WHERE related_required = 1 ) AS s ON s.id = r.recipe_id JOIN recipe_ingredient_mapping m ON s.osa = m.map_recipe JOIN recipe_ingredients i ON i.ingredient_id = m.map_ingredient WHERE r.recipe_id = 132
|
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
03.09.2010 13:32:49
Re: MySQLi optimeerimine |
|
|
See päring on praegu kujul:
(ema + lapsed) X MuudHulgad
|
Saaks ilmselt ka nii teha päringu:
(ema X MuudHulgad) + (Lapsed X Muudhulgad)
|
Kui MySql-is on mingi võimalus päringute kiirusi võrrelda ("EXPLAIN PLAN" klausel vms), siis võiksid võrrelda nende variandi töökiirust.
Juhul kui sul alam/osa -retseptidel võib ka olla allüksusi, siis su päring neid ei arvesta. MySql-is pole vist veel tehtud "hierarhiliste päringute" funktsionaalsust (oracle CONNECT-BY klausel). mis võimaldaks puu-kujulisi andmeid läbida lõpmatu sügavuseni, seega tuleks MySql-is puukeste läbimiseks mingeid muid võtteid kasutada, aga seda siis ainult juhul kui sul saab alam-retseprilt olla omakorda alamaid.
Kas sinna päringusse "Group By" klauslit pole vaja lisada, kui päring väljastab veeru agregaat-funktsiooniga SUM?
Võiks proovida ka nii, et kas perfoomans muutub sellest kui "(ema + lapsed)" hulgakesse lisada filtrid sisse, ala nii:
(ema + lapsed, filtreeri) X MuudHulgad, filtreeri;
|
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
06.09.2010 14:47:02
|
|
|
GROUP BY oli tõesti puudu.
MYSQLil on olemas EXPLAIN käsk, aga see midagi kasulikku (mulle) ei ütlenud, siis kasutasin kiiruse võrdlemiseks lihtsalt kogu tabeli küsimist ja vaatasin, kaua aega läheb.
(ema X MuudHulgad) + (Lapsed X Muudhulgad) oli tõesti kiirem, aga parima tulemuse sain hoopis alampäringuga:
sql:
|
SELECT r.*, ( SELECT ROUND(SUM(m.map_quantity * i.ingredient_price), 2) FROM ( SELECT recipe_id AS id, recipe_id AS osa FROM recipe_recipes UNION SELECT related_parent AS id, related_child AS osa FROM recipe_related_recipes WHERE related_required = 1 ) AS s JOIN recipe_ingredient_mapping m ON s.osa = m.map_recipe JOIN recipe_ingredients i ON i.ingredient_id = m.map_ingredient WHERE s.id = r.recipe_id ) AS hind FROM recipe_recipes r
|
Alamretseptidel enam alamaid ei ole, sellega pole probleemi.
Tänud igatahes, teema minu poolt ammendatud.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
serk
HV kasutaja
liitunud: 24.05.2003
|
07.09.2010 21:32:01
|
|
|
Mõned vead:
Kõige hullem asi mida sa SQLi kirjutades teha saad on kasutada funktsiooni andmete toomiseks või siis sinu puhul siis select selecti sees - see on kõige aeglasem ja baasi koormavam viis üldse.
Explain Plan on arendaja parem käsi, õpi selgeks! Ma ei kujuta ette, kuidas ilma selleta üldse normaalseid päringuid kirjutada võimalik on ...
Ei tea küll mis MySQLi versiooni kasutad, kuid minu teada on MySQLis juba kasutusel Oraclega sarnasd analüütilised funktsioonid ja juba üsna pikka aega - väga võimsad vahendid päringute muutmiseks tunduvalt kiiremaks, jällegi, vii kurssi ennast nendega.
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
07.09.2010 23:48:16
|
|
|
serk kirjutas: |
MySQLis juba kasutusel Oraclega sarnasd analüütilised funktsioonid ja juba üsna pikka aega |
Keegi võiks üle googeldada selle väite, ja siia teada anda, võtaks teadmiseks ka ise. Ise googeldasin vaid hierarhiliste päringute tuge MySql-i kohta ja mäletan, et googli vastsed andsid mõista, et tugi puudub. Analüütiliste funktsioonide toe googeldamist pole veel jõudnud teha.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
08.09.2010 01:02:19
|
|
|
MySQL versioon 5.1.36.
Uurisin natuke. Esimese postituse päring, kui kõik read küsida, (WHERE lõpust ära ja Group BY asemele) on 9 korda aeglasem kui minu järgmise postituse päring (phpMyAdmini näidatud aja põhjal). Põhjuseks oli "Copying to tmp table", millele kulus esimese päringu korral 90% ajast. Seega jääb õhku küsimus, et kas ikka on esimene päring parem (kui jah, siis miks)?
Mis puutub analüütilistesse funktsioonidesse, siis ma sain aru, et neid MySQLis ei ole, aga neid saab emuleerida. Samas ei näe, kuidas see peaks mind aitama.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
08.09.2010 10:38:25
|
|
|
estrose kirjutas: |
serk kirjutas: |
MySQLis juba kasutusel Oraclega sarnasd analüütilised funktsioonid ja juba üsna pikka aega |
Keegi võiks üle googeldada selle väite, ja siia teada anda, võtaks teadmiseks ka ise. Ise googeldasin vaid hierarhiliste päringute tuge MySql-i kohta ja mäletan, et googli vastsed andsid mõista, et tugi puudub. Analüütiliste funktsioonide toe googeldamist pole veel jõudnud teha. |
--
Ongi ka Mysql'is olemas a-f-ide tugi:
http://onlamp.com/pub/a/mysql/2007/03/29/emulating-analytic-aka-ranking-functions-with-mysql.html?page=2
Enne OVER-klauslit kirjutatud funktsioon on analüütiline, ja andmebaasi mootoris on implementeeritud sedalaadi f-ioonide käitamine omat moodi, erinevamalt kui seda group-by-gaseotud agregaat funktsioonid töötavad. See erinev implementatsioon võib olla kiirem küll, võiks testida siis üle.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
13.09.2010 23:48:32
|
|
|
Antud lehel peab jälgima, millal räägitakse MySQL-ist ja millal muust. MySQLil ei ole OVER-klauslit. Pealegi sain ma aru, et analüütilised funktsioonid on mõeldud selleks, et GROUP BY-d kasutades ei läheks infot kaduma. Mul seda probleemi pole.
Väike teemavahetus. Kui komponentide (ingredient) hinda muuta, siis peaksid vanad hinnad ka alles jääma. Tegin uue tabeli hinnad veergudega komponent, hind, kuupäev (tegelikkuses pole pealkirjad päris samad). Komponentide tabelisse jätsin hinna veeru alles. Kui kasutaja komponendi hinda muudab, siis lisan uue hinna hindade tabelisse kuupäevaga ja muudan komponentide tabelis ka. Aga kuidas käituda, kui kasutaja soovib mitut hinda korraga muuta. Kas lihtsalt iga komponendi korral 2 päringut (lisada uus hind hindade tabelisse ja muuta hind komponentide tabelis) või teha midagi, mis nõuaks vähem päringuid.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
14.09.2010 11:47:20
|
|
|
Timukas0 kirjutas: |
Aga kuidas käituda, kui kasutaja soovib mitut hinda korraga muuta. Kas lihtsalt iga komponendi korral 2 päringut (lisada uus hind hindade tabelisse ja muuta hind komponentide tabelis) või teha midagi, mis nõuaks vähem päringuid. |
Sul on sisuliselt kaks tabelit: Toode (ID, Hind) ja Tooteajalugu (TooteID, Kuupäev, Hind). Mis selles muidu halba on, et kaks Salvestamist tehakse? See maha salvestamine Süsteemi ju ei koorma peaaegu üldse, aga andmete küsimine suurest ajaloo-tabelist on aeglane tegevus, sellepeale võiksid mõelda, kuidas selle tabeli poole pöördumist kiirendada. Ja andmebaasile mingeid trigereid ehk sündmusehaldureid ära lisa, tee ilma nendeta ikka.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
14.09.2010 12:24:01
|
|
|
Ma just mõtlesin seda, kuidas PHPs andmebaasiga suhtlemine teha. Näiteks on kasutajal vaja 100 komponendi hinda muuta korraga. Kas teha php-ga kokku kokku 200 mysql_query-t (iga komponendi kohta 2), või siis näha vaeva ja vähendada vaja minevate päringute arvu.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
14.09.2010 12:51:38
|
|
|
Mul tekkis see küsimus, et kui juba sellist lahendust kasutatakse, kas siis ei oleks mõistlik hindade tabelisse tekitada veerud id, hind, kehtivuse_lopp ja komponentide tabelisse mitte hinda numbriliselt salvestada, vaid viidata kehtivale hinnale id kaudu? Andmete dubleerimine kahte tabelisse ei tundu hea mõte olevat andmebaasi disaini mõttes.
_________________ 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 |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
14.09.2010 14:29:24
|
|
|
MySql-is näib olema võimalik andmebaasi protseduure teha:
http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.html
siis sul võiks ju olla selline üks andmebaasi protseduur, mida välja kutsud:
protseduur SalvestaToode:
Salvesta Toode.
Salvesta TooteAjalugu.
|
Võib-olla oleks tõesti parem nii teha, et teed andmebaasi protseduuri, mis võtabki sisendiks ühe korraga kõik 100 asja, ei tea kas see oleks võimalik.
Toote põhiatribuudid ongi Hind ja Nimi, need peaks kindlasti asuma Toote tabelis. Andmete dubleerimine, agregeerimine üle andmebaasi on perfoomansi suhtes hea valik. Peamine näide on tuntud relatsioon ArvePäis ja ArveRead, kus tabelist ArveRead summeeritakse kokku ridade Summa ja salvestatakse tabelisse ArvePäis, veergu Summa, see on pea igas infosüsteemis nii, et agregeeritakse ja dubleeritakse, eesmärgiga, et hiljem kergem oleks andmed kätte saada. Kuid ma pole kunagi reaalselt näinud andmete dubleerimist turva-eesmärkidel. Ala, et panna isiku parool kahte tabelisse vms. OLen aga seda näinud ühe programmeerija proovitöös, kui ta kandideeris palgatööle.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
14.09.2010 20:47:47
|
|
|
Võtsin kasutaja Fukiku ideest kinni. Tabelil hinnad nüüd neli veergu: id (auto increment), komponendi_id, hind, kuupäev (current timestamp) ja komponentide tabelis on veerus `hind` vastava hinna id. Paljude komponentide muutmisele pakuks siis sellise lahenduse: php-ga teen umbes sellise päringu (kuupäev t:
sql:
|
INSERT INTO hinnad (komponent, hind) VALUES (1, 10), (2, 7), ...
|
Ja siis "kopeerin" hindade tabelist viimati lisatud komponentide id-d komponentide tabelisse:
sql:
|
UPDATE hinnad AS h1 LEFT JOIN hinnad AS h2 ON (h1.komponent = h2.komponent AND h1.kuupäev < h2.kuupäev) LEFT JOIN komponendid k ON h1.komponent = k.id SET k.hind = h1.id WHERE h2.komponent IS NULL
|
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
14.09.2010 22:05:00
|
|
|
Ma päeval vastasin umbropsu ja lühidalt. Seega, mis halvasti, see uuesti
Ühesõnaga, mina jätaks su hindade tabeli nii, nagu ma enne soovitasin (id, komponent_id, hind, kuupäev) ja komponentide tabelisse viidet hinnale üldse ei panekski.
Siis esiteks oleks hinna lisamine lihtsam, piisaks ainult insert lausest hindade tabelisse (komponent_id väärtust sa ju lisamisel tead, muud aga pole vaja).
Hinna pärimiseks sobiks midagi taolist:
sql:
|
SELECT h.* FROM hinnad AS h WHERE h.komponent_id = ? AND h.kuupaev = MAX(h.kuupaev)
|
NB! ei garanteeri päringu 100% töötavust, sest pole ühtegi mängubaasi hetkel võtta, kus katsetada.
Kokkuvõttes aga kõik lihtne ja elegantne ja ei pea tegema sellist keemiat, nagu sa eelmises postituses pakkusid, mille funktsioneerimises ma siiamaani päris kindel pole
_________________ 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 |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
15.09.2010 11:45:28
|
|
|
Tere,
Hiljem saab olema sellise lahendusega andmebaas aeglane.
Ajaloo tabel saab olema Süsteemi kõige aeglasem tabel, ja seda peaksite tee siis kogu aeg join-idesse lisama. Lisaks jääb veel arusaamatuks, kuidas andmebaasilt vastust saada, millise rea salvestamine andmebaasi vea andis.
MySql-is polegi kollektsioone vist, tuleb komaliste koostada stringide näol, kui on kollektsioonide vajadus. Ma soovitaks teha andmebaasi protseduuri, mis kollektsiooni sisendiks võtaks, ja väljastaks, missugune rida vea andis. Arvan, et see protseduur oleks kiire ja hiljem toote jooksva hinna pärimine oleks ka normaalne.
---
Võib-olla siiski ei tulegi aeglane lahendus, mida pakute siin! Andke siis kunagi utlevikus teada, kas perfoomants on okei! MySql-is saab ka partitsioneerida tabeleid, seda võiks ajaloo tabeli jaoks uurida.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
17.09.2010 23:10:05
|
|
|
Fukiku, sinu kood kahjuks ei tööta. Toimiks kas selline:
sql:
|
SELECT h1.* FROM retsept_hinnad h1 WHERE h1.kuup = (SELECT MAX(h2.kuup) FROM retsept_hinnad h2 WHERE h2.komponent = h1.komponent)
|
või see:
sql:
|
SELECT h1.* FROM retsept_hinnad AS h1 LEFT JOIN retsept_hinnad AS h2 ON (h1.komponent = h2.komponent AND h1.kuup < h2.kuup) WHERE h2.komponent IS NULL
|
Mõlemad võrdlemisi aeglased (primary key'd ei saa ka kasutada). Seega kasutaks kas hinna dubleerimist või primary key-ga JOINimist.
Lugesin nüüd läbi ühe varasem estrose postituse, mis enne kuidagi kahe silma vahele jäi ja hetkel eelistan hinda kahes tabelis hoida.
Veel tekkis küsimus, et kui oluline on vaja teada, milline rida täpselt vea andis? Muidu teeks lihtsalt nii, et kui päring ei õnnestu, siis nii ütlengi kasutajale. Pole ise sellist asja kohanud (samas pole ka suuri kogemusi), et kui kasutada näiteks mu eelmise postituse INSERT INTO päringut, siis osad andmed sisestatakse ja osad mitte.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
19.09.2010 21:00:16
|
|
|
Hinnaveeru selline dubleerimine on lühidalt öeldes "kiire aga hallatamatu" lahendus. Hallatamatu on ta selles osas et tuleb hallata, et dubleeritud andmed oleksid süngis, aga seda on raske tagada. Kiire on see lahendus, kuna tegu on eelarvutusega. Andmebaasi indeksid on eelarvutuslik ja dubleeriv nähtus, mis saamuti tekitab ohu, et see süngist välja läheb, kuid me ei pea indekseid kuigi palju ise haldama, andmebaasimootor teeb seda ise, indeks on korras kogu aeg. Kuid dubleeritud Hinnaveerge süngis hoida on raske, varem või hiljem miski juhtub ja ongi üks kahest väärtusest erinev. Niiet "kiire aga raskelt hallatav" asi on üldiselt see dubleerimine. Sedalaadi dubleerimise lahenduse juurde tuleks ilmselt alles siis tulla, kui kõik muud variandid on ära proovitud, ja tõepoolest perfoomansit muul traditsioonilisemal viisil parandada ei saa. Samas minuarust selline dubleerimise häkk tundub teoorias huvitavana, võiks proovida praktiliselt.
Kui mul oleks veebileht, kus oleks 100 tekstikasi, siis võiks ju öelda, millises tekstikastis on vale väärtus, kus ma ise neist 100 kastist selle vale üles oskaks leida.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
19.09.2010 22:36:09
|
|
|
Põhimõtteliselt ma ei dubleeri hinna veergu. Komponentide tabelis on hetke hind ja hindade ajaloo tabelis on hindade ajalugu. See, et mingi komponendi ajaloo tabeli viimane kirje kattub kattub hetke hinnaga on kokkusattumus :d. Jätab võimaluse kasutada ka selliseid hindu, mida pole vaja või ei tohiks ajaloo tabelisse salvestada (kuigi hetkel sellist funktsionaalsust vaja ei lähe).
tsitaat: |
Kui mul oleks veebileht, kus oleks 100 tekstikasi, siis võiks ju öelda, millises tekstikastis on vale väärtus, kus ma ise neist 100 kastist selle vale üles oskaks leida. |
Enne kontrollin PHP-ga need 100 kasti ikka üle. Kui mõni ei sobi, annan kasutajale teada. Alles siis käivitan päringu.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
20.09.2010 13:38:00
|
|
|
Toote käesoleva hinna jaoks võiks sobida selline päring:
sql:
|
SELECT * FROM hinnad WHERE HindKuni IS NULL AND TooteID=&&ID;
|
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Timukas0
HV kasutaja

liitunud: 20.03.2007
|
20.09.2010 15:15:46
|
|
|
Hindade ajaloo tabeli struktuur on selline
sql:
|
CREATE TABLE IF NOT EXISTS `retsept_hinnad` ( `komponent` int(11) NOT NULL, `hind` float NOT NULL, `kuup` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP )
|
Kuna hetkel puudub vajadus kasutajal ise aega määrata (à la eelmine kuu sel ajal oli selline hind), siis läheb lihtsalt hinna lisamise aeg andmebaasi.
Üldiselt olen tänu sellele teemale tunduvalt targemaks saanud. Edasi saan juba oma jõududega hakkama. Tänud aitajatele.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
27.09.2010 15:20:15
|
|
|
Foorumid ongi hea koht, kus saab programmeerimist õppida. Teine hea koht on töökoht, kus on hea mentor-töökaaslane, kellega lahenduste üle arutada, kuid sellist kaas-töötajat paljudes töökohtades ei leia.
--
Lisaks mõned aspektid andmete dubleerimise kohta, mida aastakümnetega välja kujunenud hea tava heaks ei kiida, aga mida siiski tehakse järgmiste põhjustega:
1. Kui juhtub olukord, et tabeli T üle ei taheta anda isikule S õigusi andmeid küsida, siis on üheks lahenduseks dubleerida andmeid andmebaasis, tuua/dubleerida veerg sinna tabelisse kuhu on ligipääs olemas.
2. Andmete küsimise operatsiooni perfoomansi tõstmine. Jääb ära kulukas join.
3. Andmebaasi tasemel andmete turvalisuse tagamine. Häkker ei saa muuta parooli-veergu niilihtsalt, kuna andmebaas takistab seda öeldes et see veerg on sõltuv ühest teisest dubleeritud veerust, referential integriti vms kaitseks andmemuudatust.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
serk
HV kasutaja
liitunud: 24.05.2003
|
28.09.2010 19:04:39
|
|
|
estrose kirjutas: |
1. Kui juhtub olukord, et tabeli T üle ei taheta anda isikule S õigusi andmeid küsida, siis on üheks lahenduseks dubleerida andmeid andmebaasis, tuua/dubleerida veerg sinna tabelisse kuhu on ligipääs olemas.
|
Andmeid ei lubata teatud tabelitest pärida kindlatel põhjustel. Pigem tuleks siinkohal selgeks saada põhjus, miks vastav operatsioon on näiteks dba või riskide poolt keelatud. Andmete dubleerimine on väga väga bad practice töö tabelites - tekivad kohe küsimused, et mis andmed on primaarsed, kuidas neid süngis hoida, kuidsa käituda migreerimisel, kui vaja ühest tabelist andmed kustutada jne ... lõputud jamad, mis teevad kokkuvõttes elu põrguks arendajal kes seda krdi kompotti hiljem sööma peab.
estrose kirjutas: |
2. Andmete küsimise operatsiooni perfoomansi tõstmine. Jääb ära kulukas join.
|
Aga paneme siis kõik andmed ühte tabelisse? Oracle võimaldab sul 1000 veergu panna. Peaks ju nagu piisama? Dubleerime kõik, kliendid, aadressid, arved jne ... Kui JOIN tekitab sinu andmemudelis probleeme, siis on sul midagi seal väga valesti või lihtsalt ei osata päringut kirjutada - sagedasem põhjus ...
estrose kirjutas: |
3. Andmebaasi tasemel andmete turvalisuse tagamine. Häkker ei saa muuta parooli-veergu niilihtsalt, kuna andmebaas takistab seda öeldes et see veerg on sõltuv ühest teisest dubleeritud veerust, referential integriti vms kaitseks andmemuudatust.
|
Kui häkkeril on otsene ligipääs sinu tabelitele, siis mida enam sa seal kaitsed? Umbes sama loogiline, kui et topime igale võimaliku kohale foreign key'd peale põhjendusega, et äkki häkker ei suuda siis delete lauseid kasutada... Kui soovimatu isik saab ligipääsu baasile, siis on anyway pees ...
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
28.09.2010 20:31:49
|
|
|
Ja veel ka neljas põhjus:
4. Andmebaasi peale ehitatud tarkvara on piirangutega, mis teeb dubleerimise ainuvõimalikuks lahenduseks.
Seega 4 juba, üritan veel siia tuua neid.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
28.09.2010 21:26:22
|
|
|
estrose kirjutas: |
Ja veel ka neljas põhjus:
4. Andmebaasi peale ehitatud tarkvara on piirangutega, mis teeb dubleerimise ainuvõimalikuks lahenduseks.
Seega 4 juba, üritan veel siia tuua neid. |
Siis on üldjuhul ikkagi probleemiks kehv arhitektuuriga tarkvara ja/või kehv andmemudel - andmete dubleerimist õigustada infosüsteemi suutmatusega on ka nagu naljakas. Minumeelest peaks iga tõsiselt võetava infosüsteemi andmemudel olema A ja O, mille järgi ehitatakse rakendus, mitte vastupidi.
_________________ 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 |
|
 |
Le Inc
HV Guru

liitunud: 06.09.2002
|
04.10.2010 13:57:12
|
|
|
Pole küll MySQL aga Oracle (sarnased ).
Miks peale oracle service restarti suurest tabelist lugemise kiirus (select * from) langeb ~11 sekilt ~2 sekile? See on muidugi tore, aga küss selles miks ta päeva jooksul jälle 11 sekile maandub? Kas asi on mingites indeksites vms? Kuidas saaks asja "jäädavaks" teha. Ehk mõni spets teab.
|
|
Kommentaarid: 56 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
54 |
|
tagasi üles |
|
 |
|