Görüşler ne için iyidir?


88

RDBMS'lerde hangi görünümlerin kullanıldığına dair genel bir fikir edinmeye çalışıyorum. Yani görüşün ne olduğunu ve nasıl yapılacağını biliyorum. Geçmişte onları ne için kullandığımı da biliyorum.

Ancak, bir görüşün ne için yararlı olduğunu ve bir görüşün ne için yararlı olmaması gerektiğini tam olarak anladığımdan emin olmak istiyorum. Daha spesifik olarak:

  1. Bir görünüm ne için yararlıdır?
  2. Kullanmamanız gereken bir görünümü kullanmanın cazip geldiği durumlar var mı?
  3. Neden tablo değerli bir işlev veya tam tersi gibi bir şey yerine bir görünümü kullanasınız?
  4. İlk bakışta görünmeyen, bir görüşün yararlı olabileceği durumlar var mı?

(Kayıt için, bu soruların bazıları kasıtlı olarak saftır. Bu kısmen bir kavram kontrolüdür.)


1
burada yayınlanan soruya benzer: stackoverflow.com/questions/1278521/…
MedicineMan

Stackoverflow.com/questions/1278521/… ' nin bu soruya daha iyi yanıtlar sağladığını düşünüyorum .
GinTonic

Yanıtlar:


43

1) Bir görünüm ne için yararlıdır?

IOPO Sadece Tek Bir Yerde

• İster verinin kendisini, ister birleştirilmiş tablolara referans veren sorguları düşünün, bir görünümden yararlanmak gereksiz fazlalığı önler.

• Görünümler ayrıca tablolara doğrudan erişimi engelleyen bir soyutlama katmanı sağlar (ve bunun sonucunda fiziksel bağımlılıkları referans alan kelepçeleme). Aslında, 1 hafta gibi görüşler de dahil olmak üzere, temel verilerinize (görünümler ve tablo değerli işlevler kullanarak) yalnızca soyutlanmış erişim sunmanın iyi bir uygulama 1 olduğunu düşünüyorum , "Söylediğim gibi yap; yap "bu tavsiyede;)

CREATE VIEW AS
      SELECT * FROM tblData


2) Kullanmamanız gereken bir görünümü kullanmanın cazip geldiği durumlar var mı?

Görünümdeki performans birleştirmeleri bir endişe kaynağıydı (örneğin SQL 2000). Uzman değilim ama bir süredir endişelenmiyorum. (Şu anda görünüm birleşimlerini nerede kullandığımı da düşünemiyorum.)

Bir görünümün aşırı olabileceği başka bir durum, görünümün yalnızca bir arama konumundan referans verildiği ve bunun yerine türetilmiş bir tablonun kullanılabileceği durumdur. Anonim tür yalnızca bir kez kullanılıyorsa / başvuruluyorsa, anonim bir türün .NET'teki bir sınıfa tercih edilmesi gibi.

    • http://msdn.microsoft.com/en-us/library/ms177634.aspx adresindeki türetilmiş tablo açıklamasına bakın

3) Neden tablo değerli bir işlev gibi bir şey yerine bir görünümü kullanasınız ya da tam tersi?

(Performans nedenlerinin yanı sıra) Tablo değerli bir işlev, işlevsel olarak parametreli bir görünüme eşdeğerdir. Aslında, basit bir tablo değerli işlev kullanım durumu, tek bir nesnede zaten var olan bir görünüme bir WHERE yan tümcesi filtresi eklemektir.

4) Bir görüşün yararlı olabileceği ilk bakışta belirgin olmayan durumlar var mı?

Başımın üst kısmının görünürde olmayan kullanımlarını düşünemiyorum. (Sanırım yapabilseydim, bu onları görünür kılardı;)

9
Bir SELECT * FROM tblData olduğunda bir tabloda bir görünüm oluşturmanın mantıklı olduğunu kabul etmiyorum. Bunun neden faydalı olacağına dair bir açıklama yapabilir misiniz?
Kayıtlı Kullanıcı

IOPO - Yalnızca Bir Yerde - Bu iyi bilinen bir tasarım cümlesi mi? Pek çok referans bulamıyorum. Başka formları var mı, örneğin KURU?
Robert

1
@Robert Evet, KURU, normalizasyon, IOPO, bunların hepsi aynı felsefenin farklı lezzetleri.
TylerH

45

Bir bakıma, görünüm bir arayüz gibidir. Altta yatan tablo yapısını istediğiniz kadar değiştirebilirsiniz, ancak görünüm, kodun değişmesi gerekmemesi için bir yol sağlar.

Görünümler, yazarları bildirmek için basit bir şeyler sağlamanın güzel bir yoludur. İşletme kullanıcılarınız verilere Crystal Reports gibi bir şeyden erişmek istiyorsa, onlara hesaplarında verileri basitleştiren bazı görünümler verebilirsiniz - hatta belki onlar için normalden bağımsız hale getirebilirsiniz.


21

Güvenlik sağlamak için görünümler kullanılabilir (yani, kullanıcılar bir tablodaki yalnızca belirli sütunlara erişen görünümlere erişebilir), görünümler güncellemeler, eklemeler vb. İçin ek güvenlik sağlayabilir. Görünümler ayrıca sütun adlarını değiştirmenin bir yolunu da sağlar (olduğu gibi sp's) ancak görünümler gerçek tablodan daha çok izolasyondur.


19

Bir bakıma, görüşlerin normalden farklılaşması. Normalden arındırma bazen verileri daha anlamlı bir şekilde sağlamak için gereklidir. Bu, birçok uygulamanın nesnelerinde etki alanı modellemesi yoluyla zaten yaptığı şeydir. Verilerin, bir işletmenin bakış açısına daha yakından uyan bir şekilde sunulmasına yardımcı olurlar.


-1 "görünüm normalleşmiyor" mu? üzgünüm, ama bir şekilde nitelendirilmediği sürece bu saçmalık.
just somebody

19
Kesinlikle denormalize olurlar. 3. nomral forma normalleştirilmiş ilgili tablolarınız varsa ve bu ilişkiyi 'düzleştirmek' için bir görünüm yaratırsanız, bu nasıl denormalizasyon olmaz?
Kilhoffer

11

Başkalarının söylediklerine ek olarak, görünümler de uygulamadan daha derlenmiş SQL sorgularını kaldırmak için yararlı olabilir.

Örnek olarak, şunu yapan bir uygulama yerine:

sql = "tablo1'den a, b'yi seçin, tablo2'den a, b'yi seçin";

Bunu bir bakış açısıyla özetleyebilirsiniz:


tablo1
birleşiminden
a, b'yi seçin , tablo2'den a, b'yi seçin

ve uygulama kodunda şunlara sahip olmanız yeterlidir:

sql = "union_table1_table2_v'den a, b'yi seçin";

Ayrıca veri yapıları değişirse, uygulama kodunu değiştirmeniz, yeniden derlemeniz ve yeniden konuşlandırmanız gerekmez. db'deki görünümü değiştirirsiniz.


Neden app yerine veritabanına karmaşık sql yazmak isteyeyim?
Ivan Virabyan

3
Sorgunuz ne kadar karmaşıksa, kısmen sadece daha fazla tabloya basması nedeniyle gelecekte değişme olasılığı o kadar artar. DB yapıları değiştiğinde, kodunuzu da değiştirmeniz ve bir sürüm yapmanız gerekir. Bu karmaşıklık bir görünümde soyutlanırsa, DBA, kodunuzu değiştirmek zorunda kalmadan alttaki tablolarda yapısal değişiklikler yapabilir.
CodingWithSpike

11

Görünümler, veritabanı karmaşıklığını gizler. Pek çok nedenden ötürü harikadırlar ve birçok durumda faydalıdırlar, ancak kendi sorgularını ve raporlarını yazmalarına izin verilen kullanıcılarınız varsa, bunları kötü tasarlanmış bir şekilde göndermediklerinden emin olmak için bir koruma olarak kullanabilirsiniz. veritabanı sunucunuzu çökerten kötü kartezyen birleşimlere sahip sorgular.


6

OP, bir görüşü kullanmanın cazip gelebileceği durumlar olup olmadığını sordu, ancak bu uygun değil.

Görünümü kullanmak istemediğiniz şey, karmaşık birleştirmelerin yerine geçer. Yani, prosedürel programlama alışkanlığınızın bir problemi daha küçük parçalara ayırmasına izin vermeyin, sizi daha büyük bir birleşim yerine birleştirilmiş birkaç görünümü kullanmaya yönlendirir. Bunu yapmak, temelde bir büyük sorgu yerine birkaç ayrı sorgu yaptığından veritabanı motorunun verimliliğini öldürecektir.

Örneğin, A, B, C ve D tablolarını birlikte birleştirmeniz gerektiğini varsayalım. A & B tablolarından bir görünüm ve C & D'den bir görünüm oluşturmak cazip gelebilir, ardından iki görünümü birleştirebilirsiniz. A, B, C ve D'yi tek bir sorguda birleştirmek çok daha iyidir.


Bunun doğru olduğunu düşünmüyorum, en azından DBMS teorisi böyle gitmiyor (çeşitli uygulamalar teoriyi onurlandırmamaya karar verebilir). Sorgu ayrıştırıcısı, gördüğü tüm görünümleri karşılık gelen sql ile değiştirecek ve eniyileyici oradan gidecek. 2 vaka eşdeğer olmalıdır.
SquareCog

Görünümlerinize dizinler ekleyebildiğinizde de bu geçerli değildir.
therealhoff

PostgreSQL'e en çok aşinayım ve önceki sürümler sorguları birleştirme konusunda pek iyi değildi. Ancak yeni olanlar çok daha iyi. Cevabım, en azından bu belirli DBMS için artık pek geçerli değil.
Barry Brown

5

Görünümler verileri merkezileştirebilir veya birleştirebilir. Bulunduğum yerde, birkaç farklı bağlantılı sunucuda birkaç farklı veri tabanımız var. Her veritabanı farklı bir uygulama için verileri tutar. Bu veritabanlarından birkaçı, bir dizi farklı uygulama ile ilgili bilgileri tutar. Bu durumlarda yapacağımız şey, o uygulamanın veritabanında, yalnızca verilerin gerçekten depolandığı veritabanından verileri çeken bir görünüm oluşturmaktır, böylece yazdığımız sorgular farklı veritabanlarından geçiyormuş gibi görünmez.


4

Şimdiye kadarki yanıtlar doğrudur - görüşler güvenlik sağlamak, normal olmayanlaştırma (yanlış yapılırsa bu yolda çok fazla acı olsa da), veri modeli soyutlaması vb. İçin iyidir.

Ek olarak, görünümler genellikle iş mantığını uygulamak için kullanılır (eski bir kullanıcı, son 40 gün içinde giriş yapmamış bir kullanıcıdır, bu tür şeyler).


7 referans tablosunda brining yaparak denormalize ederseniz ve daha sonra bu referans tablolarından yalnızca birine ihtiyaç duyan bir şeyi sorgularsanız. Bu çok fazla boşa harcanan çaba. Bu tür görüşlere katılmaya başlarsanız bu daha da kötüleşir.
SquareCog

bundan emin misin? MSDN, 'SQL Server, görünümlere adıyla başvuran sorguları işlediğinde, görünümlerin tanımları normalde yalnızca temel tablolara başvurana kadar genişletilir. Bu sürece görünüm genişletme denir. Bu bir çeşit makro genişleme. ' Genişletme işlemi sırasında, motorun yalnızca sorgu tarafından ihtiyaç duyulan temel tabloları (görünümün) içerecek kadar akıllı olacağını hayal ediyorum.
Anthony

Anthony, "foo_col'u seçin (foo birleştirme çubuğundan (foo.id = bar.id) 'den foo. *, Bar. * Seçin" gibi bir sorgu düşünün. Bu sorguda iç seçim bizim görüşümüzdür. bar birleşiminin güvenle kaldırılabileceği açıktır (aslında ilişki kesinlikle 1-1 değilse, olamaz). Bu, daha karmaşık sorgularla daha da zorlaşır ve tüm işlemleri yapmak için genel RDBMS'ye güvenmenizi tavsiye etmem Bir insan kutuyu budamak. Belki SQL Server yapabilir; MySQL yapsaydı şok olurdum. Oracle? Postgres? Her zaman olduğu gibi, şüphe
duyduğunuzda

3

Görünümler, SQL komut dosyalarınızda birçok tekrarlanan karmaşık JOIN deyimini kaydeder. Sadece bir görünümde bazı karmaşık JOIN kapsülleyebilir ve gerektiğinde bunu SELECT deyiminizde çağırabilirsiniz. Bu bazen kullanışlı, doğrudan ve her sorguda birleştirme ifadelerini yazmaktan daha kolay olabilir.


2

Görünüm, yalnızca depolanmış, adlandırılmış bir SELECT ifadesidir. Görünümleri kütüphane işlevleri gibi düşünün.


Depolanan prosedürler bunun için daha uygun olmaz mı? Bazen silme ve güncelleme görünümlerine sahip işlevlere ihtiyaç duyarsınız, bu ihtiyaç için yeterli olmayacaktır. Görüşlere soyutlamalar veya hedef kullanıcıyı sınırlamanın yolları olarak bakılmalıdır.
HumbleWebDev

1

Raporlama için görünümlerin kullanımını vurgulamak istedim. Genellikle, performansı hızlandırmak için veritabanı tablolarını normalleştirmek, özellikle verileri düzenlemek ve eklemek (OLTP kullanımları) ile raporlama ve analiz için sorgular için tablo birleştirme sayısını azaltmak için normalleştirme (OLAP kullanımları) arasında bir çelişki vardır. Veri girişinin optimum performansa sahip olması gerektiğinden, zorunlu olarak OLTP genellikle kazanır. En iyi raporlama performansı için görünümler oluşturmak, her iki kullanıcı sınıfını da (veri girişi ve rapor görüntüleyicileri) tatmin etmeye yardımcı olabilir.


1

Birkaç UNION içeren çok uzun bir SELECT'i hatırlıyorum. Her UNION, kendisi oldukça uzun ve anlaşılması zor olan bir SELECT tarafından anında oluşturulan bir fiyat tablosuna birleştirme içeriyordu. Fiyat tablosunu oluşturacak bir görünüme sahip olmanın iyi bir fikir olacağını düşünüyorum. Genel SELECT'i yarı yarıya kısaltabilirdi.

DB'nin görünümü bir kez mi yoksa her çağrıldığında bir kez mi değerlendireceğini bilmiyorum. Bilen var mı? Birincisi, bir görünüm kullanmak performansı artıracaktır.


Oracle CBO, görünümü bir kez değerlendirmeyi (gerçekleştirir, onu çağırırlar) veya görünüm için SQL'i select ifadesinin geri kalanına birleştirip çalıştırmayı seçebilir. Daha düşük tahmini maliyete göre karar verirdi.
WW.

Select ifadesi sorgu boyunca sabitse ve birkaç kez tekrarlandıysa, ortak bir tablo ifadesi (CTE) sorunu çözebilir. Bu yalnızca SQL Server 2005/2008 için geçerlidir çünkü SQL Server 2000'de mevcut değildir. Evet, yine de bir görünüm tekrar tekrar çağrılırdı.
Kayıtlı Kullanıcı

@ Kayıtlı Kullanıcı: CTE'ler bir SQL Server uzmanlığı değildir. DB2'de ortaya çıkmışlardır ve PostgreSQL'de de mevcutturlar (çünkü yararlıdırlar ve ISO SQL standardındadır). Bir görünüm ister satır içi, ister kara kutu olarak ele alınsın uygulamaya özgüdür, bazı RDBMS diğerlerinden daha akıllıdır.
just somebody

@ just somebody: Yorumum SQL Server 2005/2008 ile sınırlandırıldı çünkü diğer RBDMS'de CTE'lerle deneyimim yok. Ayrıca, yorum önceki 2005 için CTE'ler değildi mevcut SQL Server beri SQL Server 2000 için geçerli değildir bunu belirtmek için nitelikli oldu
Kayıtlı Kullanıcı

Bir görünüme başka bir alternatif, fiyat tablosunu önceden geçici bir tabloya koymak olurdu.
SeaDrive

0

Her zaman [my_interface]! = [User_interface] 'e ihtiyacınız olduğunda.

Misal:

TABLO A:

  • İD
  • bilgi

TABLO A GÖRÜNÜMÜ:

  • Müşteri Bilgileri

bu, kimliği müşteriden gizlemenizin ve bilgiyi aynı anda daha ayrıntılı bir adla yeniden adlandırmanın bir yoludur.

Görünüm, birincil anahtar kimliği için temeldeki dizini kullanır, böylece bir performans kaybı görmezsiniz, yalnızca seçme sorgusunun daha iyi soyutlanması sağlanır.

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.