1 (edited by zygis 2009-03-25 22:13:44)

Topic: duomenu struktura

tai va toks reikalas. saugau itemus vienoje lenteleje, o duomenis apie juos kitoje. grubiai kazkas panasaus:

itemai
--------------------
|  id     |   name  |
---------------------

values:
-----------------------------
| item_id |  name |  value  |
-----------------------------

stuktura nejautri duomenu kiekiui (vieno itemo), lengva pasiimti duomenis ir juos irasyti, bet kai prasideda listinimas, bei searchas, tada jau uzklausos tampa nesveikos. va vakar rasiausi uzklausa su 6 LEFT JOIN (joinini ta pacia lentele), nes reikia pasiimti tam tikrus duomenis is values lenteles ir pagal juos daryti ORDER BY.
viskas kaip ir veikia, bet idomu kokia dar struktura butu galima pritaikyt....

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: duomenu struktura

tai niekas kokiu minciu nemestels? ar ju tiesiog nera?

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: duomenu struktura

Tai labai sunku ką nors bandyti pasiūlyti, kai tiek mažai info. Bendrai paėmus turima sturktūra yra gana paparasta.....

Bet....

a) turi būti pakankamai aiškūs uždaviniai, kurie keliami šitai posistemei, kad būtų galima pradėti kažką galvoti, nes dabar man žinoma, kad "reikia saugoti kažkokius itemus ir tarp jų kažką searchint ir rūšiuoti". Domina tokie dalykai, kaip kiekiai, skaitymų/ rašymų/atnaujinimų skaičių sąntykis, speficiniės užklausos, duomenų tipai;
b) kuo skiriasi "name" stulpeliai abiejuose lentose?
c) kokios konkrečios užklausos dabar naudojamos ir kuo jos blogos? Jeigu tik jų ilgis yra "blogai" tai čia tikrai nėra problema (-;

4 (edited by zygis 2009-03-26 14:20:23)

Re: duomenu struktura

jei konkreciai buvo daromas naujienu modulis:

skirtingos kategorijos turi redaguojamus ivedimo sablonus, pasirenki takim laukelis 1 --> text;  laukelis2--> select ir t.t.
kiek kokiu duomenu bus priskirta konkreciai naujienai, sunku isivaizduoti ir atspeti

duomenys butu kazkur tokie

1.     verslo naujiena nr1
2.     dar kita naujiena
3.     ir vel kazkokia naujiena

o jau values lenteleje vaziuoja:

1.  |  tekstas     |   kazkoks tekstukas
1.  |  data         |   kazkokia data
2.  |  laukelis    |  laukelio reiksme


ir t.t.    realiai lenteleje values.name  yra laukelio_id is sablonu, bet nesvarbu

paprastai stengiuosi i pagrindine lantele items  susideti visus duomenis pagal kuriuos reiks listinti, bet vos tik baigi viska, kaip taisykle susigalvoja uzsakovai, kad reikia palistinti pagal kazka kita. ir jei tas kazkas kitas yra lenteleje values prasideda burtai

ir gaunasi kazkas panasaus :

SELECT 
   itemai.*,
   info1.value AS kazkas1,
   info2.value AS kazkas2,
   info3.value AS kazkas3,
   COUNT(info4.value) AS atitikimas
FROM itemai

LEFT JOIN values AS info1 ON info1.item_id=itemai.id AND info1.name='kazkokia_reiksme'
LEFT JOIN values AS info2 ON info2.item_id=itemai.id AND info2.name='kazkokia_reiksme'
LEFT JOIN values AS info3 ON info3.item_id=itemai.id AND info3.name='kazkokia_reiksme'
LEFT JOIN values AS info4 ON info4.value LIKE '%search string%'

HAVING atitikimas>0
ORDER BY kazkas2 DESC,kazkas3 ASC

ir tokios uzklausos turi suktis su kiekvienu page_view
kaip ir viskas grazu, bet kai rasai 6 JOIN'a jau ir neramu darosi....

arteja dar CV duombazes programavimas, ten is vis daug bus panasiu atveju, tad ir susimasciau ties tokiu duomenu saugojimu....
o lenteliu kurti kiekvienam gyvenimo atvejui nesinori, juolab kol kas  2 val. gaunu nurodyma pakeisti laukelius  formu sablonuose :(

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: duomenu struktura

Tarkim struktūra yra gera, nes galiu tik spėlioti, kad čia turi eiti papildomi stulpeliai, o apie tipus ir indeksus niekas kol kas nežinoma.

Užklausos su daug JOIN'ų iš esmės nėr labai blogas dalykas. Tik šioje vietoje galbūt patarčiau pabandyti truputį kitokį kelią:
a) pasirašyti vieną užklausa su pavrsta pilna lentele (jeigu išeina visiem šablonam vieną) (paversta lentelė - PIVOT TABLE);
b) iš tos užklausos pasigaminti VIEW'ą;
c) turinį (content) ir peiškų rezultatus ieškoti būtent tame VIEW'e;

Re: duomenu struktura

tai del tipu ir indeksu:

items.id int primary_key
items.name varchar

values.id int          <------ cia kazkaip bijau deti indeksa (kazkuriam projekte kazkas negerai budavo, bet dabar neprisimenu kas ir kodel, todel ir bijau :) )
values.name varchar
values.value text

reiks pasiskaityt ir pamegint kaip siulai. bet cia kiek suprantu jau apsimokiau taip daryti su didesniais kiekiais informacijos?

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: duomenu struktura

Visada su didesniais kiekiais apsimoka pradėti skaičiuoti ir mąstyti (-; o su mažais kiekais, kurie nėra linkę didėti galima negaišti laiko, nes darbas bus brangesnis už naudą.

Kad liečia indeksą, tai man rodos jis ten turi būti tai tikrai, nes pagal jį yra atliekamas JOIN'as, ir be indekso MySQL'as yra priverstas skanuoti visą lentelę (-; Taip pat indeksas reikalingas ir ant name lauko, nes pagal jį taip at atliekami sujungimo veiksmai. Daugiau tau padės EXPLAIN komanda.

8 (edited by zygis 2009-03-27 14:14:06)

Re: duomenu struktura

o nera taip, kad indeksus  po  update reikia atnaujinti. man rodos budavo toks reikalas, kad neistraukdavo irasu kurie budavo ka tik ikelti ar kazkas panasaus

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: duomenu struktura

zygis wrote:

o nera taip, kad indeksus  po  update reikia atnaujinti. man rodos budavo toks reikalas, kad neistraukdavo irasu kurie budavo ka tik ikelti ar kazkas panasaus

Indeksas yra papildoma struktūra, kurią, žinoma, reikia perskaičiuoti ir modifikuoti INSERT'ų ir tam tikrais atvejais UPDATE'ų metu. Skaičiuojant, kad sistemos INSERT'ų ir UPDATE'ų sąntykis su SELECT'ais yra labai mažas tai indeks'ų duodama nauda yra pakankamai didelė.

Neištraukti įrašų, kurie buvo katik įkelti gali galbūt tais atvejais, kai serveris yra apkrautas ir naudojama INSERT DELAYED struktūra, kada įrašai rašomi/modifikuojami tada, kai sistema nėra apkrauta.

Re: duomenu struktura

aisku, aciu uz konsultacija

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: duomenu struktura

Klausimas ne labai į temą, bet ar įmanoma uždrausti naudoti INSERT DELAYED struktūrą?

Pavyzdžiui norint testavimo tikslais užkišti random duomenimis. prasukus ciklą 30sec kartais mysql'as "dirba" iki 20+ min (dažniausiai baigiu su kill mysql, nes atsibosta laukti :) ) ram yra 3gb, o hdd lemputė dega tik su labai dideliais tarpais, cpu naudoja kaip didelis (~49%). phpMyAdmin nebedirba :(

Taip pat negerai būna, kai insert'e būna naudojami duomenys iš prieš tai gautų select'ų.

p.s. gal žinai kaip liepti lampp'ui naudoti abu branduolius ne tik 1?