Simpan gambar sebagai file atau dalam database untuk aplikasi web?

124

Pertanyaan saya cukup umum dan saya tahu mungkin tidak ada jawaban 100% untuk itu. Saya sedang membangun solusi web ASP .NET yang akan menyertakan banyak gambar dan mudah-mudahan cukup banyak lalu lintas. Saya benar-benar ingin mencapai kinerja.

Haruskah saya menyimpan gambar di Database atau di sistem File? Dan terlepas dari jawabannya, saya lebih tertarik pada mengapa memilih cara tertentu.

Terima kasih banyak, Stefan

DUPLIKAT : Menyimpan Gambar di DB - Ya atau Tidak? , Bagaimana cara menyimpan gambar di sistem file Anda , Menyimpan sejumlah kecil gambar: blob atau fs? dan mungkin beberapa lainnya.


KOMENTAR: Terima kasih atas banyak jawaban yang bagus. Saya akan menggunakan solusi berbasis file bahkan jika saya menyukai gagasan memiliki solusi berbasis database 100%. Tampaknya saat ini ada solusi yang baik untuk melakukan apa yang saya inginkan dengan database dll, tetapi saya memiliki beberapa alasan untuk tidak melakukannya.

  • Saya akan menggunakan solusi yang di-host, saya memiliki penyimpanan dalam jumlah besar (10gb) tetapi hanya 300mb untuk database. Ini akan memakan banyak biaya untuk penyimpanan ekstra di DB.

  • Saya bukan ahli DB dan juga tidak mengendalikan pengaturan DB. Solusi berbasis DB mungkin memerlukan konfigurasi kustom seperti yang terlihat.

Jika kita akan pindah untuk menjalankan situs di server kita sendiri, saya mungkin mempertimbangkan solusi berbasis DB. terima kasih, Stefan

StefanE
sumber
1
Harap tentukan database yang Anda gunakan.
Gerrie Schenck
1
Saya bermaksud untuk menggunakan MSSQL versi yang lebih baru.
StefanE
1
@StefanE, Sistem file adalah, untuk semua maksud dan tujuan, database khusus yang dioptimalkan untuk penyimpanan file.
LukeH

Jawaban:

175

Simpan gambar pada sistem file dan lokasi gambar di database.

Mengapa? Karena...

  1. Anda akan dapat menampilkan gambar sebagai file statis.
  2. Tidak ada akses database atau kode aplikasi yang diperlukan untuk mengambil gambar.
  3. Gambar dapat disajikan dari server yang berbeda untuk meningkatkan kinerja.
  4. Ini akan mengurangi bottleneck database.
  5. Basis data pada akhirnya menyimpan datanya pada sistem file.
  6. Gambar dapat dengan mudah di-cache saat disimpan di sistem file.
Akbar ibrahim
sumber
1
Juga, di SQL Server saat Anda menyimpan gambar sebagai bidang "Gambar", inilah yang dilakukan SQL secara efektif - menyimpan penunjuk ke file di disk di suatu tempat. Beginilah cara mengatasi batas halaman 8KB.
Zhaph - Ben Duguid
9
Ini sebenarnya telah diatasi adalah SQL Server 2008. Ada tipe baru yang diperkenalkan FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx yang memungkinkan untuk memanfaatkan "kinerja sistem file dan pada saat yang sama mempertahankan konsistensi transaksional antara data tidak terstruktur dan data terstruktur yang sesuai "
kristof
Ya, Anda benar. pertanyaan saya adalah berapa ukuran gumpalan? atau berapa banyak memori yang dapat disimpannya?
Amir
11

Dalam proyek saya yang baru dikembangkan, saya menyimpan gambar (dan semua jenis dokumen biner) sebagai kolom gambar dalam tabel database.

Keuntungan memiliki file yang disimpan dalam database jelas bahwa Anda tidak akan berakhir dengan file yang tidak direferensikan di harddisk jika record dihapus, karena sinkronisasi antara database (= meta data) dan harddisk (= penyimpanan file) tidak built-in dan harus diprogram secara manual.

Menggunakan teknologi saat ini, saya sarankan Anda menyimpan gambar di kolom FILESTREAM SQL Server 2008 (setidaknya itulah yang akan saya lakukan dengan proyek saya berikutnya), karena mereka menggabungkan keuntungan dari menyimpan data dalam database DAN memiliki biner besar dalam file terpisah (di Setidaknya menurut iklan;))

devio
sumber
Sudahkah Anda menguji fungsionalitas Filestream sama sekali?
StefanE
1
Sebenarnya, saat menghapus record DB, dapat dikodekan untuk menghapus dari filesystem juga. Jadi saya merasa lebih baik untuk menyimpan di FS daripada DB
kailash19
9

Pepatahnya selalu "File di sistem file, file metadata di database"

Matt Darby
sumber
6

Lebih baik menyimpan file sebagai file. Database yang berbeda menangani data Blob secara berbeda, jadi jika Anda harus memigrasi back end, Anda mungkin mendapat masalah.

Saat menyajikan impages, <img src = ke file yang sudah ada di server cenderung lebih cepat daripada membuat file sementara dari bidang database dan mengarahkan tag <img ke sana.

Saya menemukan jawaban ini dari googling pertanyaan Anda dan membaca komentar di http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html

sparklewhiskers
sumber
1
posting yang dirujuk sepertinya agak ketinggalan zaman.
devio
6

Saya biasanya suka memiliki file biner di database karena:

  • integritas data: tidak ada file yang tidak direferensikan, tidak ada jalur di db tanpa file yang terkait
  • konsistensi data: ambil database dump dan itu saja. tidak ada "O, saya lupa targz direktori data ini."
chburd
sumber
4

Menyimpan gambar dalam database menambahkan overhead DB untuk menyajikan gambar tunggal dan membuatnya sulit untuk dipindahkan ke penyimpanan alternatif (S3, Akami) jika Anda berkembang ke level tersebut. Menyimpannya dalam database membuat lebih mudah untuk memindahkan aplikasi Anda ke server yang berbeda karena hanya DB yang perlu dipindahkan sekarang.

Menyimpan gambar di disk memudahkan untuk dipindahkan ke penyimpanan alternatif, membuat gambar menjadi elemen statis sehingga Anda tidak perlu dipusingkan dengan header HTTP di aplikasi web Anda untuk membuat gambar dapat disimpan dalam cache. Kelemahannya adalah jika Anda pernah memindahkan aplikasi Anda ke server yang berbeda, Anda harus ingat untuk memindahkan gambar juga; sesuatu yang mudah dilupakan.

Adam Hawes
sumber
3

Untuk aplikasi berbasis web, Anda akan mendapatkan kinerja yang lebih baik dengan menggunakan sistem file untuk menyimpan gambar Anda. Melakukan hal itu akan memungkinkan Anda untuk dengan mudah mengimplementasikan caching gambar di berbagai level dalam aplikasi Anda. Ada beberapa keuntungan menyimpan gambar dalam database, tetapi sebagian besar keuntungan tersebut datang dengan aplikasi berbasis klien.

Dillie-O
sumber
0

Hanya untuk menambahkan lebih banyak lagi ke jawaban yang sudah bagus sejauh ini. Anda masih bisa mendapatkan manfaat dari caching dari tingkat web dan mungkin tingkat database jika Anda mengikuti rute yang menyimpan gambar Anda dalam database.

Saya pikir untuk database Anda dapat mencapai ini dengan cara Anda menyimpan gambar yang berkaitan dengan data tekstual yang terkait dengannya dan jika Anda dapat mengakses gambar ke kueri tertentu sehingga database dapat menyimpan kueri tersebut (hanya teori saja. merasa bebas untuk membujuk saya pada bagian itu).

Dengan sisi web, saya akan menebak karena pertanyaan Anda ditandai dengan asp.net bahwa Anda akan menggunakan cara menggunakan http handler untuk menyajikan gambar. Maka Anda memiliki semua manfaat kerangka kerja yang Anda inginkan dan Anda dapat menjaga logika domain Anda lebih bersih hanya dengan meneruskan kunci gambar Anda ke penangan http.

MotoWilliams
sumber
-1

Mengapa tidak memilih database NoSql individu untuk menyimpan file Anda.

Ini memberi Anda integritas data, konsistensi data seperti yang disebutkan @chburd.

Sementara Anda rdbms masih tetap kecil.

Will Wu
sumber
-1
  1. Berikut adalah contoh langkah demi langkah (pendekatan umum, implementasi Spring, Eclipse) untuk menyimpan gambar dalam sistem file dan menyimpan metadatanya di DB - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Berikut ini contohnya juga - http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Anda juga dapat menyelidiki basis kode proyek ini - https://github.com/jdmr/fileUpload . Perhatikan pengontrol ini .
Lord Nighton
sumber