Já už PostgreSQL pomalu opouštím. Používali jsme jej ve firmě od roku 2008 až do mého odchodu v roce 2019. Naprosto skvělá databáze. Potom jsem přešel do jiné firmy, programuji v Golangu, pokud možno vše ve standardní knihovně. Aktuální horkou novinkou v Go 1.24 je SHA-3 a ten balíček, krom základních kryptografických funkcí SHA-3 128b, 256, a 512b umí také algoritmus SHAKE, kterým je možné generovat menší výstupu, třeba jen 64b. A také je v Golangu open source MIN.io. Napsal jsem o tom dva články: SHA-3 a MIN.io (tento je inspirovaný článkem z roku 2019 od Pavla Tišnovského). Takže pro programátory v Golangu je standardní knihovna použitelná už na vše (v mém případě konverze obrázků do velmi optimalizovaného PNG), komprese dat (LZW), ukládání dat (GOP).
Pomalu mi přestává stačit datový typ BYTEA v PostgreSQL, takže teď už mám nasazené MIN.io na soubory o libovolné velikosti.
Takže vše nejlepší PostgreSQL ke třicetinám, já od něj po 17 letech odcházím. Ale vy ostatní nemusíte, je to skvělá databáze, nikdy jsme nepřišli o žádná data. Jen už skutečně není vhodný pro ukládání 40GB souborů (BYTEA má limit 1GB).
Pro data o velikostech do 1GB ale stále používejte PostgreSQL, máte garantováno, že po úspěšném commitu jsou ta data velmi bezpečně uložena. A k tomu skvělé SQL.
Chtít ukládat gigabajtové soubory do DB, to je pro mne úplně z jiného světa. Neříkám, že to nejde (ostatně FS je svým způsobem taky databáze), ale databáze, zejména ty relační, mají svůj přínos jinde – hodně záznamů / řádků, sloupečků + vyhledávání v nich a další operace nad těmi atributy. Pokud je cílem ukládat velké soubory, tak je to opravdu úkol spíš pro FS nebo něco síťového s API podobným souborovému systému. Jestli ti to dlouhé roky fungovalo, tak je to důkaz toho, jak je PostgreSQL dobrá a pružná databáze.
P.S. Vím, že jsme se o tom kdysi bavili na Ábíčku, i když tehdy snad nešlo o tak velké soubory. Moje hlavní výhrady byly v tom, že je potřeba ten obsah souborů protlačit přes API/protokol té DB a přes aplikační vrstvu; ne až tak v tom, že by DB ta data nedokázala uložit. Oproti tomu když je ten velký soubor na FS, tak se dají dělat různé optimalizace a přes aplikaci to vůbec nemusí jít – ta dává jen instrukce k tomu, co se má udělat – a reálně to udělá třeba Apache nebo jiný program a Jádro (viz funkce sendfile() a zero-copy přenos bez nutnosti přepínání mezi Jádrem a uživatelským prostorem). Argumentem pro uložení všeho v DB je transakčnost a konzistence – ale to platí do doby, dokud to ta DB a aplikace v pohodě zvládají – pak už je podle mého lepší obětovat část konzistence (ve smyslu, že mi na FS můžou zůstat viset soubory, na které už v DB neukazuje žádný záznam).
Chtít ukládat gigabajtové soubory do DB, to je pro mne úplně z jiného světa.
Naprosto chápu tvé argumenty, jen jim dodám své. PostgreSQL poskytuje perfektní ACID, a pokud potřebuji ke svých binárním datům také nějaká metadata, tak uložit vše do jedné DB jedním commitem (potvrzenou transakcí) je velká výhoda. Data a metada se uloží jedním příkazem.
Stejně tak na data a metadata stačí jeden protokol. Pokud mám všechny appky napsané tak, že používají jeden síťový protokol (PostgreSQL protocol verze 2), tak mám vyřešené vše.
sendfile() a zero-copy
Tohle je implementační detail a pochybuji o tom, že to v praxi, tedy přenos dat po síti LAN nebo dokonce přes internet, kde jsou latence USA - Česko klidně 100ms, tak řešit několik volání jádra je v tomto případě zcela irelevantní. Zatímco volání jádra má latence 1us, tak následný přenos dat přes Internet je 100 000x pomalejší.
sendfile a zero-copy optimalizace jsou skvělé pro lokální programy, kde data neopustí PC do sítě. Šetří to paměť, počet callbacků do kernelu apod. Tedy všude tam kde jde o každých 100ns. To ano.
U ukladani do souboru muzes narazit na opravneni. Dalsi aspekty jsou treba pripadna migrace na jiny system. Z pohledu aplikace je to dalsi rozhrani ktery musis nejak obsluhovat.
Takze z mnoha duvodu v mnoha pripadech je ukladani souboru do databaze vlastne ta lepsi cesta.
Jasne, je to ponekud drahe, ale ...