Sloučení binárních stromů dle nejlepší shody — rodokmeny v PostgreSQL rubrika: Databáze: SQL

7 langpavel
položil/-a 3.11.2017
 
upravil/-a 3.11.2017

Ahoj

Mám (zatím) dva datasety rodokmenů, potřebuji je sloučit. Jsou to koně aby to bylo pochopitelné.

Tři údaje + dva předci… Každý kůň má matku a otce (a sám je kůň…):

Jméno, rok narození, stát narození, (id otce), (id matky)

Bylo by fajn, kdyby se od roku 1800 vše dobře vedlo, ale fakt je, že v databázi nalézám i rok 0, 1, 2, 77, 190, 1000, často 1700 (UNIX 0 :-)), pak 1800, pak to občas dává smysl… no nevadí, na základě data narození potomků se dají blbosti nahradit NULL
ale odráží to stav v jakém jsou ostatní údaje, stojí to za prd. Překlepy, ok.. i to se dá.. duplicity.. hmmm i to jde…

Otázka zní, jak připravit nějaký fuzzy ukazatel, který, pokud to je možné, vyhodnotí shodu mezi (dvěma) záznamy z datasetu tak, aby to bylo možno předložit uživateli pro odfajfkování…

Zatím jeden dataset má ~340k záznamů, druhý ~103k záznamů, takže plný kartézský součin je prostě mimo…

Takže následně otázka zní, jak připravit fuzzy match efektivně?

Chtěl bych zůstat v SQL nebo PL/pgSQL. Každá rada dobrá. Zatím mám kaskádu UPDATE dotazů, které jsou postupně obecnější. Je to celkem efektivní, ale myslím, že to půjde i lépe

Díky Pavel

odkaz
6 Žížala
odpověděl/-a 3.11.2017

No na překlepy by se dal asi použít Levenshtein - https://www.postgresql.org/docs/9.6/static/fuzzystrmatch.html.
Až by byli srovnané jména, tak bych podle nich začal rovnat datumy, kde jsou špatně. No a pochopitelně jet ve směru od potomků k rodičům. Potom bych každému dopočítanému údaji přiřadil pravděpodobnost, zda je správně. A podle ní se rozhodoval. A dělal bych postupně narovnání po generacích, sice to bude opruz, ale...

Jen tak od boku asi víc nedám.

Komentáře

  • langpavel : Levenshtein, dobrý tip, díky! Jet ve směru od potomků k rodičům, jasná věc, jinak to nejde… 3.11.2017

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.