XML'i veri depolama alanı olarak kullanma [kapalı]


12

XML formatı ve aşağıdaki alıntıyı düşünüyordum:

“XML bir veritabanı değil. Asla bir veritabanı olmuyordu. Asla veritabanı olmayacak. İlişkisel veritabanları, 20 yılı aşkın uygulama deneyimiyle kanıtlanmış bir teknolojidir. Sağlam, kararlı, kullanışlı ürünlerdir. Onlar gitmiyorlar. XML, verileri farklı veritabanları arasında veya veritabanları ve diğer programlar arasında taşımak için çok kullanışlı bir teknolojidir. Ancak, kendisi bir veritabanı değildir. Birisi gibi kullanmayın. ”- Etkili XML: Elliotte Rusty Harold tarafından XML'nizi Geliştirmenin 50 Özel Yolu (sayfa 230, Bölüm 4, Madde 41, 2. paragraf)

Bu, XML'in veri depolama için kullanılmaması gerektiğini ve yalnızca programın birlikte çalışabilirliği programlamak için kullanılması gerektiğini vurgulamaktadır.

Şahsen ben katılmıyorum ve app.configbir programın ayarlarını saklamak için kullanılan .NET dosyası bir XML dosyasındaki veri depolama örneğidir. Ancak, yapılandırmalar vs. yerine veritabanları için XML kullanılmamalıdır.

Demek istediğimi geliştirmek için iki örnek kullanacağım:
A) Alanlarının tümü tek bir düzeyde olan müşterilerle ilgili veriler, yani tümü çocuğu olmayan bir müşteriyle ilgili bir dizi alan var
B) İç içe alanların bulunduğu bir uygulamanın yapılandırılmasıyla ilgili veriler ve özellikler çok mantıklı

Benim sorum şu: Bu hala geçerli bir ifade mi ve XML kullanarak veri depolamak artık kabul edilebilir mi?

DÜZENLEME: Bu alıntı yazarı için onun girdi / ekstra bağlam istemek için bir e-posta gönderdim.


11
Veritabanı, verileri depolamakla değil , belirli bir ölçütle veri almakla ilgilidir . XML ölçeklenmez - 100 GB'lık bir XML dosyasını açıkladığınız verilerle değiştirmeyi deneyin.

1
Soru belirsiz. Veriyi DB yerine XML dosyasında saklamayı mı yoksa DB içinde veri mi XML türü olarak mı saklamayı soruyorsunuz? Daha fazla çamurlama, veri depolama olarak görmediğim için .net yapılandırma dosyası örneğidir.
softveda

Henüz kimse kendi başına veri depolama formatının bir veritabanı olmadığını söylememiştir. Veritabanı bir depolama biçimi ve bir geri alma mekanizması içerir. XML bir geri alma mekanizması değildir, bu yüzden bir veritabanı olamaz. XML, belki de 1 MB'den fazla veri için korkunç bir depolama formatıdır.
GlenPeterson

Yanıtlar:


12

Bu alıntı, XML'i genel olarak bir depolama biçimi olarak kullanmakla ilgili değildir (gereksinimlere bağlı olarak iyi), ancak veritabanı tipi depolama için.

İnsanlar veritabanları hakkında konuşurken , genellikle gigabayt veya terabayt aralığında büyük miktarlarda veri depolayan depolama sistemleri anlamına gelir . Veritabanı, potansiyel olarak onu depolayan sunucudaki kullanılabilir RAM miktarından çok daha büyüktür. Hiç kimse bir veritabanındaki tüm verilere bir kerede ihtiyaç duymadığından, veritabanları, verilerin seçici alt kümelerinin hızlı bir şekilde alınması için optimize edilmelidir: SELECTifadenin amacı budur ve ilişkisel veritabanları ve NoSQL çözümleri dahili depolama formatlarını hızlı bir şekilde optimize eder bu alt kümelerin alınması.

Ancak XML bu gereksinimlere tam olarak uymuyor. İç içe etiket yapısı nedeniyle, belirli bir değerin dosyada nerede saklandığını (bir dosyaya bayt uzaklığı açısından) en azından eşleşmeye kadar tüm belge ağacını yürümeden belirlemek mümkün değildir. İlişkisel bir veritabanı dizinlere sahiptir ve bir ilkel ikili arama uygulamasında bile bir dizinde bir değere bakmak tek bir O (log n) aramasıdır ve daha sonra gerçek değerlere ulaşmak bir dosya aramasından başka bir şey değildir (ör. fseek(data_file_handle, row_index * row_size)), O (1) 'dir. Bir XML dosyasında, en etkili yol belgeniz üzerinde bir SAX ayrıştırıcı çalıştırmak ve gerçek verilerinize ulaşmadan önce çok fazla okuma ve arama yapmaktır; dizinleri kullanmadığınız sürece bunu O (n) 'den daha iyi elde edemezsiniz, ancak daha sonra her ekleme için dizinin tamamını yeniden oluşturmanız gerekir (aşağıya bakın).

Eklemek daha da kötü. İlişkisel veritabanları satır sırasını garanti etmez, bu da yeni satırlar ekleyebilecekleri veya 'silinmiş' olarak işaretlenmiş satırların üzerine yazabilecekleri anlamına gelir. Bu son derece hızlı: DB sadece yazılabilir konumların bir havuzunu tutabilir; havuz boş olmadığı sürece havuzdan giriş almak O (1) 'dir; en kötü durumda, havuz boş ve yeni bir sayfa oluşturulması gerekiyor, ancak bu da O (1). Aksine, XML tabanlı bir veritabanı yer açmak için ekleme noktasından sonra her şeyi taşımak zorunda kalacaktır; bu O (n). Dizinler devreye girdiğinde, işler daha da ilginç hale gelir: tipik ilişkisel veritabanı dizinleri nispeten düşük karmaşıklıkla güncellenebilir, örneğin O (log n); ancak XML dosyalarınızı dizine eklemek istiyorsanız, her ekleme potansiyel olarak belgedeki her değerin diskteki konumunu değiştirir, bu nedenledizinin tamamını yeniden oluşturun . Bu, güncellemeler için de geçerlidir, çünkü bir öğenin metin içeriğinin güncellenmesi boyutunu değiştirebilir, bu da ardışık XML'nin değişmesi gerektiği anlamına gelir. İlişkilendirilmemiş bir veritabanının dizine eklenmemiş bir sütunu güncelleştirirseniz dizine hiç dokunması gerekmez; bir XML veritabanının, güncellenen XML düğümünün boyutunu değiştiren her güncelleştirme için tüm dizini yeniden oluşturması gerekir.

Bunlar en önemli dezavantajları, ancak daha fazlası var. XML çok ayrıntılıdır, bu da sunucudan sunucuya iletişim için iyidir, çünkü güvenlik ekler (alıcı sunucu XML üzerinde her türlü bütünlük kontrolünü gerçekleştirebilir ve aktarımda bir sorun varsa, belgenin doğrulanması olası değildir ). Bununla birlikte, yığın depolama için bu öldürücüdür: XML verileri için% 100 veya daha fazla ek yüke sahip olmak nadir değildir (SOAP mesajları gibi şeyler için% 1000 aralığında genel oranların görülmesi nadir değildir), tipik ilişkisel DB depolama şemaların tablo meta verileri için yalnızca sabit bir ek yükü ve ayrıca satır başına küçük bir biti vardır; ilişkisel veritabanlarındaki ek yükün çoğu sabit sütun genişliklerinden gelir. Terabaytlık bir veriye sahipseniz, birçok nedenden dolayı% 500'lük bir ek yük kabul edilemez.


21

XML, veri depolama için berbattır. İlk olarak, çok ayrıntılı. Bir XML dosyasında depolanan veriler, makul herhangi bir veritabanı sisteminde depolanan verilerden çok daha fazla disk alanı kaplar. XML kaydında, belirli bir alanın adı, verilerin dize olarak temsil edilmesiyle birlikte iki kez saklanır. Örneğin, "foobar" adlı bir alanda tek bir tamsayı depolamak için, bu 19 baytlık dizeyle sonuçlanırsınız:

<foobar>42</foobar>

Öte yandan, gerçek bir veritabanı bunu 4 bayt alan tek bir integar değeri olarak saklayacaktır. Veritabanınız küçükse, bu pek bir şey ifade etmiyor, ancak 10.000 kaydınız varsa, bu bir sorun.

İkinci olarak, XML her dosya okunduğunda metinden ayrıştırılmalıdır. Yukarıdaki alan için, gerçek bir veritabanı ikili veriyi sadece "foobar" alanını sakladığını bildiği ofsetten belleğe okur. Dosya XML olarak depolanmışsa, "foobar" alanını okumak zorundadır, bu metni ayrıştırmak , hangi alan olduğunu belirleyin, ardından "42" dizesini ayrıştırın ve ikili 42'ye dönüştürün.

Bu nedenle, XML kullanımındaki performans cezaları çok büyüktür. XML'in avantajları, biraz insan tarafından okunabilir olması ve verilerin tamamen ayrı sistemler arasında kolay aktarılmasına izin vermesidir. Bu avantajların hiçbiri yerel bir veritabanı için geçerli değildir.

Tek istisna, genellikle küçük olan ve genellikle insanlar tarafından düzenlenebilir olması gereken yapılandırma dosyalarıdır.

Bir XML veritabanı kesinlikle herhangi bir makul SQL sisteminden daha büyük ve daha yavaş olacaktır. İnsan tarafından okunabilirlik veya birlikte çalışabilirlikte bir dengeleme avantajı bulamazsanız, veri depolama için kullanmanın bir anlamı yoktur.


1
Buradaki kritik nokta dosyanın boyutudur. İçin statik az boyutunda bir meg daha verilerine performans XML yükleme isabet kez büyük değildir. Yaklaşık 5 yıl önce bir uygulama üzerinde çalıştım ve böyle bir dosyayı yükleme maliyetinin 10 ms alanında olduğunu buldum. Bilgisayarların şimdi biraz daha hızlı olduğunu söyleyebilirim.
dave

@dave: ancak bu boyut alanına girdiğinizde XML biçimi "düzenlenebilir" bölümünde önemli ölçüde kaybolur.
Joachim Sauer

Sorunu daha da vurgulamak için, "1000000000" değerini depolamak, gerçek bir DB'de 4 bayt olurken, XML'de 27 bayt olur.
Daniel B

8

XML Bağlama bağlı olarak uygulanabilir. Verileriniz oldukça statikse ve çok fazla değişmiyorsa (örneğin, Örnek veriler), evet XML İyi bir kullanımdır.

Yapılandırma ayarları, örnek veriler (milyonlarca satır olsa da, nadiren değişse bile) hepsi XML'in iyi kullanımlarıdır.

Sabit disk okuma / yazma işlemleri pahalıdır, Oracle / Sql yığınındaki verilere erişmekten çok daha fazladır.


7

Bu, XML'in veri depolama için kullanılmaması gerektiğini ve yalnızca programın birlikte çalışabilirliği programlamak için kullanılması gerektiğini vurgulamaktadır.

Öncülünüz kusurlu.

Alıntı yaptığınız paragraf aslında XML'in veri depolama için kullanılmaması gerektiğini değil, bir veritabanı yerine geçmediğini söylüyor .

Bir ayar dosyasının bir veritabanı ile aynı olmadığı açıktır ve bu nedenle farklı teknolojiler kullanılabilir (ve kullanılmalıdır?).

Yanlışsam beni düzeltin, ancak biçimlendirme dillerinde veritabanlarından daha fazla deneyiminiz var gibi görünüyor. Veritabanlarıyla ilgili biraz deneyiminiz varsa, iki farklı teknolojinin hangi alanlara uygun olduğunu fark edersiniz.


4

Bu gerçekten öznel. Bu alıntı, birinin görüşü gibi, dostum.

Dürüst olmak gerekirse, XML ucuz bir depolama (özellikle veritabanları için ayrı ayrı ücretlendiren bir barındırma hizmeti kullanırken) da dahil olmak üzere düşük ek yükü de dahil olmak üzere bir RDMS üzerinde birden fazla avantajı olduğu için bir veritabanına uygun bir alternatif olduğunu düşünüyorum.

DasBlog ve BlogEngine'e göz atın . Bu uygulamaların her ikisi de varsayılan olarak depolama için xml kullanır.

Bahsedilen. Bu bir RDMS değildir ve verilerinizde yüksek oynaklık (çok sayıda güncelleme, ekleme veya silme) varsa veya yüksek kullanılabilirlik gerektiriyorsa, bir veritabanı kullanın. XML, yapılandırma verileri ve düşük oynaklık verileri gibi küçük şeyleri saklamak için uygundur.


Alıntı aslında bir kitaptan. Bunu da eklemeliyim
Kian

2
"Düşük havai?" Bence "kurulum gerektirmez" demek istiyorsun. Büyük bir XML dosyasındaki verilere erişmenin çok büyük bir zamanı, G / Ç ve işlemci yükü vardır. Evet, XML küçük şeyler için iyidir (<1MB), ancak hayır, XML genel olarak düşük volatilite verileri için değil, genel olarak küçük şeyler için iyidir.
GlenPeterson

Güzel Büyük lebowski hommage
InvisiblePanda

1

sorum şu, Bu hala geçerli bir ifade ve şimdi XML kullanarak veri depolamak kabul edilebilir mi?

Örneğinizde .NET yapılandırma dosyaları hakkındaki örneğinizi görüyorum. Ancak, başka bir dosya biçimi kullanılmış olabilir. Aslında, eski günlerde, bu ayarlar INI dosyaları olarak adlandırılan normal metin dosyalarında saklanıyordu.

Bir veritabanını yazılım sistemi olarak tanımlarsanız , gri renkte sunduğunuz ifadenin geçerli ve doğru olduğunu görüyorum .

XML tanımı XML tanımı "(XML) insan tarafından okunabilir ve makine tarafından okunabilir, hem bir biçimde belge kodlanması için bir dizi kural tanımlayan bir işaretleme dilidir." Olduğu durumları

Bu tanım , verileri yönetme mekanizmalarına değil, okunabilirliğe ve dile odaklanmaktadır .

RDBMS ile karşılaştırıldığında, XML, bir XML dosyasına rastgele satır eklemek ve silmek için bir yol sağlamaz. Örneğin, 1000000 satırınız varsa ve tek bir kullanıcı ortamında bile rasgele satırları silmek istiyorsanız XML tabanlı dosya bir veritabanı için iyi bir seçim olmaz. Ayrıca, XML verileri kilitlemek için herhangi bir yerel mekanizma sağlamaz. Aslında, XML bir yazılım olmadığından, veritabanı işlemlerinin paylaşılan bir ortamda güvenilir bir şekilde işlenmesini garanti eden tüm ACID (atomisite, tutarlılık, izolasyon, dayanıklılık) özellikleri (Dayanıklılık hariç) geliştirilmek üzere geliştiriciye bırakılmıştır. XML, farklı sunucular (örneğin, müşteri xml dosyası ve siparişler xml dosyası - Bütünlüğü zorlayacak FK yok), XML dosyaları arasında veri bütünlüğünü işlemek için sağlam bir belirtime sahip değildir.

Yukarıdaki, XML'in eksik olduğu bir numaralandırma değildir, bunun yerine XML'in bir veritabanı yazılımı olmadığı ifadesinin hızlı bir gerekçesi olarak sunucu olabilir .


1

XML asla bir veritabanı olmak ya da onun yerine geçmek anlamına gelmez.

XML temel olarak Web belgeleri için tanımlanmıştır. allows for the creation of customized tags for individual information fields.Ancak, bununla hiçbir zaman ilişkisel merkezi veri yönetimi gerçekleştiremezsiniz.


0

Neden ilk etapta veri depolamak için XML kullanmak istiyorsunuz ? Demek istediğim, sonuçta bir dil ...

Esnek ve anlaşılması kolay bir biçim olduğunu iddia edebilirken, bu yalnızca dosyalarda manuel düzenleme yapmanız gerektiğinde geçerlidir. Veri tabanı ile ortak arayüz (Y ve Z gereksinimlerini karşılayan X verilerini getir, X verilerini sakla / güncelle, ...) ile etkileşime girdiğinizde bu avantajlar geçersiz hale gelir.


1
Doğal Diller yüzyıllardır veri depolamak için kullanılmıştır. Anlaşılabilirlik, onu okuyan uygulama kullanılamaz hale gelirse de geçerlidir (örneğin, hiç yükseltilmemiş bazı 16 bit uygulamalar). Verilerin insan tarafından okunabilir bir formatta saklanması, taşımayı kolaylaştırır; özellikle biçim hiç bu kadar iyi belgelenmemişse veya belgeler de kaybolmuşsa.
Paul Butcher

1
Verileri depolamak için doğal dili kullanmak sorunlu değildir, ancak verileri okunabilirlik, bilgi verimliliği ve içeriğe bilgi oranı gibi korkunç bir biçimde saklamak için kişisel olarak konuştuğum bir şeydir.
zxcdw

0

Kısa cevap: Duruma göre değişir.

Uzun cevap: Benim açımdan, bu büyük ölçüde depolamak istediğiniz veri miktarına bağlıdır. Örneğin, çalışma zamanı sırasında uygulamanızda birkaç nesne varsa ve aracı çalıştırdıktan sonra saklamak istiyorsanız bir XML dosyası gayet iyi. Ancak, web mağazanızda 5000 müşteri ve hatta daha fazla sipariş varsa bir veritabanı daha uygun bir veri depolama alanı olacaktır.

Ayrıca, ayarları bir veritabanında saklamak ve app.config gibi bir dosyada saklamak çoğu durumda çok yararlı olmadığını düşünüyorum, ancak bu örneğin teklifi yanlış kanıtladığını sanmıyorum.


0

XML, yapılandırma ayarları için mükemmel bir seçimdir. XML dosyaları yalnızca bir IDE'de ayrıştırmak / vurgulamakla kalmaz, aynı zamanda programcı olmayanların da düzenlemesi çok kolaydır. Onları bakım görevlerinin tasarımcılar ve içerik yöneticileri tarafından gerçekleştirildiği web geliştirme senaryolarında inanılmaz derecede faydalı buluyorum.

XML, önemsiz olmayan uygulamalar için genellikle birincil veri kaynağı olarak kullanılmamalıdır. Serileştirme / serileştirme yükü tek başına farklı bir çözüm için yalvarır.


0

Veritabanı terimi sadece ham verilere veya veritabanı yönetim sistemine atıfta bulunabilir. Bu tanım tüm argümanda büyük bir fark yaratıyor.

RDBMS tanımını kullanırsak, XML bu anlamda çok azdır. ACID garantileri açısından çok az şey elde edersiniz (bunları gerçekleştirmek için kendi kodunuzu yazmanız gerekir). Bunlara (ve çoğu işlemsel sisteme) ihtiyacınız varsa, zaten büyük beladasınız demektir. RDBMS'lerle verilen ve yeniden icat etmeniz ve yeniden uygulamanız gereken yüzlerce özelliğin bir listesini verebilirim. Güvenlik modellerini, çoğaltmayı, yedeklemeleri düşünün, sadece birkaç temel modeli adlandırın.

Yukarıdaki anlamda, hayır, XML bir veritabanı değildir ve onu bir veritabanı olarak kullanmaya çalışmamalısınız.

"Ham veri" tanımını kullanırsak XML çok daha iyi sonuç verir, ancak yine de o kadar da iyi değildir. Diğerlerinin işaret ettiği gibi, genel olarak büyük ölçüde ayrıntılıdır, genellikle ikili kodlamadan yoksundur ve yinelenen etiketler vb. . XML, kayıtları sürekli eklediğiniz en basit durumlar için bile özellikle uygun değildir. XML dosyanızın geçerli olmasını istediğinizi varsayarsak, tek bir kapanış etiketine ihtiyacınız vardır. Bu, bir kayıt eklemenin sonunda etiketleri yukarı kaydırmanız gerektiği anlamına gelir. Bu oldukça pahalı (bu etiketin nereden başladığını nasıl biliyoruz? Ya birden fazla "tablo" varsa, tüm dosyayı yukarı taşıyabilir miyiz?) Ve eğer etrafında çalışmak isterseniz, '

XML'in uygun olduğu durumlar vardır - yapılandırma dosyaları harika bir örnektir, çünkü bunlar genellikle küçüktür ve insan tarafından okunabilirliği mükemmel bir özelliktir. Yalnızca bir yapılandırma dosyası için bir veritabanına sahip olmak aşırı olabilir.

Öte yandan, veritabanları binlerce (veya milyonlarca / milyarlarca) kaydınız olduğunda ve aynı anda birçok kullanıcının güncellenmesi durumunda mükemmeldir. Evet, XML bir veritabanı değildir ve onu bir veritabanı gibi kullanmamalısınız. Örneğin, ilk etapta bir DB'ye ihtiyaç duymadığınız durumlardan biri olur ve XML daha uygundur.

Ben böyle görüyorum: XML olarak bir DB (örneğin, bir işlem sistemi için bir destek deposu olarak) kullanıyorsanız, bir RDBMS yeniden icat ve yeniden yazma sona erecek . Bu, zamanınızı ve enerjinizi harcamak için gerçekten kötü bir yoldur. Bence bu alıntı da böyle söylüyordu.


0

Bunun ilişkisel bir veritabanı olmadığını kabul ediyorum. Bence yazar alıntıda sadece bir olarak kullanmamanızı söylüyor.

Gerçi buna ihtiyacın olabilir ya da olmayabilir. Veriler üzerinde çok fazla sorgulama yapmanız gerekmiyorsa ve yalnızca verileri depolayıp daha sonra bazı sınırlı sorgu ölçütlerine dayanarak getirmek istiyorsanız, XML DOCUMENT depolamasına ve geri çağırma işlemine ihtiyacınız var - ilişkisel bir veritabanı değil.

Daha sonra yeniden almak için içinde veri bulunan bir belgeyi depolaması gereken birçok uygulama vardır. Bu durumda, SQL tabanlı bir şema oluşturmak, XML'i ayrıştırmak ve daha sonra veritabanını sadece tersini yapmak için serileştirmek işe yaramaz. Potansiyel olarak bunu yapan çok fazla kod yükü vardır. Doğru yaparsanız daha az şey var.

Basit CRU işlemlerini gerçekleştiren bir hizmet oluşturmak için ihtiyacınız olan tüm kodu pratik olarak oluşturmak için Hazırda Bekleme gibi ORM araçlarını ve Apache Axis gibi araçları kullanabilirsiniz. Bunu, kimlik doğrulamasında elbette sarmanız gerekir ve muhtemelen verileri kullanıcıya, erişim düzeyine vb. Göre ayırmak isteyebilirsiniz. Belirli bir kullanıcının SOAP hizmeti aracılığıyla hangi işlemlere izin verileceğini misal.

Bu anlamda içerik yönetimine her şeyden daha çok benziyorsunuz.

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.