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?
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:
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:
Ç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.
Öte yandan ilişkili sorunlar var
Dosya deposu. Facebook mühendisleri bu konuda çok konuştu. Bir çıkarılması, bir dizindeki dosyaların pratik sınırını bilmekti.
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:
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.
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.
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.
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.
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.
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.
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.
İş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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
SQL Server 2008, her iki dünyanın da en iyisine sahip bir çözüm sunar: Filestream veri türü .
Normal bir tablo gibi yönetin ve dosya sisteminin performansına sahip olun.
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.
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ı:
Eksileri:
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.
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.
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.
Ö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.
İ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.
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.
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:
-ves:
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.