Görüntüleri DB - Evet veya Hayır olarak mı saklıyorsunuz?


415

Bu yüzden görüntüleri DB'de depolayan bir uygulama kullanıyorum. Bu konudaki görüşünüz nedir? Ben doğrudan DB depolamak yerine, dosya sisteminde konumu depolamak için bir tür daha.

Sizce artıları / eksileri nelerdir?


Yanıtlar:


350

Birçok TB görüntüsünü yöneten bazı uygulamalardan sorumluyum. Veri yollarını veritabanında depolamanın en iyi yol olduğunu gördük .

Birkaç sorun var:

  • veritabanı depolama genellikle dosya sistemi depolama daha pahalı
  • raf dışı standart ürünlerle dosya sistemine erişimi süper hızlandırabilirsiniz
    • örneğin, birçok web sunucusu, bir dosyayı doğrudan dosya sisteminden ağ arabirimine eşzamansız olarak göndermek için işletim sisteminin sendfile () sistem çağrısını kullanır. Bir veritabanında depolanan görüntüler bu optimizasyondan yararlanamaz.
  • web sunucuları, vb. gibi şeylerin dosya sistemindeki görüntülere erişmek için özel bir kodlama veya işleme gerek yoktur
  • görüntü ve meta veriler arasındaki işlemsel bütünlüğün önemli olduğu durumlarda veritabanları kazanılır.
    • db meta verileri ile dosya sistemi verileri arasındaki bütünlüğü yönetmek daha karmaşıktır
    • (bir web uygulaması bağlamında) verilerin dosya sistemindeki diske akıtıldığını garanti etmek zordur

33
dosya sistemini "süper hızlandırmak" için hazır ürünler nelerdir?
Andrei Rînea

22
Yalnızca 3 TB'lık dosyaları yönetirken kesinlikle katılıyorum. Veritabanları bloblar için değil yapılandırılmış veriler içindir.
derobert

7
@ derobert: oldukça, eğer bir veri elemanını asla bir sorguda, koşul olarak ya da bir birleştirme için kullanmayacaksanız, muhtemelen veritabanına ait değildir. Sonra tekrar, benzerlik görüntüleri sorgulamak için güzel bir veritabanı fonksiyonunuz varsa ...
Nils Weinander

14
dosya sistemini "süper hızlandırmak" için hazır ürünler nelerdir?
ablmf

5
Re: "süper hızlanan" ürünler: Çoğu web sunucusu artık istemciye eşzamansız olarak statik dosyalar sunmak için sendfile () sistem çağrısından yararlanabilir. Dosyayı diskten ağ arabirimine taşıma görevini işletim sistemine yükler. İşletim sistemi bunu çekirdek alanda çalışarak çok daha verimli bir şekilde yapabilir. Bu, bana göre, dosya sistemi için büyük bir galibiyet gibi görünüyor, görüntüleri saklamak / sunmak için db.
Alan Donnelly

140

Çoğu konuda olduğu gibi, göründüğü kadar basit değil. Görüntüleri veritabanında saklamanın mantıklı olduğu durumlar vardır.

  • Dinamik olarak değişen görüntüleri saklıyorsunuz, faturalar söylüyorsunuz ve 1 Ocak 2007'de olduğu gibi bir fatura mı almak istiyorsunuz?
  • Hükümet sizden 6 yıllık tarihi korumanızı istiyor
  • Veritabanında depolanan görüntüler için farklı bir yedekleme stratejisi gerekmez. Dosya sisteminde depolanan görüntüler
  • Bir veritabanındaysa, görüntülere erişimi kontrol etmek daha kolaydır. Boştaki yöneticiler diskteki herhangi bir klasöre erişebilir. Görüntüleri çıkarmak için bir veritabanında gözetleme yapmak gerçekten kararlı bir yönetici gerektirir

Öte yandan ilişkili sorunlar var

  • Görüntüleri ayıklamak ve akışa almak için ek kod gerektir
  • Gecikme, doğrudan dosya erişiminden daha yavaş olabilir
  • Veritabanı sunucusunda daha ağır yük

2
Yerinde (SharePoint gibi) yüklü uygulamalar yazarken ayrı bir yedekleme stratejisine sahip olmamanız önemli olabilir. Bir SharePoint yedeklemesi oluşturduğunuzda her şey DB'de çok kolaylaşır.
Eric Schoonover

44
Belirsiz güvenlik, bir erişim kontrol stratejisi değildir!
Jon Cage

5
Güvenliği belirsizliğe göre savunduğunu sanmıyorum - DB'ye görüntüler yerleştirmenin başka bir güvenlik katmanı eklediğini söylüyor. (Sanırım ... @Conrad, ağzına kelime koymak istemiyorum)
AJ.

Tek bir yedekleme avantajı (veya daha genel olarak konuşursak, tüm verileri tek bir yerde bulundurmak) nedeniyle görüntüleri veritabanında depolamayı seçtim, ancak bahsettiğiniz sorunlar da doğru, bu yüzden dosyaları dosya sisteminde önbelleğe alıyorum. Her iki dünyanın da en iyisi ve buradaki en iyi cevapların hiçbirinin bundan bahsetmediğine şaşırdım.
Bart van Heukelom

Şans eseri, SQL-> disk görüntüsü önbelleğe almayı işlemek için ImageResizing.Net kütüphanesini mi kullanıyorsunuz? Bulabileceğiniz en gelişmiş, ölçeklenebilir ve sağlam disk önbelleğidir ...
Lilith River


56

Bu biraz uzun bir çekim olabilir, ancak SQL Server 2008 kullanıyorsanız (veya kullanmayı planlıyorsanız) yeni FileStream veri türüne göz atmanızı tavsiye ederim .

FileStream, dosyaları DB'de saklamakla ilgili sorunların çoğunu çözer:

  1. Bloblar aslında bir klasörde dosya olarak saklanır.
  2. Lekeler kullanılarak erişilebilir ya bir veritabanı bağlantısı ya da dosya sistemi üzerinde.
  3. Yedeklemeler entegre edilmiştir.
  4. Göç "sadece işe yarar".

Ancak SQL'in "Saydam Veri Şifrelemesi" FileStream nesnelerini şifrelemez, bu nedenle bu bir düşüncedirse, bunları varbiner olarak depolamaktan daha iyi olabilirsiniz.

MSDN Makalesinden:

Transact-SQL deyimleri FILESTREAM verilerini ekleyebilir, güncelleyebilir, sorgulayabilir, arayabilir ve yedekleyebilir. Win32 dosya sistemi arabirimleri verilere akış erişimi sağlar.
FILESTREAM, dosya verilerini önbelleğe almak için NT sistem önbelleğini kullanır. Bu, FILESTREAM verilerinin Veritabanı Altyapısı performansı üzerindeki etkilerinin azaltılmasına yardımcı olur. SQL Server arabellek havuzu kullanılmaz; bu nedenle, bu bellek sorgu işleme için kullanılabilir.


FileStream için +1. Aslında lekeleri diskte dosya olarak saklar, ancak bunları işlemsel olarak yönetir.
John Gietzen

Ayrıca, SQL sunucusu FileStream blob'larının doğrudan diskten erişmesine izin verir, böylece DB bağlantısını bağlamayı önleyebilirsiniz
John Gietzen

Yine de, DB ve web sunucusu arasında gecikme süresi eklendi ... Ve disk önbelleğe alma özelliğini kullanmadığınız sürece, web sunucusunun istemciye akışını sağlamak için belleğe yüklemesi gerekir.
Lilith River

39

DB'deki dosya yolları kesinlikle gitmenin yoludur - Müşterilerin TB hikayesi olan hikayeden sonra hikayeyi bir DB'de herhangi bir miktarda önemli miktarda depolamaya çalışan bir kabus haline geldiğini duydum - tek başına performans çok fazla.


35

Deneyimlerime göre, bazen en basit çözüm görüntüleri birincil anahtara göre adlandırmaktır . Bu nedenle, belirli bir kayda ait resmi bulmak kolaydır veya tam tersi. Ama aynı zamanda veritabanında görüntü hakkında hiçbir şey saklamazsınız.


Gerçekten çok iyi. Kullanıcılarınız artık diğer dosyalara erişmek için dosya adınızı kolayca
artırabilir

6
@Marijn: Bu sadece görüntüleri dünyaya açıklarsanız.
Kasım'da Seew Osewa

Görüntülenen belgelerimizle çok benzer bir şey yaptık (birincil anahtarımız üç öğeden oluşan birleşik bir anahtardır.), Ancak aynı dizinde birden çok sürüme sahip olabilmemiz için belgenin tarandığı tarih ve saati ekledik.
Andrew Neely

@Osewa, bu nasıl? Evet, dosyaya doğrudan erişmek için son kullanıcının klasöre erişmesi gerekir. Dosyayı isteğe bağlı olarak FTP üzerinden sunma işleminiz olabilir ve güvenlik SQL sunucusuyla eşit olacaktır.
Andrew Neely

31

Buradaki hile bir zealot olmamak.

Burada dikkat edilmesi gereken bir şey, pro dosya sistemi kampındaki hiç kimsenin belirli bir dosya sistemini listelememiş olmasıdır. Bu, FAT16'dan ZFS'ye kadar her şeyin her veritabanını kolayca attığı anlamına mı geliyor?

Hayır.

Gerçek şu ki, birçok veritabanı, sadece ham hızdan bahsederken bile birçok dosya sistemini yeniyor.

Doğru eylem şekli, kesin senaryo için doğru kararı vermek ve bunu yapmak için bazı rakamlara ve bazı kullanım senaryosu tahminlerine ihtiyacınız olacaktır.


6
Hiç kimse bir dosya sisteminin bir DB% 100 daha hızlı olduğunu iddia görmüyorum (Mark Harrison'ın cevabını okuyun). Biraz pipetçi. Muhtemelen emniyet kemerinizi takmamanın tercih edileceği durumlar vardır, ancak genel olarak konuşursak , emniyet kemeri takmak iyi bir fikirdir.
Calvin

30

Referans bütünlüğünü ve ACID uyumluluğunu garanti etmeniz GEREKEN yerlerde, görüntüleri veritabanında saklamak gerekir.

Veritabanında depolanan görüntünün ve meta görüntünün aynı dosyaya başvurduğunu işlemsel olarak garanti edemezsiniz. Başka bir deyişle, dosya sistemindeki dosyanın yalnızca meta verilerle aynı anda ve aynı işlemde değiştirileceğini garanti etmek imkansızdır.


7
Aslında hayır, yapabilirsin. Görüntü dosyaları oluşturulduktan sonra asla silinmediği, değiştirilmediği veya üzerine yazılmadığı sürece, tüm görüntü dosyaları işlemleri gerçekleştirmeye çalışmadan önce senkronize edilir, dosya sistemi bozulması olmaz, görüntü dosyalarının ve meta verilerin senkronize olduğundan emin olabilirsiniz. Bazı uygulamalar için, bunlar çok fazla ifs, sanırım.
Seun Osewa

Daha da ileri gidip Journaling dosya sistemi ve bazı ek program mantığı ile ACID uyumluluğunun sağlanabileceğini söyleyebilirim. Adımlar db kaydını yazmak, dosyayı yazmak olacaktır. Dosya işlenirse, db işlemini gerçekleştirin.
Andrew Neely

28

Diğerlerinin söylediği gibi SQL 2008, bir dosya adını veya tanımlayıcıyı db'de bir işaretçi olarak saklamanızı ve görüntüyü dosya sisteminizde otomatik olarak depolamanızı sağlayan harika bir senaryo olan bir Filestream türüyle birlikte gelir.

Daha eski bir veritabanındaysanız, o zaman veri bloğu verileri olarak saklıyorsanız, özellikleri arama yolunda veritabanından hiçbir şey almayacağınızı söyleyebilirim, bu yüzden muhtemelen en iyisi bir adresi bir dosya sisteminde saklamak ve görüntüyü bu şekilde saklamak için.

Bu şekilde dosya sisteminizde alandan da tasarruf edersiniz, çünkü yalnızca tam alan miktarını ve hatta dosya sistemindeki sıkıştırılmış alanı kaydedersiniz.

Ayrıca, herhangi bir db isabeti olmadan dosya sisteminizdeki ham görüntülere göz atmanıza veya dosyaları toplu olarak başka bir sisteme, sabit sürücüye, S3'e veya başka bir senaryoya aktarmanıza izin veren bazı yapı veya öğelerle kaydetmeye karar verebilirsiniz. ancak, depolama alanını artırmaya çalışırken görüntüleri db'nizden çıkarmaya çalışarak tekrar bir vuruş yapmadan yapıyı koruyun.

Muhtemelen, aynı zamanda web motorunuza / programınıza sıkça rastlanan resim URL'lerine dayanan bazı önbellek öğelerini atmanıza izin verir, böylece kendinizi orada da kaydedersiniz.


27

Sıkça düzenlenmeyen küçük statik görüntüler (birkaç megabayttan fazla değil) veritabanında saklanmalıdır. Bu yöntemin, daha kolay taşınabilirlik (görüntüler veritabanı ile aktarılır), daha kolay yedekleme / geri yükleme (görüntüler veritabanı ile yedeklenir) ve daha iyi ölçeklenebilirlik (binlerce küçük küçük resim dosyası içeren bir dosya sistemi klasörü, ben mi).

Bir veritabanından görüntü sunmak kolaydır, DB sunucusundan döndürülen bayt dizisini ikili akış olarak sunan bir http işleyicisi uygulayın.


Bu durumda tutarlılık bir sorun olabileceğinden, veritabanının sık sık düzenlenen dosyalar için daha iyi olduğunu iddia ediyorum.
Seun Osewa

26

İşte konuyla ilgili ilginç bir tanıtım belgesi.

BLOB'a veya BLOB'a: Bir Veritabanında veya Dosya Sisteminde Büyük Nesne Depolama

Cevap, duruma bağlı." Kesinlikle veritabanı sunucusuna ve blob depolama yaklaşımına bağlı olacaktır. Ayrıca, bloblarda depolanan verilerin türüne ve bu verilere nasıl erişileceğine de bağlıdır.

Küçük boyutlu dosyalar, depolama mekanizması olarak veritabanı kullanılarak verimli bir şekilde saklanabilir ve dağıtılabilir. Büyük dosyalar, özellikle sık sık değiştirilecek / güncellenecekse, dosya sistemi kullanılarak en iyi şekilde saklanır. (damla parçalanması performans açısından bir sorun haline gelir.)

Akılda tutulması gereken ek bir nokta daha var. Lekeleri depolamak için bir veritabanı kullanımını destekleyen nedenlerden biri de ASİT uyumluluğudur. Bununla birlikte, testçilerin SQL Server verimini iki katına çıkaran teknik incelemede (SQL Server Toplu Kayıt seçeneği) kullandıkları yaklaşım, blob verileri ile oturum açılmadığından, ACID'deki 'D'yi' d 'olarak etkili bir şekilde değiştirdi ilk işlem için yazıyor. Bu nedenle, tam ACID uyumluluğu sisteminiz için önemli bir gereksinimse, dosya G / Ç'yi veritabanı blob G / Ç'si ile karşılaştırırken veritabanı yazma için SQL Server işlem rakamlarını yarıya indirin.


25

Henüz kimsenin bahsetmediğini gördüğüm ama kesinlikle dikkat çeken bir şey, çoğu dosya sisteminde de büyük miktarda görüntü depolamakla ilgili sorunların olduğudur. Örneğin, yukarıda belirtilen yaklaşımı kullanırsanız ve her bir görüntü dosyasını birincil anahtardan sonra adlandırırsanız, çoğu dosya sisteminde çok sayıda görüntüye ulaştığınızda tüm görüntüleri tek bir büyük dizine koymaya çalışırsanız ( örneğin yüz binlerce veya milyonlarca).

Bunun ortak çözümü, bunları dengeli bir alt dizin ağacına ayırmaktır.


Öyle düşünürdünüz, ama sorunlar aslında küçük; Tek bir dizinde milyonlarca kullanıcı tarafından erişilen, sorunsuz bir şekilde milyonlarca dosyaya sahip bir uygulamam var. Akıllı değil, ama işe yarıyor. En büyük sorun, dizine göz atmak için Explorer'ı kullanırsanız, sonsuza kadar bir el feneri izlersiniz.
SqlACID

1
Büyük dizinlerle sorunu olmayan bir dosya sistemi kullanmak daha iyidir
Seun Osewa

8
Bir dizin (sunucu RHEL 4 çalıştıran) milyonlarca dosya ile bir uygulama vardı - hatta dizin içeriğini (bir dosyaya boru) listelemek günler aldı ve 100 MB boyutunda bir çıktı dosyası oluşturdu. Şimdi bir veritabanında onlar kolayca taşıyabilir veya yedekleme tek bir dosya var.
Richard

1
@Seun Osewa: Her dosya sisteminin sınırlamaları vardır ... ve aynı dizinde milyonlarca girişi saklamakta sorun olmayan birini biliyorsanız, lütfen bana bildirin!
Guillaume

1
@Seun Osewa: Veritabanı şimdi 5,4 M kayıtlarla 28 GB'a kadar. Ben veritabanı tablosunu bölümlemek zorunda kaldım, böylece yaklaşık 5GB boyutunda yedeklenecek birkaç dosyam var. )
Richard

22

Kimsenin bahsetmediği bir şey, DB'nin atomik eylemleri, işlemsel bütünlüğü garanti ettiği ve eşzamanlılıkla uğraştığıdır. Referans olarak bütünlük bile bir dosya sistemiyle pencerenin dışındadır - Peki dosya adlarınızın gerçekten doğru olduğunu nasıl anlarsınız?

Resimlerinizi bir dosya sisteminde alıyorsanız ve birisi yeni bir sürüm yazarken veya dosyayı silerken dosyayı okuyorsa - ne olur?

Blobları kullanıyoruz çünkü yönetilmesi daha kolay (yedekleme, çoğaltma, aktarma). Bizim için iyi çalışıyorlar.


Belirli bir görüntü için iki eşzamanlı güncellemeye sahip olma olasılığı nedir?
Arafangion

1
sorun yaşamak için eş zamanlı güncellemelere ihtiyacınız yoktur - bu bir okuma ve yazma olabilir. Bizim durumumuzda bunun gerçekleşmesi neredeyse garantilidir.
Draemon

20

Bir veritabanındaki görüntülere yalnızca dosya yollarını depolamayla ilgili sorun, veritabanının bütünlüğünün artık zorlanamamasıdır.

Dosyayolunun işaret ettiği gerçek görüntü kullanılamaz duruma gelirse, veritabanı istemeden bir bütünlük hatasına sahiptir.

Görüntülerin aranan gerçek veriler olduğu ve bir tür dosya sistemiyle (dosya sistemine bağımsız olarak erişiliyorsa) arayüz kurmak yerine tek bir entegre veritabanında daha kolay yönetilebileceği (görüntüler aniden kaybolmayacak) göz önüne alındığında, görüntüler aniden "kaybolur"), ben onları doğrudan bir BLOB ya da böyle depolamak için giderdim.


17

Eskiden çalıştığım bir şirkette bir Oracle 8i (sonra 9i) veritabanında 155 milyon görüntü sakladık. 7.5 TB değerinde.


5
Kesinlikle. Görünüşe göre veritabanı şimdi çok daha büyük. Veritabanında veri bulunması, veritabanını farklı sitelerde çoğaltmanın da çok daha kolay olduğu anlamına gelir.
graham.reeds

Aslında veritabanına bir dosya sistemi veya bunun gibi bir şey monte edebileceği bir Oracle gösteri gördüm. Yaptığın bu mu biliyor musun? (Üzgünüm, Oracle ile clueless ben belki çöp konuşuyorum.)
Stu Thompson

Ben öyle düşünmüyorum - bir veritabanı olarak görüntüleri veritabanında saklıyordu. Veritabanı agresif bir şekilde ayarlandı - Alanlar eklendiğinde ve kaldırıldıkça, görüntülerin boyutuyla ilgili birden fazla tartışmayı hatırlıyorum. Her şey sınırlandı.
graham.reeds

14

Normalde, altyapınızın (veritabanı) bir bölümünü ölçeklendirmenin en pahalı ve en zorunu alıp içine tüm yükü koymaya karşı fırtınalı bir şekilde karşıyım. Öte yandan: Özellikle birden çok web sunucunuz olduğunda ve bir şekilde verileri senkronize tutmanız gerektiğinde yedekleme stratejisini büyük ölçüde basitleştirir.

Diğer birçok şey gibi, beklenen boyuta ve Bütçeye bağlıdır.


13

Tüm görüntülerini SQL2005 blob alanlarında saklayan bir belge görüntüleme sistemi uyguladık. Şu anda birkaç yüz GB var ve mükemmel tepki süreleri görüyoruz ve performans düşüşü çok az veya hiç yok. Ayrıca, yönetmeliklere uygunluk açısından, yeni gönderilen belgeleri standart bir NTFS dosya sistemi olarak gösteren bir optik müzik kutusu sistemine arşivleyen bir ara katman katmanımız var.

Sonuçlardan özellikle memnunuz:

  1. Çoğaltma ve Yedekleme Kolaylığı
  2. Doküman sürüm sistemini kolayca uygulayabilme

11

Bu web tabanlı bir uygulama ise, görüntüleri Amazon'un S3 veya Nirvanix platformu gibi bir üçüncü taraf depolama dağıtım ağında depolamanın avantajları olabilir.


11

Varsayım: Uygulama web etkin / web tabanlıdır

Kimse gerçekten bu bahsetmedi şaşırdım ... uzman olan başkalarına delege -> bir üçüncü taraf görüntü / dosya barındırma sağlayıcı kullanın .

Dosyalarınızı ücretli bir çevrimiçi hizmette depolayın.

Burada bundan bahseden başka bir StackOverflow konuları .

Bu konu neden 3. taraf barındırma sağlayıcısı kullanmanız gerektiğini açıklamaktadır.

Buna değer. Verimi depolarlar. Sunucularınızdan istemci isteklerine vb. Yüklenen bant genişliği yok.


10

SQL Server 2008'de değilseniz ve belirli görüntü dosyalarını veritabanına koymak için bazı sağlam nedenleriniz varsa, "her ikisi de" yaklaşımını alıp dosya sistemini geçici bir önbellek olarak kullanabilir ve veritabanını ana depo olarak kullanabilirsiniz .

Örneğin, iş mantığınız, bir görüntü dosyasının sunulmadan önce diskte olup olmadığını kontrol edebilir ve gerektiğinde veritabanından alabilir. Bu size birden çok web sunucusu ve daha az senkronizasyon sorunu sağlar.


+1 Bu aynı zamanda orijinal görüntüyü saklamanızı sağlar, boyut / sıkıştırmanın daha sonra değiştirilmesine izin verirken önbelleğe alınmış / optimize edilmiş sürüm sunar
Deebster

7

Bu "gerçek dünya" örneği ne kadar emin değilim, ama şu anda orada kartlar için görüntüleri de dahil olmak üzere bir ticaret kart oyunu için ayrıntıları depolayan bir uygulama var. Veri tabanı için kayıt sayısının bugüne kadar sadece 2851 kaydı olduğu kabul edildi, ancak bazı kartların birden fazla kez serbest bırakıldığı ve alternatif resimlere sahip olduğu göz önüne alındığında, aslında resmin "birincil karesini" taramak ve daha sonra dinamik olarak daha verimli oldu istendiğinde kart için kenarlık ve çeşitli efektler oluşturur.

Bu görüntü kitaplığının orijinal yaratıcısı, görüntüyü isteğe bağlı olarak oluşturan bir veri erişim sınıfı oluşturdu ve görüntüleme ve bireysel kart için oldukça hızlı.

Bu, yeni kartlar piyasaya sürüldüğünde dağıtım / güncellemeleri kolaylaştırır, tüm görüntü klasörünü sıkıştırmak ve bunları borudan aşağı göndermek ve uygun klasör yapısının oluşturulmasını sağlamak yerine, veritabanını günceller ve kullanıcının tekrar indirmesini sağlar. Bu şu anda 56 MB'a kadar boyutlandırıyor, bu harika değil, ancak gelecekteki sürümler için artımlı bir güncelleme özelliği üzerinde çalışıyorum. Buna ek olarak, çevirmeli ağ üzerinden gelenlerin uygulamayı indirme gecikmesi olmadan almasına izin veren uygulamanın "görüntü yok" sürümü vardır.

Bu çözüm, uygulamanın kendisi masaüstünde tek bir örnek olarak hedeflendiğinden bugüne kadar çok çalıştı. Tüm bu verilerin çevrimiçi erişim için arşivlendiği bir web sitesi var, ancak hiçbir şekilde bunun için aynı çözümü kullanmam. Görüntüler için yapılan isteklerin sıklığı ve hacmine göre daha iyi ölçekleneceğinden dosya erişiminin tercih edileceğini kabul ediyorum.

Umarım bu çok fazla gevezelik değildir, ancak konuyu gördüm ve nispeten başarılı küçük / orta ölçekli bir uygulamadan bazı görüşlerimi sunmak istedim.


Çoğaltma ile uğraşırken, görüntüleri veritabanında saklamak IMO'dan çok daha üstündür.
Bip bip


7

Saklayacağınız görüntü sayısına ve ayrıca boyutlarına bağlıdır. Geçmişte görüntüleri saklamak için veritabanları kullandım ve tecrübelerim oldukça iyi oldu.

IMO, Görüntüleri saklamak için veritabanı kullanmanın artıları,

Y. görüntüleri tutmak için FS yapısını gerekmez
öğelerin daha kaydedilebilmesine olduğunda B. Veritabanı endeksleri FS ağaçları daha iyi performans
C. Zekice ayarlanmış veritabanı sorgu önbelleğe de iyi bir iş yapmak sonuçları
D. Yedekler basittir. Çoğaltma ayarınız varsa ve içerik kullanıcıya yakın bir sunucudan dağıtılırsa da iyi çalışır. Bu gibi durumlarda, açık senkronizasyon gerekli değildir.

Resimleriniz küçük olacaksa (diyelim <64k) ve db'nizin depolama motoru satır içi (kayıtta) BLOB'ları destekliyorsa, dolaylı bir gereklilik olmadığı için performansı daha da geliştirir (Referans yeri sağlanır).

Az sayıda büyük boyutlu görüntü ile uğraşırken görüntüleri saklamak kötü bir fikir olabilir. Görüntüleri db içinde saklamanın bir başka sorunu da, oluşturma gibi meta veriler, değişiklik tarihlerinin uygulamanız tarafından ele alınması gerektiğidir.


7

Son zamanlarda PDF / Word dosyalarını bir MySQL tablosunda saklayan bir PHP / MySQL uygulaması oluşturdum (şu ana kadar dosya başına 40 MB kadar büyük).

Artıları:

  • Yüklenen dosyalar, diğer her şeyle birlikte yedekleme sunucusuna çoğaltılır, ayrı bir yedekleme stratejisine gerek yoktur (gönül rahatlığı).
  • Bir yükleme / klasörüm olması ve tüm uygulamalarıma nerede olduğunu söylemem gerekmediğinden web sunucusunu kurmak biraz daha basittir.
  • Veri bütünlüğünü artırmak için işlemleri düzenleme için kullanıyorum - artık ve eksik dosyalar için endişelenmem gerekmiyor

Eksileri:

  • mysqldump artık tablolardan birinde 500MB dosya verisi bulunduğundan looooong zamanını alıyor.
  • Genel olarak dosya sistemine kıyasla çok fazla bellek / işlemci verimli değil

Uygulamama başarılı diyebilirim, yedekleme gereksinimlerini karşılar ve projenin düzenini basitleştirir. Performans, uygulamayı kullanan 20-30 kişi için iyi.


6

Benim deneyimim her iki durumu da yönetmek zorunda kaldım: veritabanında saklanan görüntüler ve dosya sisteminde db'de saklanan görüntüler.

Veri erişim katmanınız sadece veritabanı nesneleri ile uğraşmak zorunda kalacağı için, ilk çözüm, veritabanındaki görüntüler, biraz "temiz" dir; ancak bu sadece düşük sayılarla uğraşmanız gerektiğinde iyidir.

Açıkçası ikili büyük nesnelerle uğraşırken veritabanı erişim performansı kötüleşir ve veritabanı boyutları çok büyüyerek performans kaybına neden olur ... ve normalde veritabanı alanı dosya sistemi alanından çok daha pahalıdır.

Öte yandan, dosya sisteminde büyük ikili nesnelerin depolanması, hem veritabanı hem de dosya sistemini dikkate almanız gereken yedekleme planlarına sahip olmanıza neden olacaktır ve bu, bazı sistemler için bir sorun olabilir.

Dosya sistemi için gitmenin bir başka nedeni, görüntü verilerinizi (veya sesleri, videoyu, her türlü) üçüncü taraf erişimiyle paylaşmanız gerektiğidir: Bu günlerde "dışarıdan" erişilmesi gereken resimleri kullanan bir web uygulaması geliştiriyorum "benim web çiftliği öyle ki ikili veri almak için bir veritabanı erişimi basitçe imkansız. Bu yüzden bazen sizi bir seçime yönlendirecek tasarım hususları da vardır.

Ayrıca, bu seçimi yaparken, ikili nesnelere erişirken izin ve kimlik doğrulama ile uğraşmak zorunda kalırsanız düşünün: bu gereksinimler normalde veriler db'de saklandığında daha kolay bir şekilde çözülebilir.


4

Bir zamanlar görüntü işleme uygulaması üzerinde çalıştım. Yüklenen görüntüleri / images / [bugünün tarihi] / [kimlik numarası] gibi bir dizinde sakladık. Ancak görüntülerden meta verileri (exif verileri) çıkardık ve bunu bir zaman damgası ve benzeri ile birlikte veritabanında sakladık.


4

Önceki bir projede görüntüleri dosya sisteminde depoladım ve bu da yedeklemeler, çoğaltma ve dosya sisteminin veritabanı ile senkronizasyondan çıkmasına neden olan çok fazla baş ağrısına neden oldu.

En son projemde görüntüleri veritabanında saklıyorum ve dosya sisteminde önbelleğe alıyorum ve gerçekten iyi çalışıyor. Şimdiye kadar hiç problem yaşamadım.


3

İkincisi dosya yollarıyla ilgili öneri. Büyük ish varlık koleksiyonlarını yönetmek için gereken birkaç proje üzerinde çalıştım ve işleri doğrudan DB'de saklamak için yapılan herhangi bir girişim, uzun vadeli ağrı ve hayal kırıklığına neden oldu.

Onları DB'de saklamak konusunda düşünebildiğim tek gerçek "profesyonel" tek tek görüntü varlıklarının kolay olma potansiyeli. Kullanılacak dosya yolu yoksa ve tüm görüntüler doğrudan DB'nin dışına aktarılırsa, kullanıcının erişmemesi gereken dosyaları bulma tehlikesi yoktur.

Bu, web erişilemeyen bir dosya deposundan veri çeken bir ara komut dosyası ile daha iyi çözülmüş gibi görünüyor. Yani DB depolama GERÇEKTEN gerekli değildir.


3

Sokaktaki kelime, veritabanınızın bunu yapabileceğini kanıtlamaya çalışan bir veritabanı satıcısı olmadıkça (örneğin, Microsoft'un Terraserver'ın bir bajillion görüntüsünü SQL Server'da depolaması hakkında övünme olduğunu) çok iyi bir fikir olmadığıdır. Alternatif - görüntülerin veritabanında dosya sunucuları ve yollarda depolanması çok daha kolay olduğunda, neden rahatsız edesiniz ki? Kabarcık alanları, SUV'lerin off-road yeteneklerine benziyor - çoğu insan onları kullanmıyor, genellikle başını belaya sokanlar ve sonra yapanlar var, ancak sadece eğlenmek için.


3

Veritabanında bir görüntünün saklanması, görüntü verilerinin dosya sisteminde bir yerde bittiği, ancak doğrudan erişemeyeceğiniz şekilde gizlendiği anlamına gelir.

+ Ves:

  • veritabanı bütünlüğü
  • bir resim eklendiğinde veya silindiğinde dosya sistemini senkronize tutmak konusunda endişelenmenize gerek olmadığından yönetimi kolaydır

-ves:

  • performans cezası - veritabanı araması genellikle dosya sistemi aramasından daha yavaştır
  • resmi doğrudan düzenleyemezsiniz (kırp, yeniden boyutlandır)

Her iki yöntem de yaygındır ve uygulanır. Avantaj ve dezavantajlarına bir göz atın. Her iki durumda da, dezavantajların nasıl üstesinden gelileceğini düşünmeniz gerekir. Veritabanında saklamak genellikle veritabanı parametrelerini değiştirmek ve bir tür önbellek uygulamak anlamına gelir. Dosya sistemi kullanmak, dosya sistemi + veritabanını senkronize tutmanın bir yolunu bulmanızı gerektirir.

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.