XML veri türü ne zaman kullanılır?


12

Bir projede veritabanı oluşturmaktan sorumluyum. Nadiren bir değeri olacak alanlarımız var (her 10.000 kayıtta 1) ve bunu veritabanında saklamanın en iyi yolunu bulmaya çalışıyorum.

Görebildiğim kadarıyla 3 seçeneğim var:

  1. Her bir ekstra değer için tabloya bir sütun ekleyin
  2. Özgün tabloya başvuran ve yalnızca bir değeri depolamamız gerektiğinde kayıtları olan bağlantılı bir tablo ekleyin
  3. Orijinal tablodaki XML veri türünü kullanın ve bu değerlerin tümünü depolayın.

Düşünmediğim başka seçenekler var mı?

Ben her yöntemin artılarını ve eksilerini çalışmaya çalışıyorum. Bildiğim kadarıyla 1 en kolay ve 2 en az yer kaplayacak ama 3 için birçok kaynak bulmakta zorlanıyorum.


1
Bir veritabanında xml kötüye karşı kişisel bir rant eklemek için doğrudan başlıktaki soruya cevap ve büyük bir yağ derim: ASLA! Sorunun gerçek gövdesi için meslektaşların size yardım etmesine izin vereceğim, çünkü zaten çok iyi cevaplarınız var :-). PS: Aslında benim ilk cümleyi görmezden gelebilirsin.
Marian

Fazladan kaç alandan bahsediyorsun? Ve aynı Varlığın parçası olmak için bir anlam ifade ediyorlar mı?
Andrew Bickerton

Yanıtlar:


12

İhtiyacınız olan şey seyrek sütunlar ve filtrelenmiş dizinlerdir ve seçenek 1 ile birlikte gelir. Bunlar tam olarak bu senaryo için tamamen desteklenen ve belgelenmiş özelliklerdir.

SQL Server Veritabanı Altyapısı, SPARSE anahtar sözcüğünü bir sütun tanımında o sütundaki değerlerin depolanmasını en iyi duruma getirmek için kullanır. Bu nedenle, tablodaki herhangi bir satır için sütun değeri NULL olduğunda, değer depolama gerektirmez.

Bu senaryoda iyi performans gösteren bir XML çözümü hayal edemiyorum, gereksiz meta veriler büyük bir yükü olacak ve sorgu yavaş olacaktır.


1
Bence seyrek sütunlar peşimde. Çok az miktarda veri muhtemelen bazı tablolarda sütunların bir avuç içinde saklanmasını bekliyorum.
Matthew Steeples

Ben bu doğru okuyorsun emin değilim, ama bu bağlantıya göre seyrek sütunlar temelde ben zaten 3 için bakıyordum ne bir veritabanı uygulaması onlar değil mi? blog.sqlauthority.com/2008/07/14/…
Matthew Steeples

Dahili olarak bu şekilde uygulanırsa (ve bunun birisinin blog'u olduğunu bilmiyorum), XML ile asla başa çıkmak veya ayrıştırmak zorunda kalmazsınız - tam olarak normal bir tablo gibi davranır (herhangi bir kısıtlama ile) ) veri tipleri hakkında
Gaius

5
  1. Bir null sütun alır hiçbir SQL Server değişken uzunlukta eğer boşluk. NULL olmanız , NULL bitmap'de saklanır . Gerekirse filtrelenmiş dizinlerle dizinleyebilirsiniz, böylece NULL sütunları yok sayın.

  2. Nokta 1'i düşündüğünüzde karmaşıklık ekler.

  3. Yapma. Aramak zor, ayrıştırmak vb: bundan sonra pişman olacaksınız

Ayrıca boyuta da bağlıdır: bu birkaç milyar satır için char (1000) olacak mı? Ya da 100 bin satır için tinyint? İkincisi, nokta 2'nin ek karmaşıklığını düşünürse: buna değmez.


Boş olan boş değerli bir sütunun yer kaplamadığına dair bir referansınız var mı? Boş olup olmadığının boş bitmap'te depolanıp depolanmadığının farkındaydım, ancak sabit uzunluk alanları için verilerin hala tabloda depolandığını düşündüm. Bu değerlerin çoğu için kullanacağım veri türü paradır (yani 8 bayt)
Matthew Steeples

1
@Matthew Steeples: Değişken uzunluğun zaten yer kaplamadığını söyledim. Ve referans için sqlskills.com/BLOGS/PAUL/category/On-Disk-Structures.aspx#p41 Bu 8 bayt için satırlar nasıl olabilir?
gbn

Şu anda 500.000 sıradayız, ancak düzgün bir şekilde yaşadığımızda haftada yaklaşık 1 milyon oranında genişleyeceğiz (umarım).
Matthew Steeples

3

SQL Server 2008 ile, belirttiğiniz durum için özel olarak tasarlanmış seyrek sütunları kullanma ek seçeneğiniz vardır.

XML COLUMN_SET kullanarak bunları birleştirilmiş bir XML nesnesi olarak görüntüleyebilmeniz veya tek tek başvuruda bulunabilmeniz için ek bir yararı vardır ve çok büyük bir alan tasarrufu sağlarlar.

Daha fazla ayrıntı için aşağıdaki blog makalesine göz atın: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx


-4

Dördüncü seçenek: tablo kullanmayın. Tablolar bu tür verilere çok uygundur (aslında, tablo biçimine zorla yerleştirilmemiş her türlü veri). Sadece XML kullanın.


3
-1 "tabloları kullanma" seçeneğinin doğru olduğu söylense de, cevap açıkça tablo yapılarına karşı bir rant belirtiyor ve aslında yararlı bir cevap vermiyor.
Andrew Bickerton
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.