PostgreSQL'deki BLOB'lar veya referanslar


11

Bir Ubuntu sunucusunda çalışan bir PostgreSQL veritabanında ikili veri dosyalarını depolamak gerekiyor. Başlangıçta her biri yaklaşık 250kb boyutunda birkaç düzine dosya olacaktır. Ancak, dosya sayısı zamanla artacaktır. Zaman zaman diğer aşağı akım analizleri için dosyalardan veri ayıklamak gerekebilir.

İkili verileri BLOB veya referans olarak depolamak için asırlık soru ile ilgili biraz araştırma yaptım. Her ikisinin de artıları ve eksileri var. PostgreSQL ile ilgili bilmem gereken belirli sorunlar var mı? Dosyalardan veriyi PostgreSQL fonksiyonu veya harici bir Python programı ile çıkarmak istersem bir yöntem veya diğeri tercih edilebilir mi?

Veri dosyalarını doğrudan veritabanında saklayacak olsaydım, onları diğer tüm alanları içeren tabloda değil, "ana" tabloya başvuran yabancı anahtarla ayrı bir tabloda saklamak daha mı iyi olurdu?

Burada soru ve cevapları okudum ; Buradaki bir açıklama, ikili dosyaları Linux'ta referans olarak (dosya sisteminde) depolamanın daha iyi olduğunu göstermektedir. Buradaki sorularım özellikle PostgreSQL ve çeşitli analizler için dosyalardan veri çıkarma ile ilgili.

Güncelleme: Benzer soru .


PostgreSQl ile referansı içeren kayıt silindiğinde dosya sistemindeki dosyayı otomatik olarak silen bir kural ayarlamak mümkündür .
jp

Eminim bu soruya birden fazla cevap geldi. Ona ne oldu? Poster sildiyse görmenin bir yolu var mı? Peki ya yorumlar?
SabreWolfy

Evet, yazdım bytea ile ilgili performans sorunları önlenebildiğinden sildim. Yorumlar şöyle özetlenebilir: "Her şey bytea ile iyi, sadece veritabanında yazdırılamayan karakterlerden kaçmadığınızdan emin olun ve sonra tekrar uygulamanızda bunları kaçın. Araqnid yorum olarak, bunun yerine libpq tarafından desteklenen onaltılık çıkış. "
jp

Yanıtlar:


9

Veriyi veritabanında normal bir byteasütun olarak saklamanız gerektiğini düşünüyorum . Bu şekilde bir veritabanının tüm avantajlarını elde edersiniz ve veritabanı işlevlerini (ve hatta isterseniz PL / Python'u) kullanarak verileri işleyebilirsiniz. Daha büyük veri öğeleri otomatik olarak satır dışında saklanır, bu nedenle başka bir referans dolaylaması tanıtmanız için bir neden olmaz.

Büyük ikili nesnelerin veritabanı dışında depolanmasının temel nedenleri, tatmin edici bir süre içinde depolanamayacak ve alınamayacak kadar büyük olmaları, veritabanını pratikliğin ötesinde şişirmeleri veya dosyalara dosya olarak erişmeniz gerektiğidir. ayrı bir uygulama. Anlatabildiğim kadarıyla bunların hiçbiri orada geçerli değil.


Detaylar için teşekkürler. Ayrı bir uygulamadan dosyalara erişme konusundaki düşünceniz, gelecekte kullanıcıların makinelerinde yerel olarak kullanmak için ikili dosyayı indirmelerine izin vermek isteyebileceğimi fark etmemi sağladı. Dosya veritabanında depolanırsa bu yapılabilir mi?
SabreWolfy

Elbette. Bunu düzenlemek için küçük bir kod yazmanız gerekecektir (dosya verilerini veritabanından getirme, HTTP indirmeyi düzenleme, diyelim), ancak bu bir engelleyici değildir.
Peter Eisentraut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.