Autor Zpráva
Exkalibr
Profil *
Máte nějaký trik jak by to šlo udělat, abych do sloupce mohl přidat sekvenci čísel integer ? Potřebuju uložit vždy dvě čísla za sebou. Abych ušetřil prostor a nemusel vkládat do VARCHAR(255) toto:
25,14;
1,18;
22,108;

na tři dotazy ... což by ve výsledku dalo 25,14;1,18;22,108;

A pak udělat dotaz jestli se např 1,18 v textu vyskytuje. S textem bych to uměl udělat, ale dotaz ní, jestli by to šlo s čísly, tedy asi binárně.
lionel messi
Profil
Exkalibr:

To vyzerá na zlý návrh databázy. V odkázanom texte nájdeš aj vhodné riešenie.
Exkalibr
Profil *
lionel messi:
Nakonec jsem se rozhodl pro textový typ. Nebudu to přehánět, jde o banalitu. Nejde mi o žádné složité operace, takže si jen vytáhnu ten text a v php dám hledat pomocí strpos. Jednoduché a rychlé.
Tomášeek
Profil
Exkalibr:
Moc nechápu, proč se zde ptáš, když dostaneš správnou odpověď a stejně se na dané řešení vyprdneš... (a navíc je to dle tvých slov „Jednoduché a rychlé“.
Exkalibr
Profil *
Tomášeek, lionel messi mi neodpověděl na to co jsem chtěl slyšet. Obecně: řešení je vždycky více a při řešení jakéhokoliv problému je třeba zvážit zda je lepší se škrábat levou nohou nebo pravou rukou. Proč to dělat složitě, když to jde jednoduše? Opravdu mi přijde zbytečné kvůli prkotině zavádět novou tabulku, pak bych musel již tak složité dotazy, které někdy obsahují i tři JOINy ještě rozšířit o čtvrtý JOIN. Vím kde se toto řešení, které lionel messi navrhuje, uplatňuje například v tabulka subscriptions.

I tak by mě zajímala odpověď na to co jsem se ptal v souvislosti s tímto tématem: Řešení pro vyhledávač slov ve zprávě
Mám totiž asi 1000 slovíček roztříděných do 600 skupin. Takže mám idečka tagů, která chci přiřadit ke každému postu. Řekněme, že u každého postu budou idečka toho co autor příspěvku řekl a bude jich max. 20. Jedno idečko by mělo mít dva bajty a budou se vyskytovat po párech. Takže jeden tak 4 bajty. Dále dalších 80 bajtů pro druhou skupinu ideček tagů, které jsou v příspěvku, ale autor je citoval - pro pochopení kontextu. Opravdu bych měl kvůli tomuto zakládat novou tabulku. Bylo by to obrovské množství záznamů. Například budu mít 1000 článků a v každém bude průměrně 50 komentářů s 20 tagy. Tj. 1.000.000 záznamů v tagách. Jak pak bude ovlivňovat výkon select?

Příklad dotazu:
    $query = array(
          'SELECT'    => 'u.email, u.url, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, INET_NTOA(`p.poster_ip`) as poster_ip, p.message, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online',
          'FROM'        => 'posts AS p',
          'JOINS'        => array(
              array(
                  'LEFT JOIN'        => 'topics AS t',
                  'ON'            => '(t.uid=p.poster)'
              ),
              array(
                  'INNER JOIN'    => 'users AS u',
                  'ON'            => 'u.id=p.poster_id'
              ),
              array(
                  'INNER JOIN'    => 'tags AS t',
                  'ON'            => 't.post_id=p.id'
              ),
              array(
                  'INNER JOIN'    => 'groups AS g',
                  'ON'            => 'g.g_id=u.group_id'
              ),
              array(
                  'LEFT JOIN'        => 'online AS o',
                  'ON'            => '(o.user_id=u.id AND o.user_id!=1 AND o.idle=0)'
              ),
          ),
          'WHERE'        => 'p.id IN ('.implode(',', $posts_ids).')',
          'ORDER BY'    => 'p.id'
      );
Kajman
Profil
Exkalibr:
Jak pak bude ovlivňovat výkon select?

Pozitivně. Protože např. vyhledávání dle tagu bude mít databáze mnohem rychleji nad milionem záznamů, když budou data normalizovaná a bude nad nimi index, než nad 50000 záznamy se splácaninou, které musí všechny načíst z disku a projít. Pokud nevěříte, tak si to změřte.
Exkalibr
Profil *
Dobře, to máme vyhledávání dle tagu. Ale co ty výpisy, kde se prochází příspěvky a musí se interpretovat všechny tagy, které jsou k němu připojené?
Kajman
Profil
Také si to změřte, nebál bych se toho. Databáze na to jsou nachystané a milion řádků pro ně není problém, pokud to je správně navržené.
Exkalibr
Profil *
Na měření mikročasu mám použít php příkaz? Nebo používáte nějakou mysql funkci?
Kajman
Profil
Dotaz není klasické sql (kde na měření délky dotazu stačí nějaký databázový klient) ale vypadá to, že používáte nějaký databázový layer. Podívejte se do jeho dokumetnace, jak se měří nebo vypisují časy dotazů a jak se pro test vypne query cache, aby jí nebyly dotazy znepřesněny.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0