PgSQL: Efektivní opakované hledání záznamů, na kter é nevede cizí klíč

Ales Janda <[email protected]> Wed, 8 Jan 2020 13:29:08 +0100 (CET)
Newsgroups gmane.user-groups.linux.czech
Message-ID <[email protected]>
Chtěl bych se zeptat, jak nejlépe navrhnout databázi pro
toto:

V tabulce mám řádky, které jsou výsledkem nějakého
postupného bádání. Jak bádání pokračuje, můžou být některé
řádky zastaralé a nahrazeny jinými řádky. Například mám
řádky A, B a C a nějakým algoritmem řeknu „z řádků A a C
vyplývá nějaká nová informace D“, a nahradím řádky A a C
jedním řádkem D (nebo i více řádky). Z řádků B a D třeba
vyplyne něco dalšího, tak je nahradím řádkem E.

No jo, ale občas si řeknu „tenhle algoritmus byl blbost“,
smažu všechny řádky vyrobené tímto algoritmem, a měly by se
smazat všechny řádky vyrobené tímto algoritmem, ale i
všechny řádky, které vznikly na jejich základě. Například
když smažu D, smaže se i E (a zase budou platné A, B a C).

Na tohle můžu použít cizí klíč (foreign key) s ON DELETE
CASCADE.

No jo, ale jak efektivně hledat na aktuálními daty? Tedy nad
daty, které nejsou referencovány jinými řádky (resp. nebyly
překryty nějakým dalším algoritmem)? Jediné řešení, co jsem
našel, je použít LEFT JOIN přes všechny řádky, ale to mi
přijde strašně neefektivní; potřebuju jenom poslední verzi
řádků (hodněkrát), a ty překryté jenom když se vracím k
předchozím verzím (málokdy).

Je tedy nějaký způsob indexu „tento řádek je indexován
jiným“? Nebo celá ta úvaha je nesmyslná a měl bych to udělat
jinak?

Dělám v PostgreSQL.

Díky.

Zobrazit: http://www.abclinuxu.cz/poradna/databaze/show/452180