Untuk apa tampilan bagus?

88

Saya hanya mencoba untuk mendapatkan gambaran umum tentang tampilan apa yang digunakan untuk RDBMS. Artinya, saya tahu apa itu view dan bagaimana membuatnya. Saya juga tahu untuk apa saya menggunakannya di masa lalu.

Tapi saya ingin memastikan bahwa saya memiliki pemahaman menyeluruh tentang kegunaan sebuah tampilan dan untuk apa tampilan tidak bermanfaat. Lebih spesifik:

  1. Untuk apa tampilan berguna?
  2. Adakah situasi di mana Anda tergoda untuk menggunakan tampilan padahal Anda tidak boleh menggunakannya?
  3. Mengapa Anda menggunakan tampilan sebagai pengganti dari sesuatu seperti fungsi nilai tabel atau sebaliknya?
  4. Adakah keadaan di mana tampilan mungkin berguna yang tidak terlihat pada pandangan pertama?

(Dan sebagai catatan, beberapa dari pertanyaan ini sengaja dibuat naif. Ini sebagian adalah pemeriksaan konsep.)

Jason Baker
sumber
1
mirip dengan pertanyaan yang diposting di sini: stackoverflow.com/questions/1278521/…
MedicineMan
Saya merasa stackoverflow.com/questions/1278521/… memberikan jawaban yang lebih baik untuk pertanyaan ini.
GinTonic

Jawaban:

43

1) Untuk apa tampilan berguna?

IOPO Hanya Di Satu Tempat

• Apakah Anda menganggap data itu sendiri atau kueri yang mereferensikan tabel yang digabungkan, memanfaatkan tampilan menghindari redundansi yang tidak perlu.

• Tampilan juga menyediakan lapisan abstrak yang mencegah akses langsung ke tabel (dan hasil pemborgol bergantung pada ketergantungan fisik). Bahkan, saya pikir itu praktek yang baik 1 hanya menawarkan akses disarikan data yang mendasari Anda (menggunakan pandangan & fungsi meja-nilai), termasuk pandangan seperti 1 saya hafta mengakui ada banyak dari "Do seperti yang saya katakan, tidak seperti yang saya lakukan "dalam nasihat itu;)

CREATE VIEW AS
      SELECT * FROM tblData


2) Apakah ada situasi di mana Anda tergoda untuk menggunakan view padahal Anda tidak boleh menggunakannya?

Kinerja dalam view join dulu menjadi perhatian (misalnya SQL 2000). Saya bukan ahli, tapi saya tidak mengkhawatirkannya untuk beberapa saat. (Saya juga tidak dapat memikirkan di mana saya saat ini menggunakan gabungan tampilan.)

Situasi lain di mana tampilan mungkin berlebihan adalah saat tampilan hanya direferensikan dari satu lokasi panggilan dan tabel turunan dapat digunakan sebagai gantinya. Sama seperti tipe anonim lebih disukai daripada kelas di .NET jika tipe anonim hanya digunakan / direferensikan sekali.

    • Lihat deskripsi tabel turunan di http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) Mengapa Anda menggunakan tampilan sebagai pengganti sesuatu seperti fungsi nilai tabel atau sebaliknya?

(Selain alasan kinerja) Fungsi nilai tabel secara fungsional setara dengan tampilan berparameter. Faktanya, kasus penggunaan fungsi nilai tabel sederhana yang umum hanyalah menambahkan filter klausa WHERE ke tampilan yang sudah ada dalam satu objek.

4) Apakah ada keadaan di mana tampilan mungkin berguna yang tidak terlihat pada pandangan pertama?

Saya tidak dapat memikirkan penggunaan yang tidak terlihat dari bagian atas kepala saya. (Saya kira jika saya bisa, itu akan membuatnya terlihat;)
6. George Jetson
sumber
9
Saya tidak setuju bahwa masuk akal untuk membuat tampilan di atas meja jika itu adalah SELECT * FROM tblData. Dapatkah Anda memberikan penjelasan mengapa hal ini bermanfaat?
Pengguna Terdaftar
IOPO - Hanya Di Satu Tempat - Apakah ini frasa desain yang terkenal? Saya tidak bisa menemukan banyak referensi tentang itu? Apakah ada bentuk lain, misal KERING?
Robert
1
@Robert Ya, KERING, normalisasi, IOPO, ini semua adalah rasa yang berbeda dari filosofi yang sama.
TylerH
45

Di satu sisi, tampilan seperti antarmuka. Anda dapat mengubah struktur tabel yang mendasari semua yang Anda inginkan, tetapi tampilan memberikan cara agar kode tidak perlu diubah.

Tampilan adalah cara yang bagus untuk menyediakan sesuatu yang sederhana bagi penulis laporan. Jika pengguna bisnis Anda ingin mengakses data dari sesuatu seperti Crystal Reports, Anda dapat memberi mereka beberapa tampilan di akun mereka yang menyederhanakan data - bahkan mungkin mendenormalisasikannya untuk mereka.

Lou Franco
sumber
21

Tampilan dapat digunakan untuk memberikan keamanan (yaitu: pengguna dapat memiliki akses ke tampilan yang hanya mengakses kolom tertentu dalam tabel), tampilan dapat memberikan keamanan tambahan untuk pembaruan, penyisipan, dll. Tampilan juga menyediakan cara untuk nama alias kolom (seperti halnya sp) tetapi pandangan lebih merupakan isolasi dari tabel sebenarnya.

schmoopy
sumber
19

Dalam arti tertentu pandangan mendenormalisasi. Denormalisasi terkadang diperlukan untuk memberikan data dengan cara yang lebih bermakna. Inilah yang dilakukan banyak aplikasi dengan cara pemodelan domain di objek mereka. Mereka membantu menyajikan data dengan cara yang lebih cocok dengan perspektif bisnis.

Kilhoffer
sumber
-1 "tampilan mendenormalisasi"? maaf, tapi itu tidak masuk akal kecuali jika itu memenuhi syarat.
hanya seseorang pada
19
Mereka benar-benar mendenormalisasi. Jika Anda memiliki tabel terkait yang dinormalisasi ke bentuk nomral ke-3 dan Anda membuat tampilan untuk 'meratakan' hubungan itu, bagaimana ini bukan denormalisasi?
Kilhoffer
11

Selain apa yang dinyatakan orang lain, tampilan juga dapat berguna untuk menghapus kueri SQL yang lebih rumit dari aplikasi.

Sebagai contoh, alih-alih dalam aplikasi melakukan:

sql = "pilih a, b dari table1 union pilih a, b dari table2";

Anda bisa mengabstraksikannya menjadi tampilan:

buat tampilan union_table1_table2_v sebagai
pilih a, b dari table1
union
pilih a, b dari table2

dan dalam kode aplikasi, cukup memiliki:

sql = "pilih a, b dari union_table1_table2_v";

Selain itu, jika struktur data berubah, Anda tidak perlu mengubah kode aplikasi, mengompilasi ulang, dan menerapkan ulang. Anda hanya akan mengubah tampilan di db.

CodingWithSpike
sumber
Mengapa saya ingin menulis sql kompleks di database, bukan di aplikasi?
Ivan Virabyan
3
Semakin rumit kueri Anda, semakin besar kemungkinan kueri itu akan berubah di masa mendatang, sebagian karena itu hanya mengenai lebih banyak tabel. Ketika struktur DB berubah, Anda juga harus mengubah kode Anda, dan melakukan rilis. Jika kompleksitas tersebut diabstraksi dalam sebuah tampilan, DBA mungkin dapat membuat perubahan struktural pada tabel bawahan tanpa kode Anda harus berubah.
CodingWithSpike
11

Tampilan menyembunyikan kompleksitas database. Mereka bagus untuk banyak alasan dan berguna dalam banyak situasi, tetapi jika Anda memiliki pengguna yang diizinkan untuk menulis kueri dan laporan mereka sendiri, Anda dapat menggunakannya sebagai pengamanan untuk memastikan mereka tidak mengirimkan dengan desain yang buruk kueri dengan gabungan kartesius jahat yang menghapus server database Anda.

gsarnold
sumber
6

OP bertanya apakah ada situasi di mana Anda mungkin tergoda untuk menggunakan tampilan, tetapi itu tidak sesuai.

Anda tidak ingin menggunakan tampilan untuk menggantikan gabungan kompleks. Artinya, jangan biarkan kebiasaan pemrograman prosedural Anda dalam memecahkan masalah menjadi bagian-bagian yang lebih kecil menuntun Anda untuk menggunakan beberapa tampilan yang digabungkan, bukan satu gabungan yang lebih besar. Melakukan hal itu akan mematikan efisiensi mesin database karena pada dasarnya melakukan beberapa kueri terpisah daripada satu kueri yang lebih besar.

Misalnya, Anda harus menggabungkan tabel A, B, C, dan D bersama-sama. Anda mungkin tergoda untuk membuat tampilan dari tabel A & B dan tampilan dari K & D, lalu menggabungkan kedua tampilan tersebut. Lebih baik hanya menggabungkan A, B, C, dan D dalam satu kueri.

Barry Brown
sumber
Menurut saya itu tidak benar, setidaknya teori DBMS tidak berjalan seperti itu (berbagai implementasi mungkin memutuskan untuk tidak menghormati teori tersebut). Pengurai kueri pada dasarnya akan mengganti tampilan apa pun yang dilihatnya dengan sql yang sesuai, dan pengoptimal akan pergi dari sana. Kedua kasus tersebut harus setara.
SquareCog
Ini juga tidak berlaku saat Anda dapat menambahkan indeks ke tampilan Anda.
therealhoff
Saya paling akrab dengan PostgreSQL dan versi sebelumnya tidak begitu baik dalam menggabungkan kueri. Tapi yang lebih baru jauh lebih baik. Jawaban saya sudah tidak berlaku lagi, setidaknya untuk DBMS khusus ini.
Barry Brown
5

Tampilan dapat memusatkan atau menggabungkan data. Di mana saya berada, kami memiliki sejumlah database yang berbeda di beberapa server terkait yang berbeda. Setiap database menyimpan data untuk aplikasi yang berbeda. Beberapa dari database tersebut menyimpan informasi yang relevan dengan sejumlah aplikasi yang berbeda. Apa yang akan kita lakukan dalam keadaan tersebut adalah membuat tampilan di database aplikasi yang hanya menarik data dari database tempat datanya benar-benar disimpan, sehingga kueri yang kami tulis tidak terlihat seperti melintasi database yang berbeda.

Joel Coehoorn
sumber
4

Tanggapan sejauh ini benar - tampilan bagus untuk memberikan keamanan, denormalisasi (meskipun ada banyak kesulitan jika dilakukan salah), abstraksi model data, dll.

Selain itu, tampilan biasanya digunakan untuk menerapkan logika bisnis (pengguna yang sudah tidak aktif adalah pengguna yang tidak masuk dalam 40 hari terakhir, hal semacam itu).

SquareCog
sumber
jika Anda melakukan denormalisasi dengan menggabungkan 7 tabel referensi, lalu membuat kueri untuk sesuatu yang hanya memerlukan salah satu tabel referensi tersebut. Itu banyak usaha yang sia-sia. Ini menjadi lebih buruk jika Anda mulai bergabung dengan pandangan seperti itu.
SquareCog
apa kau yakin tentang ini? MSDN mengatakan 'Ketika SQL Server memproses kueri yang merujuk ke tampilan berdasarkan nama, definisi tampilan biasanya diperluas hingga hanya merujuk ke tabel dasar. Proses ini disebut perluasan tampilan. Ini adalah bentuk ekspansi makro. ' Saya membayangkan bahwa selama proses perluasan, mesin akan cukup pintar untuk hanya menyertakan tabel yang mendasari (tampilan) yang diperlukan oleh kueri.
Anthony
Anthony, bayangkan sebuah query seperti "pilih foo_col from (pilih foo. *, Bar. * From foo join bar on (foo.id = bar.id)". Dalam query ini, inner select adalah view kita. Bukan jelas bahwa gabungan bilah dapat dihapus dengan aman (pada kenyataannya jika hubungan tidak ketat 1-1, itu tidak bisa). Ini semakin rumit dengan kueri yang lebih kompleks, dan saya tidak akan merekomendasikan mengandalkan RDBMS generik untuk melakukan semua memangkas kaleng manusia. Mungkin SQL Server bisa; Saya akan terkejut jika MySQL melakukannya. Oracle? Postgres? Seperti biasa, baca rencana kueri jika ragu.
SquareCog
3

Tampilan menyimpan banyak pernyataan GABUNG kompleks berulang dalam skrip SQL Anda. Anda bisa merangkum beberapa JOIN kompleks dalam beberapa tampilan dan menyebutnya dalam pernyataan SELECT Anda kapan pun diperlukan. Ini kadang-kadang akan berguna, langsung dan lebih mudah daripada menulis pernyataan bergabung di setiap kueri.

mohammedn
sumber
2

Sebuah view hanyalah sebuah disimpan, bernama pernyataan SELECT. Pikirkan tampilan seperti fungsi perpustakaan.

Gayus
sumber
Bukankah prosedur yang disimpan lebih sesuai untuk ini? Terkadang Anda memerlukan fungsi dengan penghapusan dan pembaruan, tampilan tidak sesuai untuk kebutuhan ini. Tampilan harus dilihat sebagai abstraksi atau cara untuk membatasi pengguna target.
HumbleWebDev
1

Saya ingin menyoroti penggunaan tampilan untuk pelaporan. Seringkali, ada konflik antara normalisasi tabel database untuk mempercepat kinerja, terutama untuk mengedit dan menyisipkan data (penggunaan OLTP), dan denormalisasi untuk mengurangi jumlah tabel bergabung untuk kueri untuk pelaporan dan analisis (penggunaan OLAP). Tentunya OLTP biasanya menang, karena pemasukan data harus memiliki kinerja yang optimal. Membuat tampilan, kemudian, untuk performa pelaporan yang optimal, dapat membantu memuaskan kedua kelas pengguna (pengakses entri data dan laporan).

DOK
sumber
1

Saya ingat SELECT yang sangat lama yang melibatkan beberapa UNION. Setiap UNION menyertakan gabungan ke tabel harga yang dibuat dengan cepat oleh SELECT yang dengan sendirinya cukup panjang dan sulit dipahami. Saya pikir itu akan menjadi ide yang baik untuk memiliki pandangan yang membuat tabel harga. Ini akan mempersingkat SELECT keseluruhan sekitar setengahnya.

Saya tidak tahu apakah DB akan mengevaluasi tampilan sekali, atau setiap kali masuk dipanggil. Ada yang tahu? Jika yang pertama, menggunakan tampilan akan meningkatkan kinerja.

SeaDrive
sumber
Oracle CBO dapat memilih untuk mengevaluasi tampilan sekali (terwujud, mereka menyebutnya) atau menggabungkan SQL untuk tampilan tersebut ke dalam pernyataan pilih lainnya dan menjalankannya. Itu akan memutuskan berdasarkan apa yang memiliki perkiraan biaya yang lebih rendah.
WW.
Jika pernyataan pilih konstan di seluruh kueri dan hanya diulang beberapa kali, maka ekspresi tabel umum (CTE) dapat menyelesaikan masalah. Ini hanya berlaku untuk SQL Server 2005/2008 karena tidak tersedia di SQL Server 2000. Ya, tampilan masih akan dipanggil berulang kali.
Pengguna Terdaftar
@Pengguna Terdaftar: CTE bukanlah spesialisasi SQL Server. Mereka berasal dari DB2 dan hadir di PostgreSQL juga (karena berguna dan dalam standar ISO SQL). Apakah tampilan disisipkan atau diperlakukan sebagai kotak hitam untuk penerapan tertentu, beberapa RDBMS lebih pintar daripada yang lain.
hanya seseorang
@ hanya seseorang: Komentar saya dibatasi untuk SQL Server 2005/2008 karena saya tidak memiliki pengalaman dengan CTE di RBDMS lain. Juga, komentar memenuhi syarat untuk menunjukkan ini tidak berlaku untuk SQL Server 2000 karena CTE tidak tersedia di SQL Server sebelum tahun 2005.
Pengguna Terdaftar
Alternatif lain untuk tampilan adalah meletakkan tabel harga di tabel sementara sebelumnya.
SeaDrive
0

Kapan pun Anda membutuhkan [my_interface]! = [User_interface].

Contoh:

TABEL A:

  • Indo
  • info

LIHAT untuk TABEL A:

  • informasi pengguna

ini adalah cara untuk menyembunyikan id dari pelanggan dan mengganti nama info menjadi nama yang lebih panjang sekaligus.

Tampilan akan menggunakan indeks yang mendasari untuk id kunci utama, jadi Anda tidak akan melihat kehilangan kinerja, hanya abstraksi yang lebih baik dari kueri pemilihan.

HumbleWebDev
sumber