Budu potřebovat nějaké dotazy ve formě "seznam všech objektů, kde jeden z názvů je 'foobar'." Očekávaná velikost tabulky je řádově několik milionů záznamů. K tomu lze použít Postgres JSON dotazy a lze to i indexovat (např. Index For Finding Element v JSON poli). MÁ SE to však dělat tímto způsobem, nebo je to zvrácené řešení, které se nedoporučuje?
může udělat to tak, ale to neznamená, že byste to měli udělat. V určitém smyslu je osvědčený postup již dobře zdokumentován (viz např. použití hstore vs použití XML vs použití EAV vs použití samostatné tabulky) s novým datovým typem, který se pro všechny záměry a praktické účely (kromě ověřování a syntaxe) nijak neliší. z předchozích nestrukturovaných nebo polostrukturovaných opcí.
Jinak řečeno, je to stejné staré prase s novým make-upem.
JSON nabízí možnost používat invertované indexy vyhledávacího stromu , stejně jako hstore, typy polí a tsvectors. Fungují dobře, ale mějte na paměti, že jsou primárně určeny pro extrahování bodů v sousedství (přemýšlejte o typech geometrie) uspořádaných podle vzdálenosti, spíše než pro extrahování seznamu hodnot v lexikografickém pořadí.
Pro ilustraci si vezměte dva plány, které Romanova odpověď nastiňuje:
- Ten, který provádí skenování indexu projíždí stránky disku přímo a načítá řádky v pořadí uvedeném indexem.
- Ten, který provádí skenování indexu bitmap začíná identifikací každé stránky disku, která může obsahovat řádek, a čte je tak, jak se objevují na disku, jako by to bylo (a vlastně přesně jako) prohledávání sekvence, které přeskakuje zbytečné oblasti.
Vraťme se k vaší otázce:Přeplněné a příliš velké převrácené indexy stromů skutečně zlepší výkon vaší aplikace, pokud budete tabulky Postgres používat jako obří obchody JSON. Ale ani oni nejsou stříbrná kulka a při řešení úzkých míst vás nedostanou tak daleko, jak je správný vztahový design.
Závěr se nakonec neliší od toho, co byste získali, když se rozhodnete použít hstore nebo EAV:
- Pokud potřebuje index (tj. často se objevuje v klauzuli where nebo, což je ještě důležitější, v klauzuli spojení), pravděpodobně budete chtít data v samostatném poli.
- Pokud je to primárně kosmetické, JSON/hstore/EAV/XML/whatever-makes-you-sleep-at-night funguje dobře.