Portál AbcLinuxu, 9. května 2025 23:31

Dotaz: Detekce neexistence zaznamu v poli

5.8.2006 20:16 Crempa
Detekce neexistence zaznamu v poli
Přečteno: 51×
Odpovědět | Admin
Zdravim, mam nasledujici problem... mam pole s MAC adresami a v databazi tabulku kde jeden sloupec obsahuje taktez MAC adresy. No a potreboval bych u zaznamu v databazi jejichz MAC adresa nema protejska v tom poli (nevyskytuje se v tom poli) nastavit priznak (v jinem sloupci) rekneme na 0. Pole taktez muze obsahovat adresy, ktere v databazi nejsou a ty by se meli pridat. Napadlo me nekolik cest

1) pro kazdou polozku z databaze projit cele pole a pokud se v nem adresa nevyskytuje nastavit priznak (to me prijde jako silne pomale a nevhodne reseni)

2) v databazi nastavit vsechny priznaky na 0 a postupne prochazet pole s tim ze budu nastavovat priznaky na 1 (ty co zbudou s 0 nemaji v poli protejska) (u teto metody me zas prijde ze se prilis zatezuje databazi)

3) vytvorit z pole nejakopu temp tabulku a problem resit na urovni databaze (napriklad pomoci procedur a kursoru - v teto oblasti se vsak zas tak neorientuju)

Takze se ptam, jak by jste to resily Vy? Diky za reakce

ps: konkretne se jedna o pole objektu takze napriklad napad prevest tabulku na pole a pote provest rozdil poli bude tezko fungovat, mimoto potrebuji krome stavu updatovat i dalsi informace, mluvime o tabulce s cca 1000 zaznamy...
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

bazil avatar 5.8.2006 21:48 bazil | skóre: 33 | blog: sluje | Miroslav
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Odpovědět | | Sbalit | Link | Blokovat | Admin
a bylo by dobré uvést o jakou databázi se jedná a v jakém jazyku se to má provést ...
5.8.2006 22:02 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Odpovědět | | Sbalit | Link | Blokovat | Admin
Optimální řešení bude záležet na tom, jak velká je ta tabulka v databázi, kolik je položek v tom poli, jak rychlá je komunikace s tou databází a jestli je to pole seřazené (nebo oindexované). Např. pokud je to pole seřazené a na tabulce máte index, dá se to triviálně udělat v čase lineárním vůči maximu z velikostí těch dvou.
5.8.2006 22:06 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud je ta databáze SQL, potom se mi to třetí řešení jeví jako nejrozumnější. Jenom to bude vyžadovat se naučit procedurální jazyk té které databáze.
When your hammer is C++, everything begins to look like a thumb.
5.8.2006 22:17 Tunop
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nechtel jsem ten dotaz zatezovat konkretni technologii, ale jedna se o PHP a MySQL takze nelze pocitat s zadnymi vyspelejsimi funkcemi. MySQL je tedy ve v5.xxx takze procedury zvladat bude. Kazdopadne zas nevim jestli je to posledni reseni uplne 100% protoze pole bude vetsinou obsahovat vetsinu polozek te databaze takze pro kazdy pruchod by bylo nutne vlozit najednou celou novou tabulku...
bazil avatar 5.8.2006 23:27 bazil | skóre: 33 | blog: sluje | Miroslav
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
tak v tom pripade bych pouzil zpusob 2, oindexoval bych si v DB pole z MAC(nevim jestli je kuli vasemu reseni potreba pokazde nastavovat vsechny priznaky u mac na 0(UPDATE macadresy SET priznak=0), ale pripadne bych to nastavil, zaroven pro celou DB to bude chvilka) a potom bych updatoval jednotlive mac z DB(diky indexaci to bude co nejrychlejsi) a pripadne nastavil 1 pokud se nalezne(na tohle by bylo dobre pouzit neco jako UPDATE macadresy SET priznak=1 WHERE mac='00:00:00:00:00:00') a pak bych si jeste zaroven v php zjistoval jestli bylo neco updatovano mysql_affected_rows() a kdyz ne, tak bych si bud pridal v tom obektu jeste jedno pole, kde by byly oznaceny mac adresy, ktere je potreba potom pridat a nebo raci bych si vytvoril nove pole obektu, kde se ulozi jen ty mac adresy, ktere je potreba pridat.
5.8.2006 23:48 Tunop
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Tak presne to co popisujete me prijde prozatim taktez jako nejlepsi reseni. Jedine ceho se trosku obavam je ten pruchod polem o cca 1000 polozkach a v ramci kazdeho pruchodu bude realizovan ten UPDATE. Defacto jsem nikdy v cyklu takhle s databazi nekomunikoval takze nevim zda je to vhodne (zatizeni apod.)...
bazil avatar 5.8.2006 23:57 bazil | skóre: 33 | blog: sluje | Miroslav
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
verte tomu, ze na takhle malou DB a jednoduchy dotaz to mysql zvladne fpohode, zvlada i daleko vice polozek (radove 10 000) z jednoduchymi dotazy hodne rychle, ale to uz se potom nemuzou delat nejake krizove dotazy a tak, coz u vas nehrozi
6.8.2006 00:08 Tunop
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
OK, diky za informace Ono vzhledem k tomu ze ten script bude spousten pouze cronem v intervalu radove desitek minut tak je zde urcita casova rezerva na jeho vykonani :) Jde me spise o vhodnost takoveho reseni.
bazil avatar 6.8.2006 00:12 bazil | skóre: 33 | blog: sluje | Miroslav
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
ono se asi nijak jinak poradne neda prochazet jinak pole a tabulku a porovnavat je ... jeste me napada vytvorit z toho pole tmp tabulku a potom to vyresit nejak pomoci procedur a tak, ale vubec nevim jak ;-)
6.8.2006 00:24 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Proč by se nedalo? Jenže jak jsem napsal hned na začátku, informace nejsou dostatečné pro uspokojivou odpověď. Ono je to něco jiného, přeženu-li to trochu, pokud máte v tabulce deset položek a v poli milion, a něco úplně jiného, pokud jich máte v tabulce milion a v poli deset.
6.8.2006 00:27 Tunop
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Mate pravdu, mel jsem hned na zacatku uvest ze v poli bude obsazena temer cela tabulka a tak bude jejich rozdil minimalni...
6.8.2006 00:53 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
V tom případě bych (bude-li položek trochu větší množství) asi dal přednost řešení, že budu procházet paralelně tabulku i pole vzestupně (v dotazu se použije order by, pole si seřadím nebo oindexuji). Při tomto postupu není problém označit správně položky tabulky a bude na to stačit jeden průchod (nepočítám-li vyhledávání položky, které bude muset provádět databáze při jednotlivých updatech).
bazil avatar 6.8.2006 00:31 bazil | skóre: 33 | blog: sluje | Miroslav
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
a tak samozrejme ze da ;-) ale je to "trosicku" narocnejsi :-)
6.8.2006 10:04 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Detekce neexistence zaznamu v poli
Odpovědět | | Sbalit | Link | Blokovat | Admin
Těžko říct, které řešení je nejlepší, ale jestliže očekáváte cca 1000 záznamů, tak se všecho vejde do paměti a život je hned veselejší. Jen pro představu o rychlosti - když to otestuju na 10000 položkách tímto programem
#!/usr/bin/env python
v_databazi = range(10000)
v_poli = {}
v_poli = v_poli.fromkeys(range(8000))
neni_v_poli = [x for x in v_databazi if not v_poli.has_key(x)]
print sorted(neni_v_poli)
tak to běží cca 80 milisekund včetně generování testovacích dat a tisku výsledků. Krom toho, 50 milisekund sežere samotný start interpretu, takže bych se s rychlostí vůbec netrápil.
V tomto případě jsem do pole vrazil čísla 0-7999 a do "databáze" 0-9999. Výsledkem jsou čísla 8000-9999. Pro vyhledávání používám asociativní pole.
Pro jistotu jsem vyzkoušel ještě jeden milión (plus osm set tisíc) záznamů. Zde už je patrná nenažranost řešení, ale vejdu se pod sekundu a půl.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.