Nalezení nejdelší společné části (prefixu) UUIDv4 rubrika: Databáze: SQL

7 maryo
položil/-a 22.9.2015
 
upravil/-a 22.9.2015

Přemýšlím, jak nejjednoduššejc v SQL (Postgres) najít nejdelší společnou část (prefix) několika UUIDv4.
Dejme tomu, že mám nějakou tabulku s IDčkem (primární klíč) v UUIDv4 formátu (např. 86914ca4-3986-4d72-8b46-a934c57300c5).

A já potřebuju najít nejdelší společnej prefix mezi IDčkama v tý tabulce a nějakym konkrétnim UUIDv4.
Tj. pokud budou v databázi třeba jen 3 záznamy.
86914ca4-3986-4d72-8b46-a934c57300c5
86914ca4-ffff-ffff-ffff-ffffffffffff
86914ca4-3986-ffff-ffff-ffffffffffff

Tak aby mi to našlo 86914ca4-3986 pokud budu porovnávat třeba s 86914ca4-3986-aaaa-aaaa-aaaaaaaaaaaa.

Nevím, jestli se k tomu chovat jako ke stringu nebo to jde nějak "vypočítat" (ne doslova)... A zároveň bych se rád vyhnul instalování extenzí a nejlíp i stored proceduře / funkci, triggerům a pohledům, protože ORM (ale pokud by to jinak nešlo, tak i to se dá).

Samozřejmě jsem googlil a pár řešení našel, ale většinou ty řešení jsou až zbytečně komplexní. Nemusí to být nějak ultra super rychlý (zjištění by probíhalo při vložení novýho záznamu), ale ultra super pomalý to taky být nemusí.

Víceméně je to podobná fíčura jako třeba identifikování commitu v GITu pomocí části hashe.

odkaz Vyřešeno
8 rmaslo
odpověděl/-a 23.9.2015
 
upravil/-a 23.9.2015

No pokud ty záznamy abecedně srovnám (a oindexuju) a představím si, že tam ten nový mám již také vložený, tak je podle mě jasné, že nejpodobnější mu bude buď ten přímo před ním nebo ten přímo za ním. Takže podle mě stačí si tyto dva vytáhnout a pak z nich vybrat ten lepší. Tj.

SELECT uuid FROM uuids WHERE uuid > "new-uuid" ORDER BY uuid ASC LIMIT 1
SELECT uuid FROM uuids WHERE uuid < "new-uuid" ORDER BY uuid DESC LIMIT 1

Takže jsem nad tím uuid nepoužil v db žádnou stringovou funkci a vzhledem k indexaci to musí být jak rychlý jak vítr. Vybrat z těch dvou potom ten lepší a najít společnou část je z hlediska zatížení triviální a lze to naprogramovat buď v PHP nebo Postgres.

Komentáře

  • maryo : No vida, tohle mi z nějakýho důvodu nedošlo, asi nejlepší. Snad v tom neni nějaká bota :) 23.9.2015
  • rmaslo : Tak bota se dá udělat vždy. Třeba zapnout český třídní a mít v prefixu za sebou "c" a "h", což db engine vezme jako ch. 23.9.2015
  • vojtech.kurka : Jeste se to da zrychlit (a tabulku zmensit), ze to nebudes ukladat jako string, ale jako binarni data. Napriklad v MySQL ti na to staci typ BINARY(16) a pak ani nemuzes udelat vyse zminenou chybu s nastavenim collation. 25.9.2015
  • maryo : jj, postgres ma primo typ uuid 25.9.2015

Pro zobrazení všech 4 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.