Autor Zpráva
tester
Profil *
Jak napsat toto v SQLite?

CREATE table `data` (
`interests` SET('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63')
)
juriad
Profil
Správné řešení je rozpadnout data do další tabulky. SET je docela špatné řešení z hlediska jak spravování (je potřeba přidat hodnoty = znovuvytvoření tabulky) i vyhledávání (není možné použít index).
tester
Profil *
To už by snad bylo jednodušší zapisovat data ve stylu že jeden bit bude odpovídat jedné hodnotě. 8 bytů v jednom sloupci by mi tak vystačilo na 64 hodnot.
juriad
Profil
tester:
Jo a výkon je stejně v háji, jako bys ukládal TEXT a hledal v tom pomocí LIKE. Jenže to by mělo tu výhodu, že by šlo přidávat další zájmy.

O co ti jde? Pokud máš pár stovek záznamů, je jedno jak to uděláš; máš-li jich statisíce, není místo na kreativitu.
tester
Profil *
Má to být na vyhledávání uživatelů se stejnými zájmy. Nejde tam o seřazení ale buď o výpis vyplněných hodnot na profil nebo o hledání na bázi - vyhledej všechny záznamy kteří mají vyplněnu položku 1.,2.,5.,7. nebo 10.
tester
Profil *
Něco jsem o tom našel
sqlite.1065341.n5.nabble.com/enum-in-SQLite-td5313.html
juriad
Profil
tester:
Enum je úplně jiný datový typ. Umožňuje reprezentovat jednu hodnoty z omezené množiny. To odkázané vlákno se týká kontroly, zda se uživatel nesnaží uložit neplatnou hodnotu.
tester
Profil *
Já už vím jak to vyřeším. Místo SET použiju jiný datový typ nejspíš INTEGER a ten budu používat ke stejnému účelu. Nevýhoda asi (?) je že bude zabírat více místa (?) než SET ale těch 8 bytů není tak moc. Chci zkonvertovat tabulku mysql do sqlite a udělám to tak, že vezmu data toho sloupce (pole) a jednotlivé bity v cílové proměnné nastavím podle toho jestli je hodnota 1 nebo 0. To pak uložím jako INTEGER do té tabulky sqlite. Osobně věřím tomu že případné hledání ve sloupci (pomocí masky) pak bude rychlejší.
Kajman
Profil
Bitové příznaky budou ve vyhledávání rychlé jen pokud se bude hledat přesné číslo, které kombinací 0 a 1 vznikne. Pokud ale budete chtít hledat jen podle některých bitů, nenastavujte bity do stejného čísla, nepůjdou na tom indexy a vyhledání tak bude příliš pomalé. Pokud chcete uložit hodnoty 1, 2, 5, 7 a 10, tak jednoduše přidejte těchto pět čísel jako pět řádků k jednomu uživateli.
Některé časteji řešené dotazy pro MySQL - FAQ » Více hodnot ve sloupci
tester
Profil *
Kajman:
Vyhledávání pomocí bitové masky kde se hledá jen několik bitů by mělo být prováděno jen v kombinaci s dalšími podmínkami. Dám příklad. Hledám gender:1, agefrom:20, ageto:23, district:10, (a teprve nyní přijde porovnávání podle masky)... možná ale nechápu jak vyhledávání správně funguje. Pokud se nejdříve aplikuje jedna (hledám gender) podmínka a v tomto výsledku se pak hledá další podmínka (větší než 19) a pak další a další, tak je to tak jak myslím. Pokud by to ale probíhalo tak že se nejdříve najde první řádek a na něm překontrolují všechny tři tak si myslím že by to vyšlo na stejno? Případně dát do vyhledávání podmínku že pokud počet výsledků je větší než n, pak vrať určitý výsledek, např. (integer) error. Tím bych omezil bitové hledání v zájmech jen na omezený počet záznamů.


Jak jsem se dočetl zde dev.mysql.com/doc/refman/5.7/en/set.html tak SET je omezen na max 64 členů. Pak jsem si uvědomil že integer má 4 byty na OS 32-bit a 8 na 64-bit takže bych tam mohl mít max 64 hodnot. U mysql by se dal použít VARCHAR pro větší počet bitů ale na SQLite VARCHAR není takže TEXT a ten je pomalý, čili by byl nejlepší ten INTEGER s možností mít více sloupců pokud by bylo třeba.
Keeehi
Profil
tester:
Databáze tu jsou s námi už desítky let a během té doby jsou neustále zdokonalovány. Jsou schopny dosahovat lepších rychlostí než kdyby musely vždy procházet všechny záznamy a porovnávat je. Nesmíš tomu však bránit nestandardním návrhem který databáze optimalizovat nemůže.

Na druhou stranu, SQLite moc neznám se mám za to, že by to měla být velmi jednoduchá databáze a ta asi stejně nějaké optimalizace moc neumí, takže tam to bude z tohoto pohledu jedno.
Stále tu však zůstává problém že nějaký složitější dotaz nepůjde vůbec napsat nebo jen velmi obtížně, protože databáze nebude umět to, co bys pro nestandardní návrh potřeboval.

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