Коли використовувати тип даних XML


12

Я відповідаю за створення бази даних про проект. У нас є поля, які рідко мають значення (1 на кожні 10 000 записів), і я намагаюся розробити найкращий спосіб збереження цього в базі даних.

Наскільки я бачу, у мене є 3 варіанти:

  1. Додайте стовпчик у таблицю для кожного додаткового значення
  2. Додайте зв'язану таблицю, яка посилається на оригінальну таблицю і має записи лише там, де нам потрібно зберігати значення
  3. Використовуйте тип даних XML в початковій таблиці і зберігайте в цьому всі значення.

Чи є інші варіанти, які я не розглядав?

Я намагаюся розробити плюси і мінуси кожного методу. Наскільки я можу сказати, 1 було б найпростішим, а 2 займало б найменше місця, але я намагаюся знайти багато ресурсів для 3-х.


1
Щоб додати в базу даних персональну злочину проти зловживання XML, я відповів би прямо на запитання в заголовку і сказав великим жиром: НІКОЛИ! Що стосується актуального питання, я дозволю колегам допомогти вам, тому що ви вже маєте дуже хороші відповіді :-). PS: Ви фактично можете проігнорувати моє перше речення.
Маріан

Скільки зайвих полів ви говорите? І чи є сенс бути частиною одного Сутності?
Ендрю Бікертон

Відповіді:


12

Здається, що вам потрібні розріджені стовпці та відфільтровані покажчики та перехід із варіантом 1. Це повністю підтримувані та задокументовані функції саме для цього сценарію.

Система баз даних SQL Server використовує ключове слово SPARSE у визначенні стовпця для оптимізації зберігання значень у цьому стовпці. Тому, коли значення стовпця становить NULL для будь-якого рядка таблиці, значення не потребує зберігання.

Я не можу уявити, що рішення XML успішно працює в цьому сценарії, воно матиме величезну накладну кількість зайвих метаданих і буде повільно запитувати.


1
Я думаю, що за цим я йду. Я очікую, що дуже невеликий об'єм даних буде зберігатися в певному колоні певних таблиць.
Метью Стіплз

Я не впевнений, чи читаю я це право, але згідно з цим посиланням розріджені стовпці - це в основному реалізація бази даних того, що я шукав на 3, все-таки, чи не так? blog.sqlauthority.com/2008/07/14/…
Matthew

Якщо вона буде реалізована таким чином (і я не знаю, що це так, це просто чийсь блог), то вам ніколи не доведеться самостійно мати справу з розбором XML - він буде вести себе точно як звичайна таблиця (з будь-якими обмеженнями) про типи даних)
Гай

5
  1. Зменшуваний стовпчик не займає місця, якщо змінна довжина в SQL Server. Факт наявності NULL зберігається в растровій карти NULL . Ви можете індексувати його, якщо потрібно, відфільтрованими індексами, щоб ви ігнорували стовпці NULL.

  2. Додає складності, якщо врахувати пункт 1.

  3. Не варто. Важко шукати, синтаксичний аналіз і т.д. , ви будете жалкувати про це пізніше

Це також залежить від розміру: чи буде це знаком (1000) на кілька мільярдів рядків? Або tinyint на 100k рядків? Якщо останні вважають додаткову складність пункту 2: не варто.


Чи є у вас посилання, що нульовий стовпець, який є нульовим, не займає місця. Я усвідомлював, що нульовий він чи ні зберігається в нульовій растровій карті, але вважав, що для полів фіксованої довжини дані зберігаються в таблиці. Тип даних, який я буду використовувати для більшості цих значень, - це гроші (тобто 8 байт)
Matthew Steeples

1
@Matthew Steeples: Я сказав, що змінна довжина вже не займає місця. А для довідок sqlskills.com/BLOGS/PAUL/category/On-Disk-Structures.aspx#p41 Як можуть бути рядки для цих 8 байтів?
gbn

На даний момент ми знаходимося в 500 000 рядків, але ми будемо розширюватися (сподіваємось) зі швидкістю близько 1 мільйона в будній день, як тільки ми будемо жити належним чином.
Метью Стіплз

3

У SQL Server 2008 у вас є додаткова можливість використання розріджених стовпців, розроблених спеціально для ситуації, про яку ви згадали.

Вони мають додаткову перевагу, що ви можете розглядати їх як об'єднаний XML-об’єкт за допомогою XML COLUMN_SET або посилатись на них окремо, і вони забезпечують величезну економію місця.

Перегляньте наступну статтю в блозі для отримання більш детальної інформації: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-column-and-XML-COLUMN_SET.aspx


-4

Четвертий варіант: не використовувати таблиці. Таблиці дуже погано підходять до подібного роду даних (насправді, до будь-якого типу даних, які не були примусово вбудовані в табличну форму). Просто використовуйте XML.


3
-1 так як правда, що "не використовувати таблиці" є варіантом , відповідь чітко свідчить про протидію структурам таблиць і насправді не подає корисної відповіді.
Ендрю Бікертон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.