İlişkisel bir veritabanında xml saklamanın avantajları nelerdir?


23

Bugün AdventureWorks veritabanını araştırıyordum HumanResources.JobCandidateve bazı tabloların ( ve Sales.Individualörneğin) xml verilerini depolayan bir sütunu olduğunu fark ettim .

Bilmem gereken, temel olarak bir veritabanı tablosu satırının değerindeki verileri başka bir tablonun sütununda saklamanın avantajı nedir? Bu, bu bilgilerin sorgulanmasını zorlaştırmaz mı? Yoksa verilerin sorgulanması gerekmeyeceği ve yalnızca depolanması gerektiği varsayımı mıdır?

Yanıtlar:


30

Çünkü tüm verilerin ilişkisel olarak depolanması gerekmemektedir ve ilişkisel saklama için XML olarak geçirdiğiniz verileri işlemek için kod yazmak zaman alıcıdır (ve çok sıkıcıdır). Bu, özellikle çok genel jenerik tepkiler veren sistemlerden çok sayıda XML verisi geldiğinde geçerlidir.

Bir mesajın başka bir sistemden alındığı durumları sıklıkla gördüm ve içerdiklerinin% 98'ini umursamıyoruz. Bu yüzden umursadığımız% 2'yi ayırmak için ayrıştırırız, bunu ilişkisel olarak saklar ve sonra kalan% 98'den herhangi birine ihtiyaç duymamız durumunda mesajın tamamını saklar.

Ve SQL Server, T-SQL'de XML ile çalışmak için size bazı OK-ish araçları ve sözdizimi sağlar, bu nedenle, sanki içerikleri saklıyormuş gibi geçici sorgular için pratik erişimin ötesinde bir şey değil. CSV’nin

Ve bu aslında saklamak istediğiniz şeyin XML olması olasılığını dışlar (örneğin, destek ve hata ayıklama amaçları için) ...


10
+1, "Şimdi biraz ye, Sonradan biraz sakla." Hangi şeker için sefil bir pazarlama kampanyasıydı, ancak bu durumda XML depolama için çalışıyor.
Dan Rosenstark

11

Eğer veri formatı değişken ise ve olası bir değişime tabi ise, onu XML olarak bir araya getirmek ve veritabanını bu forma koymak isteyebilirsiniz, böylece gelecekteki veritabanı şeması değişimini önleyebilirsiniz.

Aynı teğette, eğer veriler bir dış sistem tarafından sağlanıyorsa ve tekrar kullanılıyorsa ve size kalıcı bir format sağlayamıyorsa, bunu yaparsınız.

Bu, bu bilgilerin sorgulanmasını zorlaştırmaz mı?

SQL Server, XML alanlarını ve değişkenlerini sorgulayabilir. Zor değil, ama daha çok iş, evet. Ama yapılabilir.


Veritabanının şemasındaki verilerin ayrıştırılması için +1. Ayrıca açıkça XPath sorgulamasından bahsetmek isteyebilirsiniz.
Gary Rowe

Sanırım az önce yaptın. :)

5

Tecrübelerime göre, XML verileri genellikle saklanır ve nadiren sorgulanır, ancak genellikle bazı diğer sistemler ilişkisel verilerden anında üretilmesi zor veya imkansız olabilecek bazı verilerin bir XML temsiline ihtiyaç duyduğunda sıklıkla çıkarılır. XML verileri başka bir işlem tarafından önceden doldurulmuş olabilir.


3

Verilerinizi bir blob'daki ikili bir akışta saklamayı düşünebiliyorsanız, verilerinizi bir xml biçiminde bir blob'da sakladığınızı hayal ediyorum.

Tabii ki, pek çok şey en iyi hayal gücünün hayal gücüne bırakılabilir.

Örneğin, elektronik tıbbi kayıtlar:

Büyük olasılıkla ASCII HL7 V2.x'i veri tabanındaki bir alanda saklayacağınızdan. Muhtemelen HL7 V3.0 veri tabanında bir alanda depolamak uygun olacaktır.

Yani avantaj kolaylıktır.


2

Şu anda bunu yapan bir proje üzerinde çalışıyorum. İlişkili olarak depolanan, birden çok kez işlenmesi gereken verilerimiz var. Ancak, işleme Java'da yapılır ve orada XML ile çalışmak kolaydır. Böylece, ilişkisel verilerden bir defalık bir geçiş yapıyoruz ve bunu bir tabloda XML olarak saklıyoruz. Daha sonra bu verileri Java'da her seferinde veri almak yerine bir birleştirme sorgusuyla işleyebilir ve aynı verileri kalbimizin içeriğine tekrar tekrar işleyebiliriz. Çok daha basit ve daha verimli.


2

XML depolamanın iyi bir örneği, veritabanında UI durumlarını sürdürmek istediğiniz zamandır. Tüm uygulama görünümlerinin durumu seri hale getirilir ve veritabanında saklanır ve XML'yi sorgulamaya gerek yoktur. UI durumuna göre, sıralama düzenini, pencerelerin boyutunu vb. Sıralar.


1

Genellikle hem XML hem de ilişkisel olan karma veriler elde edersiniz. (Buna güzel bir örnek, her belgenin başlık, oluşturma tarihi, sahiplik vb. Gibi meta veri alanlarına sahip olabileceği bir belge deposudur.)

Bu noktada üç seçenek arasından seçim yapmanız gerekir:

  1. Her şeyi ilişkisel bir veritabanında saklayın.
  2. Her şeyi yerel bir XML DB'de saklayın.
  3. Verileri iki ayrı DB'de saklayın, yerel XML'de XML ve ilişkisel olarak meta veriler.

Seçenek 3 muhtemelen en temiz, aynı zamanda en pahalı ve uygulanması en zor olanıdır, ayrıca çok büyük olmayan bir sistemde dağıtılmış işlemler istemezsiniz. Yerel XML veritabanları genellikle ilişkisel verileri (aramalarda kullanmanız daha muhtemeldir) ele almada oldukça zayıftır ve teknoloji genel olarak ilişkisel DB'den daha az olgun olduğundan, seçenek 2 çok iyi değildir.

Böylece, seçenek 1 ile kesinlikle en iyi çözüm değil, belki en az kötü olarak kalıyor.


1

Tecrübelerime göre, bir veritabanında XML kullanmak, veri kaynağının bu şekilde depolanmasından kaynaklanmaktadır ya da işlevselliği desteklemek için çok sayıda veritabanı programlaması gerektirmeyecek şekilde genişletmek için mevcut bir veritabanına ekliyorsunuzdur. .

Sık sık yeni verileri arayacaksanız, bunun yerine XML'i bileşen parçalarına bölmek anlamlı olabilir. Aksi takdirde, seyrek değiştirilen verileri kaydetmenin yararlı bir yolu olabilir.

Umarım bu yardımcı olur, Jeff


1

Belge odaklı veri depoları (aka NoSql) bugünlerde çok popüler:

http://en.wikipedia.org/wiki/Document-oriented_database

İlişkisel bir veritabanında belge odaklı bir program kullanamamanızın bir nedeni yoktur. Mongo gibi bir şeyle kıyaslandığında aynı faydaları alamayabilirsin, ama dezavantajlara sahip değilsin.

Uzun süre, belge odaklı depolama kullanmak istiyorsanız, tek seçeneğiniz yapılandırılmış verileri (XML gibi) büyük bir sütuna sokmaktı. İlişkisel veritabanları, bunu desteklemek için indeksleme ve eşleştirme gibi özellikler ekliyor.

Bunun aksine, Mongo ile veritabanındaki tek şey belgelerin olduğu. Ama bu başka bir konu.

EDIT: Belge yönelimli temel fikir şudur: Verileri dışarı çıkarır, manipüle eder ve tamamen geri çekersiniz. Bazen, dokümanı müşteriye ilettiğinizde olduğu gibi, her şeyi blob olarak göndermek ve başa çıkmalarına izin vermek istersiniz. Avantaj (ve dezavantaj) esnekliktir. Belgenin geçerliliği ve doğruluğu veritabanı dışında yapılır .

EDIT EDIT: Başka bir kontrast. JPG resimlerin veya Word belgelerinin bir veritabanı sütununa kaydedildiğini hayal edin.


0

Bir ağacın (XML), bir kayıt listesine (veritabanı tablosu) kaydedilmesinin avantajları nelerdir?

XML'in DBMS'nizden örneğin XPath veya SPARQL kullanılarak sorgulanmaması için hiçbir neden yoktur.

Gördüğüm gibi, onlar sadece iki farklı veri yapısı. Ve birbirlerine gömülmemeleri için hiçbir neden yok.

JSON veri tipinin PostgreSQL'e eklenmesinin nedenlerini bulabilirsiniz. Bence aynı argümanların çoğu geçerli. Bunun dışında XML / XSD ile daha da fazla doğrulama yapmak mümkündür.


-1

Peki, XML (veya JSON) meta verileri hiyerarşi ile depolamak için oldukça iyidir. Alternatifler neler? Belki refid / key / value / depth içeren bir meta veri tablosu? Bu biraz hantal (ama yapmanız gerekirse sorgulama için muhtemelen daha iyi). Belge hakkındaki bazı xml verilerinin (bir belgeler tablosundaki bir satır) saklanması, bazı hiyerarşik bilgileri bir harici masaya dayanmak zorunda kalmadan veya "tür" infos başına 1 sütun eklemek zorunda kalmadan saklamak istediğinizde oldukça kullanışlıdır.


1
Bu, önceki 11
cevapta

-2

Bilgiyi ayrıştırmak için çaba sarf ettiğinizde, orada bulunmasına gerek duymayan, verimsiz etiketlerle verimli depolamayı tıklattığınız için kötü bir uygulama olduğunu söyleyebilirim. XML, her satır için her bir sütun için bir etikete ihtiyaç duyduğunuzdan, açıkladığı verilere kıyasla çok çirkin bir depolama yüküne sahiptir. Karşılaştırma yapılırsa, ilişkisel formatta ayrıştırılan ve kaydedilen veriler, ONCE'de depolanan sütun adlarına sahiptir. Bir dev bir düzine satır için. kutu, büyük anlaşma, ancak geliştiricilerin bunun milyonlarca satıra ölçeklenebilir olduğu varsayımını yaptıklarını gördüm. Bu, operasyonel zorluklar yaratan birkaç düzine GB veri için 100 GB'lik ek yükü temsil edebilir. Temel olarak kendinizden sorumluluktan kaçıyorsunuz ve yazdığınız saçmalığı desteklemek zorunda olan insanları itiyorsunuz.

Öyleyse neden operasyon verilerinden kendi veritabanında saklamıyorsunuz? Ya da amaçlandığı gibi - düz dosyalarda? Muhtemelen bir daha hiç bakılmayacak, peki neden bir işletim sisteminin performansını vurmaktan alıkoymayalım? XML'in SADECE sistemler arasında depolama protokol farklılıkları nedeniyle görünmeyecek olan veri şemasının bir açıklamasını sağlamak için orada olduğunu unutmayın. Tüm mesele bu, zekice bir şey yok. Belirli bir veri miktarı için ek yük miktarının 10 katını saklamak, yalnızca bir şeyleri düşünmeyen ve harcadığınız verileri mantıklı, verimli, sorgulamak için hızlı bir biçimde işlemek için kullanılamayan özensiz bir geliştirici olduğunuzu söylüyor. Çabalarınızı operasyonel desteğe zorlamaktan vazgeçin ve sizden sonra verileri nasıl daha iyi kullanabileceğinizi düşünün. aldım benim çağrım olurdu. Amacına hizmet ettiği için, alındıktan sonra verileri XML olarak depolamak için savunma yoktur.


1
Ancak burada, XML parçasındaki verilerin ilişkisel veriler olduğunu varsayıyorsunuz. Bu genellikle durum böyle değildir - XML, ilişkisel bir veri tabanında temsil etmesi çok zor olan hiyerarşik veriler için çok kullanışlıdır. Bir deyimsel XML belgesi (örneğin, nitelikleri iyi bir şekilde kullanma), genel olarak oldukça az yer kaplayacaktır, asıl sorun, her erişimde parçayı ayrıştırmanın maliyeti olacaktır.
amon

Veriler hızlı bir sorgulama formatına dönüştürülemeyebilir (ya da sorgulamanız gerekmeyebilir). Bir seferde belki bir avuç doldurulmuş olan yüzlerce isteğe bağlı alanın bulunduğu bir XML şeması hayal edin. Bu ilişkisel olarak modelleme konusunda ısrar ederseniz, ya NULL'larla dolu büyük masalarla ya da EAV olan canavarlıkla bitirdiniz.
Julia Hayward
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.