Menyimpan gambar dalam SQL Server?

191

Saya telah membuat situs demo kecil dan di atasnya saya menyimpan gambar dalam kolom gambar di server sql. Beberapa pertanyaan yang saya miliki adalah ...

  • Apakah ini ide yang buruk?

  • Apakah ini akan memengaruhi kinerja di situs saya ketika situs itu tumbuh?

Alternatifnya adalah dengan menyimpan gambar pada disk dan hanya menyimpan referensi ke gambar dalam database. Ini pasti dilema umum yang dialami banyak orang. Saya akan menyambut beberapa saran dan akan dengan senang hati melakukan kesalahan kecil jika saya bisa.

marko
sumber
5
Apakah ada tambahan baru untuk masalah ini di 2017? Apakah ini masih berlaku hingga hari ini?
Haikal Nashuha

Jawaban:

273

Ada makalah yang sangat bagus oleh Microsoft Research bernama To Blob atau Not To Blob .

Kesimpulan mereka setelah sejumlah besar tes kinerja dan analisis adalah ini:

  • jika gambar atau dokumen Anda biasanya berukuran di bawah 256KB, menyimpannya dalam kolom database VARBINARY lebih efisien

  • jika gambar atau dokumen Anda biasanya berukuran lebih dari 1 MB, menyimpannya dalam sistem file lebih efisien (dan dengan atribut SQL Server 2008 FILESTREAM, mereka masih di bawah kontrol transaksional dan bagian dari database)

  • di antara keduanya, ini sedikit tergantung tergantung pada penggunaan Anda

Jika Anda memutuskan untuk memasukkan gambar Anda ke tabel SQL Server, saya akan sangat menyarankan menggunakan tabel terpisah untuk menyimpan foto-foto itu - jangan menyimpan foto karyawan di tabel karyawan - simpan di tabel terpisah. Dengan begitu, tabel Karyawan dapat tetap ramping dan berarti serta sangat efisien, dengan asumsi Anda tidak selalu perlu memilih foto karyawan juga, sebagai bagian dari kueri Anda.

Untuk filegroup, lihat Arsitektur File dan Filegroup untuk intro. Pada dasarnya, Anda akan membuat basis data dengan grup grup terpisah untuk struktur data besar sejak awal, atau menambahkan grup grup tambahan nanti. Sebut saja "LARGE_DATA".

Sekarang, setiap kali Anda memiliki tabel baru untuk dibuat yang perlu menyimpan kolom VARCHAR (MAX) atau VARBINARY (MAX), Anda dapat menentukan grup file ini untuk data besar:

 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

Lihat intro MSDN di filegroup, dan mainkan!

marc_s
sumber
Apakah ini hal yang baik atau buruk .... • jika gambar atau dokumen Anda biasanya berukuran lebih dari 1 MB, menyimpannya dalam sistem file lebih efisien (dan dengan atribut FILESTREAM SQL Server 2008, mereka masih di bawah kontrol transaksional dan bagian dari database)
htm11h
Jawaban yang bagus Jika Anda ingin menjelaskan secara terperinci mengapa Anda merekomendasikan untuk menggunakan tabel khusus untuk data gambar, saya telah membuat pertanyaan terpisah untuk itu di dba.SE .
Heinzi
15

Saya jatuh ke dalam dilema ini sekali, dan meneliti sedikit di google untuk pendapat. Apa yang saya temukan adalah bahwa memang banyak yang melihat menyimpan gambar ke disk lebih baik untuk gambar yang lebih besar, sementara mySQL memungkinkan akses yang lebih mudah, khususnya dari bahasa seperti PHP.

Saya menemukan pertanyaan serupa

MySQL BLOB vs File untuk Menyimpan Gambar PNG Kecil?

Putusan akhir saya adalah bahwa untuk hal-hal seperti gambar profil, hanya gambar persegi kecil yang perlu ada di sana per pengguna, mySQL akan lebih baik daripada menyimpan banyak jempol di hdd, sedangkan untuk album foto dan hal-hal seperti itu, folder / File gambar lebih baik.

Semoga ini bisa membantu

Kevin Chavez
sumber
14

Saya lebih suka menyimpan gambar dalam direktori, lalu menyimpan referensi ke file gambar dalam database.

Namun, jika Anda menyimpan gambar dalam basis data, Anda harus mempartisi basis data Anda sehingga kolom gambar berada di file terpisah.

Anda dapat membaca lebih lanjut tentang menggunakan filegroup di sini http://msdn.microsoft.com/en-us/library/ms179316.aspx .

John Hartsock
sumber
11

Mengapa bisa baik untuk menyimpan gambar dalam database dan tidak dalam katalog di server web.

Anda telah membuat aplikasi dengan banyak gambar yang disimpan dalam folder di server, yang telah digunakan klien selama bertahun-tahun.

Sekarang mereka mendatangi Anda. Server mereka telah hancur dan mereka harus mengembalikannya ke server baru. Mereka tidak memiliki akses ke server lama lagi. Satu-satunya cadangan yang mereka miliki adalah cadangan basis data.

Anda tentu saja memiliki sumber dan dapat dengan mudah menyebarkannya ke server baru, menginstal SqlServer dan mengembalikan database. Tapi sekarang semua foto hilang.

Jika Anda telah menyimpan gambar di SqlServer semuanya akan berfungsi seperti sebelumnya.

Hanya 2 sen saya.

Erling Ervik
sumber
3
Poin yang bagus. Cadangan gambar sama pentingnya dengan cadangan basis data ... kadang-kadang bahkan lebih.
Chris Catignani
Juga gambar pada sistem file memerlukan izin jaringan juga.
Chris Catignani
2
Izin jaringan adalah poin yang bagus. Tapi saya tidak melihat kasus di mana Anda hanya memiliki cadangan DB. Anda pasti memiliki cadangan aplikasi dan file. Anda bisa dengan mudah kehilangan DB tetapi memiliki file.
Norbert Norbertson
7

Sementara masalah kinerja valid, alasan sebenarnya dalam praktiknya bahwa Anda harus menghindari menyimpan gambar dalam database adalah untuk alasan manajemen basis data. Basis data Anda akan tumbuh sangat cepat dan biaya database jauh lebih banyak daripada penyimpanan file sederhana. Pencadangan dan pemulihan basis data jauh lebih mahal dan memakan waktu daripada pemulihan cadangan file. Dalam keadaan darurat, Anda dapat memulihkan basis data yang lebih kecil jauh lebih cepat daripada yang penuh dengan gambar. Bandingkan 1 TB penyimpanan file di Azure ke database 1 TB dan Anda akan melihat perbedaan besar dalam biaya.

J Miglietta
sumber
0

Dalam pengalaman saya, menyimpan ke url ke gambar yang disimpan di lokasi lain adalah cara terbaik untuk proyek sederhana.

Beverly Ukandu
sumber