SQL Server'da XML veri türünü ne zaman kullanmalıyım?


Yanıtlar:


1

Ben depolama için XML veri nesne seri hale benzer bir şey yaptım. Bu, karmaşık nesneler için veri tutmak üzere tablo, sütun ve ilişkilere sahip olma yükünü ortadan kaldırır. Bu işleme, sonuç XML'nin uygun olduğu bir şema kullanılarak yardımcı olabilir ve veritabanı tabloları, söz konusu nesneler hakkında meta bilgi için kullanılabilir. Benim durumumda, nesne düzenini karşılamak için veritabanı şemasını genişletmek büyük bir görev olurdu!


Bu cevap benim görüşüme en yakın olanla eşleşiyor. Normal bir tablo tabanlı veri kümesi döndürmeniz veya sonuç için yeni bir biçim oluşturmanız gerekirse, temel verileri XQuery kullanarak da sorgulayabilirsiniz. Benim sorum aslında XML kullanmanın ne zaman mümkün olduğunu sordu, kendi fikirlerime sahip olduğumu ve başkalarının görüşlerini duymak istediğini ve cevabın bunun için gerçek, uygun bir kullanım durumunu açıkladığını söyledi.
FarligOpptreden

11

Şahsen, daha önce SQL Server'da XML alan türünü hiç kullanmadım ve bu özelliği ekledikleri için çok fazla veritabanı programlama yaptım. Bana her zaman XML içeriğini yerel olarak kullanmak için programlı ve performans yükü gibi görünüyordu. Dürüst olmak gerekirse bunun bir hile olduğunu düşündüm, çünkü herkes 2000'lerin başında bir noktada XML trenindeydi. "Ah XML sıcak, bu yüzden SQL Server'a ekleyelim, bu yüzden passe bakmıyoruz."

Görebildiğim en iyi iş durumu, yapısında ve verilerinde bakmak isteyebileceğiniz, ancak iş veya yasal nedenlerle orijinal mesajın bütünlüğünü korumak istediğiniz yerde aldığınız XML tabanlı veri mesajlarını kaydetme olabilir. Ek yük, XML'i bir tablo yapısına dönüştürmek için çok büyük olabilir, ancak SQL Server'da XML yeteneklerinin kullanılması, verilerin kullanılmasını gerektirecek kadar inceleme maliyetini düşürebilir.

Muhtemelen kullanmak istediğiniz başka düzinelerce neden var, ama açıkçası, bunu yapmak için çok özel iş nedenleriniz olmadıkça, SQL Server'da XML ile hog-wild'a gitmeden önce diğer mutluluk yollarını düşünmeniz gerektiğini düşünüyorum. Daha mantıklıysa, bir varchar (max) veya metin alanı kullanın.

Sadece benim fikrim, tabii ki :)


Bu orijinal cevabı gönderdikten bir yıl sonra ve b) mutlaka XML ile ilgili değil, ama yine de SQL Server'da JSON yöntemlerinin dahil edilmesi hakkında hissediyorum gibi XML hakkında aynı şekilde hissediyorum.
CokoBWare

Modern NoSQL (ve hibrit) depolama seçeneklerinin ortaya çıkmasının orijinal soruyu gereksiz kıldığını tahmin ediyorum, çünkü o zamanlar benim fikrim yapılandırılmamış verileri veritabanında bir arkan şeması oluşturmayacak şekilde depolamaya daha fazla yöneltildi.
FarligOpptreden

8

Ben sadece aktif SQL Server XML veri türü kullanımını sürdürmek birkaç senaryo ile karşılaştım. Bu, en azdan en ilginç olana doğru başımın üstünde:

  • Diğer uygulamalar tarafından oluşturulan XML yanıtlarını saklama / arşivleme
    • Örneğin, özel bir Silverlight uygulaması ile Dynamics AX arasında iletişim kurmak için Application Integration Framework (AIF) kullanıyoruz. Bu uygulamalar arasındaki iletişim sorunlarını gidermeye yardımcı olmak için hem gelen hem de giden iletileri veritabanında depolarız
    • Alan türü genel bir dize türü (ör. VARCHAR) yerine XML olduğundan, bazı belirli ölçütlerle eşleşen iletileri özel olarak sorgulamak için XQuery kullanabiliriz. Bu basit string LIKE eşleşmesi ile çok daha zor olurdu
  • Oluşturulan bir yanıt iletisini önbelleğe alma / sürdürme
    • XML alanını, hesaplanan sütunu taklit edecek bir tetikleyici veya uygulama koduyla güncelleyin
    • Bir çağrı uygulamasına dayalı bir XML yanıtını sürekli olarak yeniden oluşturmak yerine, her çağrıda değil, yalnızca satır yükseltildiğinde ek yüke maruz kalırsınız
    • Bu, SELECT'ler UPDATE'lerden / INSERT'lerden çok daha sık olduğunda işe yarar; bu, çoğu uygulama için geçerli olma eğilimindedir
  • Birden çok değeri tek bir alanda depolama
    • Gördüğüm uygulamalardan biri, bir değer koleksiyonunu tek bir alanda depolamak için XML veri türünün kullanılmasıdır
    • Bunun bir avantajı, basit bir anahtar / değer deposu için fazladan bir tablo tasarlamanıza gerek olmamasıdır
    • Bunun bir dezavantajı, verilerin tamamen normalleştirilmemesidir ve sorgulamayı daha az belirgin hale getirir
    • Bununla birlikte, yukarıda belirtildiği gibi, XQuery'yi tanımlayıcı ölçütlerle eşleşen satırları seçmek için bu XML alanında kullanabilirsiniz, böylece tamamen normalleştirilmemenin etkisini kısmen nütralize edebilirsiniz.

Bütün bunlar, zamanın% 99'u, bir şema tasarlarken kesinlikle bir XML alanına ihtiyacım yok.


4

SQL sunucusunda XML veri türünü birkaç kez gördüğümde, temelde veritabanındaki diğer tüm veriler gibi sorgulanan bir alan olarak kullanıldı, bu da büyük miktarda veriye sahipseniz bazı çok kötü performans etkileri olabilir . XML sunucusu değil, SQL sunucusu denmesinin bir nedeni var. :-) XML'e karşı yapılan sorgular, normal bir seçme sorgusu yapmak kadar hızlı değildir.

Ben o kadar çok sorgulanmıyor XML depolamak için kullanılan, bir XML veri türünde tam XML belgesi depolamak, ancak aranabilir alanları (anahtarları) ayrı ayrı XML belgesi ile depolamak için kullanılan görebiliyordu. Bu şekilde, bilgilerinizi daha hızlı sorgulayabilir ve tam belgeyi görmek istediğiniz noktaya geldiğinizde XML belgesini alabilirsiniz. Aslında geri dönüp insanların XML veri türünü yoğun bir şekilde sorgulanan alan olarak kullanmaya çalıştıkları ve veri sorgu çok yavaş kazanılan noktaya büyüdü bir dizi uygulamalar ile bunu yapmak zorunda kaldı.


4

XML türü alanları çoğunlukla ASMX web hizmetleri veya WCF hizmetleriyle ilgili günlüğe kaydetme amacıyla kullandım. İsteği veya yanıt mesajlarını kaydedebilirsiniz.

Çoğu zaman, XML'i referans amaçlı olarak DB'ye kaydedersiniz - normal iş etkinliğiniz için değil (koddan her 5 saniyede bir sorgulamak için değil). Kendiniz bunu yaparsanız, genellikle sorguladığınız veya çoğu zaman kullandığınız alanları belirleyin ve bunlar için ayrı sütunlar oluşturun. Bu şekilde, XML'yi DB'ye kaydederken, bu alanları ayıklayabilir ve karşılık gelen sütunlarına kaydedebilirsiniz. Daha sonra bunları alırken XML belgesini sorgulamanız gerekmeyecek, bu amaçla oluşturduğunuz sütunları kullanabilirsiniz.


1

Bunlar, Sql Server'da Xml alanlarına izin vermek için hangi koşulların mevcut olması gerektiğini düşünürken hemen bir hevesle akla gelen senaryolardır:

  • asitin kaynağın kontrolü gibi olmasını istediğiniz yerde değişim için kodlanmış ikili veri
  • Dinamik bilgiler kullanılarak tamamen yeniden oluşturulacak belge parçaları
  • Kullanıcı, izole etmek istediğiniz belgeleri veya parçaları gönderdi ve en azından ara bazda, dosya sisteminden doğrudan uzak durun.

-2

Veritabanına tek bir çağrıda yapılandırılmış verileri kaydetmek için XML'i istemci-sunucu uygulamalarında yaygın olarak kullanıyorum. Örnek olarak Ayrıntı satırlı bir Fatura alın. İstemcinin iş nesnesini XML'e serileştirmesi ve tek bir çağrıda depolanmış bir proc'a geçmesi kolaydır. Proc, bir ekleme veya güncelleme gerekip gerekmediğine karar verir; üst sunucu faturası kimliğini (bir kimlik sütunu), tüm sunucu tarafı işleminde ve istemci birkaç gidiş-dönüş yapmak zorunda kalmadan, ayrıntı kayıtlarına atayabilir. Üstbilgi kaydını belirtmek için 20 veya daha fazla parametreye ihtiyacım yok ve her fatura satırı için arama yapmak zorunda değilim. Ayrıca, istemciye dokunmak zorunda kalmadan şema değişiklikleri yapmak veya günlüğe kaydetme / denetleme yapmak genellikle mümkündür.


Neden vahşiler konusunda şaşkınım. Herhangi bir downvoter beni aydınlatmaya önem veriyor mu?
Rik Bradley
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.