Kapan menggunakan tipe data XML

12

Saya bertanggung jawab untuk membuat database pada suatu proyek. Kami memiliki bidang yang jarang memiliki nilai (1 dalam setiap 10.000 catatan) dan saya mencoba mencari cara terbaik untuk menyimpan ini dalam database.

Sejauh yang saya bisa lihat, saya memiliki 3 opsi:

  1. Tambahkan kolom di tabel untuk setiap nilai tambahan
  2. Tambahkan tabel tertaut yang mereferensikan tabel asli dan memiliki catatan hanya di mana kita perlu menyimpan nilai
  3. Gunakan tipe data XML dalam tabel asli dan simpan semua nilai dalam ini.

Apakah ada opsi lain yang tidak saya pertimbangkan?

Saya mencoba mencari pro dan kontra dari setiap metode. Sejauh yang saya tahu 1 akan menjadi yang paling mudah dan 2 akan mengambil jumlah ruang paling sedikit tapi saya berjuang untuk menemukan banyak sumber daya untuk 3.

Matthew Steeples
sumber
1
Untuk menambahkan kata-kata kasar pribadi terhadap penyalahgunaan xml dalam database, saya akan menjawab langsung pertanyaan dalam judul dan mengatakan "lemak besar": TIDAK PERNAH! Untuk pertanyaan sebenarnya, saya akan membiarkan kolega membantu Anda, karena Anda sudah memiliki jawaban yang sangat bagus :-). PS: Anda sebenarnya bisa mengabaikan kalimat pertama saya.
Marian
Berapa banyak bidang tambahan yang Anda bicarakan? Dan apakah mereka masuk akal untuk menjadi bagian dari Entitas yang sama?
Andrew Bickerton

Jawaban:

12

Kedengarannya seperti yang Anda butuhkan adalah kolom yang jarang dan indeks yang difilter dan ikuti dengan opsi 1. Ini adalah fitur yang sepenuhnya didukung dan didokumentasikan untuk skenario ini.

Mesin Database SQL Server menggunakan kata kunci SPARSE dalam definisi kolom untuk mengoptimalkan penyimpanan nilai dalam kolom itu. Oleh karena itu, ketika nilai kolom NULL untuk setiap baris dalam tabel, nilai tersebut tidak memerlukan penyimpanan.

Saya tidak bisa membayangkan solusi XML berkinerja baik dalam skenario ini, itu akan memiliki overhead yang besar dari metadata yang berlebihan dan akan lambat untuk query.

Gayus
sumber
1
Saya pikir kolom jarang adalah apa yang saya cari. Saya mengharapkan sejumlah kecil data untuk disimpan di beberapa kolom di tabel tertentu.
Matthew Steeples
Saya tidak yakin jika saya membaca ini dengan benar, tetapi menurut tautan ini, kolom yang jarang pada dasarnya adalah implementasi basis data dari apa yang saya cari selama 3, bukan? blog.sqlauthority.com/2008/07/14/…
Matthew Steeples
Jika diimplementasikan secara internal seperti itu (dan saya tidak tahu itu, itu hanya blog seseorang) maka Anda tidak akan pernah harus berurusan dengan atau parsing XML sendiri - itu akan berperilaku persis seperti tabel biasa dengan (dengan batasan apa pun pada tipe data)
Gayus
5
  1. Kolom nullable tidak membutuhkan ruang jika panjang variabel dalam SQL Server. Fakta menjadi NULL disimpan dalam bitmap NULL . Anda dapat mengindeksnya jika diperlukan dengan indeks yang difilter sehingga Anda mengabaikan kolom NULL.

  2. Menambahkan kompleksitas ketika Anda mempertimbangkan poin 1.

  3. Jangan. Sulit dicari, parsing dll: Anda akan menyesalinya nanti

Ini juga tergantung pada ukuran: apakah ini akan menjadi char (1000) untuk beberapa miliar baris? Atau tinyint untuk baris 100rb? Jika yang terakhir mempertimbangkan kompleksitas poin 2 yang ditambahkan: tidak sepadan.

gbn
sumber
Apakah Anda memiliki referensi bahwa kolom nullable yang null tidak membutuhkan ruang. Saya sadar bahwa apakah itu nol atau tidak disimpan dalam bitmap nol tetapi berpikir untuk bidang panjang tetap bahwa data masih disimpan dalam tabel. Tipe data yang akan saya gunakan untuk sebagian besar dari nilai-nilai ini adalah uang (jadi 8 byte)
Matthew Steeples
1
@Maththew Steeples: Saya katakan panjang variabel tidak membutuhkan ruang. Dan untuk referensi sqlskills.com/BLOGS/PAUL/category/On-Disk-Structures.aspx#p41 Bagaimana baris untuk 8 byte ini?
gbn
Saat ini kami berada di 500.000 baris tetapi kami akan memperluas (mudah-mudahan) pada tingkat sekitar 1 juta per hari kerja setelah kami hidup layak.
Matthew Steeples
3

Dengan SQL Server 2008 Anda memiliki opsi tambahan untuk menggunakan kolom jarang, yang dirancang khusus untuk situasi yang Anda sebutkan.

Mereka memiliki manfaat tambahan bahwa Anda dapat melihatnya sebagai objek XML gabungan menggunakan XML COLUMN_SET atau referensi secara individual dan mereka memberikan penghematan ruang yang luar biasa.

Lihat artikel blog berikut untuk lebih jelasnya: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx

Jeff
sumber
-4

Opsi keempat: jangan gunakan tabel. Tabel sangat tidak cocok untuk data jenis ini (pada kenyataannya, untuk semua jenis data yang belum dipasang secara paksa ke dalam bentuk tabel). Cukup gunakan XML.

pengguna1359
sumber
3
-1 sementara memang benar bahwa "jangan gunakan tabel" adalah pilihan , jawabannya jelas menyatakan kata-kata kasar terhadap struktur tabel dan tidak benar-benar mengirimkan jawaban yang bermanfaat.
Andrew Bickerton