Görüntüleri SQL Server'da mı saklıyorsunuz?


191

Küçük bir demo sitesi yaptım ve üzerinde sql sunucusundaki bir görüntü sütununda görüntüleri saklıyorum. Birkaç sorum var ...

  • Bu kötü bir fikir mi?

  • Büyüyünce sitemdeki performansı etkiler mi?

Alternatif, görüntüyü diskte saklamak ve sadece görüntüye referansı veritabanında saklamak olacaktır. Bu, birçok insanın sahip olduğu ortak bir ikilem olmalı. Biraz tavsiye edilir ve eğer yapabilseydim aslında daha az hata yapmak için mutlu olurdu.


5
2017'de bu sayı için yeni bir ekleme var mı? Bu bugün itibariyle hala geçerli mi?
Haikal Nashuha

Yanıtlar:


272

Microsoft Research tarafından Blob veya Blob Değil adlı iyi bir makale var .

Çok sayıda performans testi ve analizinden sonra yaptıkları sonuç şudur:

  • resimleriniz veya belgeniz genellikle 256 KB'ın altındaysa, bunları bir veritabanı VARBINARY sütununda saklamak daha verimlidir

  • resimleriniz veya belgeniz genellikle 1 MB'tan büyükse, bunları dosya sisteminde depolamak daha verimlidir (ve SQL Server 2008'in FILESTREAM özniteliğiyle, hala işlem kontrolü altındadır ve veritabanının bir parçasıdır)

  • bu ikisi arasında, kullanımınıza bağlı olarak biraz fırlatma

Resimlerinizi bir SQL Server tablosuna koymaya karar verirseniz, bu resimleri saklamak için ayrı bir tablo kullanmanızı şiddetle tavsiye ederim - çalışan fotoğrafını çalışan tablosunda saklamayın - ayrı bir tabloda saklayın. Bu şekilde, Çalışan tablosu, sorgularınızın bir parçası olarak her zaman çalışan fotoğrafını da seçmeniz gerekmediğini varsayarak, yalın ve ortalama ve çok verimli kalabilir.

Dosya grupları için, giriş için Dosyalar ve Dosya Grubu Mimarisi'ne bakın. Temel olarak, veritabanınızı en başından itibaren büyük veri yapıları için ayrı bir dosya grubuyla oluşturabilir veya daha sonra ek bir dosya grubu ekleyebilirsiniz. Buna "LARGE_DATA" diyelim.

Şimdi, VARCHAR (MAX) veya VARBINARY (MAX) sütunlarını depolaması gereken yeni bir tablonuz olduğunda, büyük veriler için bu dosya grubunu belirtebilirsiniz:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Dosya gruplarındaki MSDN girişine göz atın ve onunla oynayın!


Bu iyi bir şey mi yoksa kötü bir şey mi? • resimleriniz veya belgeniz genellikle 1 MB'den büyükse, dosya sisteminde saklamak daha verimlidir (ve SQL Server 2008'in FILESTREAM özniteliğiyle, hala işlem kontrolü altındadır ve veritabanının bir parçası)
htm11h

Mükemmel cevap. Görüntü verileri için neden özel bir tablo kullanmanızı önerdiğinizi ayrıntılı olarak açıklamak istiyorsanız , dba.SE'de bunun için ayrı bir soru oluşturdum .
Heinzi

15

Bu ikileme bir kez düştüm ve görüş için Google'da biraz araştırma yaptım. Bulduğum şey, birçok kişinin görüntüleri daha büyük görüntüler için diske daha iyi kaydettiğini görmesiydi, mySQL ise özellikle PHP gibi dillerden daha kolay erişime izin veriyor.

Benzer bir soru buldum

MySQL BLOB vs Küçük PNG Görüntüleri Saklamak için Dosya?

Son kararım, profil resmi gibi şeyler için, kullanıcı başına orada olması gereken küçük bir kare görüntü için, mySQL'in bir sürü başparmak hdd'de depolamaktan daha iyi olacağı, fotoğraf albümleri ve bunun gibi şeyler için ise klasörler / resim dosyaları daha iyidir.

Umarım yardımcı olur



11

Resimleri web sunucusundaki bir katalogda değil veritabanında saklamak neden iyi olabilir.

İstemcinin yıllardır kullandığı, sunucudaki bir klasörde depolanan çok sayıda resim içeren bir uygulama yaptınız.

Şimdi size geliyorlar. Sunucu yok edildi ve yeni bir sunucuya geri yüklemeleri gerekiyor. Artık eski sunucuya erişimi yok. Sahip oldukları tek yedekleme veritabanı yedeklemesidir.

Tabii ki kaynak var ve yeni sunucuya basitçe dağıtabilir, SqlServer'ı yükleyebilir ve veritabanını geri yükleyebilirsiniz. Ama şimdi tüm resimler gitti.

Resimleri SqlServer'a kaydettiyseniz, her şey eskisi gibi çalışacaktır.

Sadece 2 sentim.


3
İyi bir nokta. Görüntülerin yedekleri veritabanı yedekleme kadar önemlidir ... bazen daha da fazla.
Chris Catignani

Ayrıca dosya sistemindeki resimlerin de ağ izinlerine ihtiyacı vardır.
Chris Catignani

2
Ağ izinleri iyi bir noktadır. Ancak yalnızca DB'nin yedeğini alacağınız bir durum görmüyorum. Uygulama ve dosyaların yedeğini mutlaka alırsınız. Kolayca DB kaybedebilir ama dosyaları var.
Norbert Norbertson



7

Performans sorunları geçerli olsa da, uygulamada görüntüleri bir veritabanında saklamaktan kaçınmanızın gerçek nedenleri veritabanı yönetimi nedenlerinden kaynaklanmaktadır. Veritabanınız çok hızlı büyüyecek ve veritabanları basit dosya depolamasından daha pahalıya mal olacaktır. Veritabanı yedeklemeleri ve geri yüklemeleri, dosya yedekleme geri yüklemelerinden çok daha pahalı ve zaman alıcıdır. Bir tutamda, daha küçük bir veritabanını görüntülerle şişirilmiş olandan çok daha hızlı bir şekilde geri yükleyebilirsiniz. Azure'daki 1 TB dosya depolama alanını 1 TB veritabanıyla karşılaştırın; maliyetteki büyük farkı göreceksiniz.


0

Deneyimlerime göre, başka bir yerde saklanan resimlerin URL'sine saklamak basit bir proje için en iyi yoldur.

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.