Minutový záznam – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Minutový záznam – MySQL – Fórum – Programujte.comMinutový záznam – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Matěj Andrle+1
Grafoman
1. 6. 2014   #1
-
0
-

Dobrý den,
napadá mne mnoho řešení a tak se ptám zde - jak nejlépe vyřešit umazávání řádku v databázi? Totiž mám jednu databázi - ve které si uživatelé ukládají své příspěvky - ty mohou poslat do druhé každou hodinu (a toto posílání naplánovat dopředu - vytvořit si frontu posílání do fronty) - ve které až přijde jejich příspěvek na řadu, se po minutě smaže - čímž se dostane na řadu další... Oddělení do dvou DB má přávě ten smysl, že druhá databáze bude jen na toto mazání po minutě... První databázi spravují sami uživatelé - tedy kromě toho, že se musí nějak vyřídit jejich fronta. (ddd příspěvek chci za hodinu, eee příspěvek za 2 hodiny, iii příspěvek za 3 hodiny poslat do druhé DB...) Druhá se zdá být jednodušší - stačí jen každou minutu smazat první/poslední řádek... (dle toho, jak se budou příspěvky hromadit)
Děkuji.

Nahlásit jako SPAM
IP: 78.136.159.–
Řešení
Kit+15
Guru
1. 6. 2014   #2
-
0
-
Vyřešeno Nejlepší odpověď

#1 Matěj Andrle
Nechej to v jedné databázi, ke každému příspěvku přidej timestamp a při výběru příspěvků se řiď tím timestampem.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
1. 6. 2014   #3
-
0
-

O můj bože! Tak jednoduché - přivedl jsi mne na myšlenku - žádné přesuny, nic - so easy! Děkuji! :D

(každý příspěvek bude mít počet přidání do fronty - časový údaj posledního přidání a tak jen projedu všechny příspěvky s příznakem fronty...)

Nahlásit jako SPAM
IP: 78.136.159.–
Matěj Andrle+1
Grafoman
8. 6. 2014   #4
-
0
-

Tak přeci to není tak jednoduché. Vytvořil jsem pohodlný systém, jak zobrazit aktuální příspěvek z fronty + čas, kdy bude fronta vyřízena a tudíž čas, ve kterém přijde na řadu nově přidaný příspěvek... Jenže pořád nemám ono vyřizování fronty. Tedy potřebuji aby se při požadavku "get" (větev switch) nejen vytáhl příspěvek, který je na řadě (což mám nyní), ale také, aby se fronta posunula, je-li čas. S prvním SELECTem ve frontě má začít odpočet jedné minuty následovaný smazáním vrcholu fronty. Napadá mne jen velice složitý model, jak toho dosáhnout. Zahrnuje i znovuvytažení vrcholu fronty, když zjistím, že aktuálně vytažený příspěvek je už prošlý... Zkrátka - nešlo by to čistěji? Něco spustit na serveru? Problém mi činí také to, že existuje cca. 300 front... (to co bych spustil na serveru by muselo spravovat 300 různých vrcholů front - a nenapadá mne způsob, jak udržet ten minutový systém - leda 300 vláken - a to je moc kruté...) Sám uživatel si volí, z jaké fronty chce vidět aktuální minutu - aktuální příspěvek...

Nahlásit jako SPAM
IP: 78.136.150.–
Flowy0
Věrný člen
8. 6. 2014   #5
-
0
-

sprav tu frontu ako linked list ... bude to len jedna tabulka pricom kazdy zaznam bude zaroven odkazovat na predchadzajuci a nasledujuci (can be null - null means end of line) ... pri odstranovani sa nesnaz drzat eager sposobu ale skus to spravit lazy (usetris si vela problemov s casovacom a tiez vytazenost) - zaznam nebudes vyhladavat aktivne ale ked narazis na to ze zaznam nema existovat tak sa posunies na zaciatok danej fronty (dolezite pretoze ak by si vymazal prispevok len tak tak by si vytvoril dve nove fronty - jedna by koncila pred vymazanym zaznamom a druha by zacinala za nim ... musis nastavit na dany foreign key aby sa cascadoval na null inak by si mal nestabilnu tabulku ... zaroven si vyskusaj ci sa ti oplati dat index na foreign key alebo nie) a zacnes vymazavat az kym nenarazis na prispevok ktory ma existovat (pouzi vlastnost TimeToLive - tymto mozes nastavit pre rozne prispevky roznu zivotnost)

Nahlásit jako SPAM
IP: 78.128.130.–
https://github.com/Flowy
Matěj Andrle+1
Grafoman
8. 6. 2014   #6
-
0
-

Jak mám udělat takovýto systém, když to uživatelé utvářejí frontu? Mám nyní tabulku queue. V ní id záznamu (primární klíč), id fronty (těch je cca. 300) a časové údaje - vznik a po prvním přečtení zánik (can be null - před prvním SELECTem). Maži podle id záznamu... (uživatel může svůj příspěvek odstranit z fronty - rozmyslet si publikaci příspěvku) Tudíž si nedovedu představit, jak propojit všechny příspěvky jedné fronty - leda 300 tabulek... (takto je jen 300 ID regionů - front) Když se uživatel rozhodne, že chce vidět příspěvek z fronty, pak jen upřesním WHERE...

Nahlásit jako SPAM
IP: 78.136.150.–
Flowy0
Věrný člen
8. 6. 2014   #7
-
0
-

jedna tabulka = jeden objekt = jedna funkcnost ... jednu funkcnost rozdelovat do viac tabuliek je casto nezmysel

fronta ti vzdy zacina na prispevku ktory nema ziadneho predchodcu a konci na prispevku ktory nema ziadneho nastupcu ... takto mozes mat nekonecne mnozstvo front v jednej tabulke ... jednotlive fronty budes rozdelovat podla stlpca s foreign key na inu tabulku ... ak sa rozhodnes vymazat prispevok zo stredu tak proste musis ist na prispevok predchadzajuci a napojit to na prispevok nasledujuci (a naopak) - potom mozes odstranit dany prispevok na ktory nic neodkazuje

Nahlásit jako SPAM
IP: 78.128.130.–
https://github.com/Flowy
Matěj Andrle+1
Grafoman
8. 6. 2014   #8
-
0
-

Můžeš mi ukázat, jak přidat nový záznam - s id fronty atd. prosím? Kukám  nyní hodiny do návrháře a prostě netuším jak s tím hnout... (zkoušel jsem propojit kde co)

Nyní mám:

$databaseQueue->insert(array
(
	"region" => $_GET["region"],
	"ad" => $_GET["ad"],
	"author" =>$author
));


To znamená obyčejný INSERT... U toho tvého bych musel vytáhnout spodek fronty...

Nahlásit jako SPAM
IP: 78.136.150.–
Kit+15
Guru
8. 6. 2014   #9
-
0
-

#7 Flowy
Implementovat frontu na relační databázi je poněkud nešťastné řešení, protože relační databáze na tento způsob práce nejsou stavěné.

Pokud znáš id předchozího prvku, tak můžeš použít SQL dotaz: 

SELECT * FROM fronta WHERE id IN (
    SELECT min(id) FROM fronta
        WHERE id>$stareId AND jmeno_fronty='tuhle_chci'
    );
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
8. 6. 2014   #10
-
0
-

Pak tedy - jak jinak bys ty udělal frontu, která bude publikovat každou minutu příspěvek z MySQL databáze? (v záznamu fronty je ID příspěvku, který chceme publikovat)

Nahlásit jako SPAM
IP: 78.136.150.–
peter
~ Anonymní uživatel
3981 příspěvků
9. 6. 2014   #11
-
0
-

id, stav, time, ...
INSERT ... stav=0, time=NOW()
SELECT * ... stav<>0 OR time NOW()-1min
Cili, muzes to dat rucne publikovat pres zmenu stavu nebo po minute se to bere uz jako publikovane samo.

Nahlásit jako SPAM
IP: 2001:718:2601:258:3d4f:ac...–
peter
~ Anonymní uživatel
3981 příspěvků
9. 6. 2014   #12
-
0
-

jo, time>NOW-1min (mozna mensi, u casu ted presne nevim). A odcitani je SUBDATE.

Nahlásit jako SPAM
IP: 2001:718:2601:258:3d4f:ac...–
Matěj Andrle+1
Grafoman
9. 6. 2014   #13
-
0
-

Ale jak se mi uloží stav? Důvod proč to nedělám jak jsem napsal - že bych uložil čas při prvním SELECTu (NOW()) a pak v PHP dopočítával minutu je ten, že k tomu přistupuje mnoho lidí. Tudíž by při souběhu docházelo k tomu, že si 2+ lidé vytáhnou starý záznam, zjistí že už je po 1 minutě publikace a tak oba vyberou nový - pokud bude jeden rychlejší, další skočí o 2, místo o 1... Toto by sice vyřešilo zmíněné provázání všech postů fronty, ale u tohoto postupu se mi stále nedaří navázat kontinuitu. Navíc samotné neustálé kontrolování aktuálnosti - rád bych udělal možnost zkouknutí fronty - aby si lidé mohli promyslet, zda se jim vyplatí na nějaký post čekat. A to právě byl můj dotaz zde:

http://programujte.com/forum/vlakno/27305-vice-pristupu-zbytecna-data

Musel jsem od toho upustit, jelikož by to vyžadovalo sekundové koukání do DB - protože každou sekundou se může někdo odhlásit z fronty atd. Právě pro tu potřebu dynamiky si dobře uvědomuji, že databáze není moc vhodná... Uvažuji nyní nad WebSockets. Ale stejně se ni nedaří vyřešit úplně vše - každé řešení má chybu...

Nahlásit jako SPAM
IP: 78.136.168.–
peter
~ Anonymní uživatel
3981 příspěvků
9. 6. 2014   #14
-
0
-

Tebe zajimaji vsechny prispevky, starsi 1 minutu a vice. Cili vyberes cas, ktery je mensi nez NOW-minuta (coz resi SUBDATE nebo INTERVAL).
Pokud budes chtit zobrazovat 10 lidem aktualni prispevky kazdou 1s, tak musis posilat dotaz na server (cili takovy chat). Chat ja resim tak, ze interval je 17s pro autorefresh a refresh pri vynuceni (pridani noveho radku). Kdyz by treba 3x probehlo 17s, tak bych mu dalsi refresh udelal as za 1-2 min a pripadne pak uz jen 5 min. Tim nebudu zatezovat server, kdyz ten clovek jenom okno prohlizi a na nic neklika, nic neposila.
Stav prave resi situaci, kdy chces ten casovy limit obejit, aby se to zobrazilo hned.

Nahlásit jako SPAM
IP: 2001:718:2601:258:3d4f:ac...–
Matěj Andrle+1
Grafoman
9. 6. 2014   #15
-
0
-

Jak jsem psal - to je utopie. Spíše nyní přemýšlím nad WebSockets. Pořád hlavně nevím jaké použít úložiště... Při WebSockets by se server nemusel potýkat se souběhem, jelikož by se změny projevily jednoduše posloucháním v JS... Co ale řeším - jak spravovat 300 front... Jak jsem psal - napadá mne řešení jedině s více vlákny. Ale 300 vláken? Anebo 300 spuštěných programů - opět utopie...

Nahlásit jako SPAM
IP: 78.136.168.–
Kit+15
Guru
9. 6. 2014   #16
-
0
-

#15 Matěj Andrle
A ty si myslíš, že 300 dotazů za sekundu je pro databázi problém? Tak si vyber jinou databázi, třeba Redis. Ta na mém Atomu zvládne několik desítek tisíc transakcí za sekundu, na serveru to budou stovky tisíc.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

Záznam obrazovky — založil ospaly.stanislav

Select n-ty záznam z tabulky — založil lukas.balaz

PHP záznam v cyklu — založil Aricak

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý