- 10M+ Marcadores (Intervalos de tempo em certos)
- Mais de 300 mil objetos referenciados (vídeos)
Marcadores com uma estrutura como esta:
{
id: 123,
category: 2,
object: 'A',
start: 10,
end: 25
}
...resultando em intervalos ao longo das diferentes categorias, como:
category-1: ----------[===========]---------------------------- ref-object: A
category-1: --------------------------[====================]--- ref-object: A
category-1: ------------------[============================]--- ref-object: A
category-1: -----------------[==========================]------ ref-object: C
category-1: ------------------------------[================]--- ref-object: C
category-2: ----[===================]-------------------------- ref-object: A
category-2: -----[==========================]------------------ ref-object: B
category-2: -----[====================]------------------------ ref-object: C
category-2: -------------------------[=================]------- ref-object: C
category-2: ------------[===================================]-- ref-object: C
category-3: ----------------[=============]-------------------- ref-object: A
category-3: ----[===================================]---------- ref-object: A
category-3: -------[=======================================]--- ref-object: B
category-3: ----------------------------[====]----------------- ref-object: C
category-3: -------------[=================]------------------- ref-object: C
Agora para responder algo como isto:
Encontre todos os objetos, tendo intervalos sobrepostos(!)
category 1
ecategory 2
idealmente ordenados pela soma do tempo sobreposto
Eu consigo pensar nesses passos
- consulta: comece com uma categoria, busque todos os marcadores nessa categoria
- código: reduza os intervalos para alguns intervalos de tempo maiores (remova intervalos de tempo redundantes)
- consulta: buscar marcadores da próxima categoria que correspondam a um desses intervalos de tempo
- código: reduza os intervalos combinados para alguns intervalos de tempo maiores (remova intervalos de tempo redundantes)
- [...]
- código: calcular o período de tempo coberto por item e classificar de acordo
Isso é algo que você gostaria de fazer em SQL?
Existe um nome para esse tipo de consulta? (Essas não são exatamente consultas de intervalo, são?)
Existe um banco de dados com recursos integrados nesse caso, dada a quantidade de dados?
Atualmente, todos os dados são armazenados dentro de um índice Apache SOLR, mas isso também pode se tornar Elasticsearch, InfluxDB etc.
Claro! E como é bem simples, por que não tentar?
Retornaria do seu exemplo (contando o
[
e]
nos marcadores, portanto o último marcador do seu exemplo,[====]
, é considerado de duração 6) :( aqui está o violino se você quiser brincar com ele)
10 milhões não seria tão grande para um servidor PostgreSQL, mas não há como saber sem testar (… e eu vou preservar o DBFiddle de tal carga). No entanto, estou convencido de que ele rodará mais rápido do que com roundtrips do banco de dados para o aplicativo .
Ainda há espaço para melhorias: todos
(category, object)
os pares podem ser reduzidos a um únicointeger
;e os CTEs podem ser despejados em tabelas e então indexados.