Когда использовать тип данных XML

12

Я отвечаю за создание базы данных по проекту. У нас есть поля, которые редко имеют значение (1 на каждые 10 000 записей), и я пытаюсь найти лучший способ сохранить это в базе данных.

Насколько я вижу, у меня есть 3 варианта:

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

Есть ли другие варианты, которые я не рассматривал?

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

Мэтью Стиплз
источник
1
Чтобы добавить в базу данных личную разглагольствование против злоупотребления XML, я бы ответил прямо на вопрос в заголовке и сказал: «НИКОГДА! Что касается сути вопроса, я позволю коллегам помочь вам, потому что у вас уже есть очень хорошие ответы :-). PS: вы можете игнорировать мое первое предложение.
Marian
Сколько дополнительных полей вы говорите? И имеют ли они смысл быть частью одной и той же сущности?
Эндрю Бикертон

Ответы:

12

Похоже, что вам нужно, это разреженные столбцы и отфильтрованные индексы и идти с опцией 1. Это полностью поддерживаемые и документированные функции именно для этого сценария.

Компонент SQL Server Database Engine использует ключевое слово SPARSE в определении столбца для оптимизации хранения значений в этом столбце. Поэтому, когда значение столбца равно NULL для любой строки в таблице, это значение не требует хранения.

Я не могу представить, чтобы решение XML работало хорошо в этом сценарии, оно будет иметь огромные накладные расходы на избыточные метаданные и будет медленным для запроса.

Gaius
источник
1
Я думаю, что редкие столбцы - то, что я ищу. Я ожидаю, что очень небольшое количество данных будет храниться в нескольких столбцах некоторых таблиц.
Мэтью Стиплз
Я не уверен, правильно ли я это понял, но по этой ссылке разреженные столбцы - это, в основном, реализация базы данных того, на что я смотрел 3, не так ли? blog.sqlauthority.com/2008/07/14/…
Мэтью
Если он внутренне реализован таким образом (а я не знаю, что это, это просто чей-то блог), то вам никогда не придется самостоятельно разбирать или анализировать XML - он будет вести себя точно так же, как обычная таблица (с любыми ограничениями). по типам данных)
Гай
5
  1. Обнуляемая колонна не занимает не места , если длина переменной в SQL Server. Факт NULL сохраняется в битовой карте NULL . Вы можете индексировать его, если требуется, с помощью отфильтрованных индексов, поэтому вы игнорируете пустые столбцы.

  2. Добавляет сложность, когда вы рассматриваете пункт 1.

  3. Не. Трудно искать, синтаксический анализ и т.д. , вы будете сожалеть об этом позже

Это также зависит от размера: будет ли это char (1000) для нескольких миллиардов строк? Или tinyint для 100k строк? Если последние считают сложность пункта 2: не стоит.

ГБН
источник
У вас есть ссылка, что обнуляемый столбец, который является нулевым, не занимает места. Я знал, что независимо от того, был ли он нулевым или нет, он хранился в нулевом растровом изображении, но думал, что для полей фиксированной длины данные все еще хранятся в таблице. Тип данных, который я буду использовать для большинства этих значений, - это деньги (то есть 8 байт)
Мэтью Стиплз,
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-columns-and-XML-COLUMN_SET.aspx

Джефф
источник
-4

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

user1359
источник
3
-1, поскольку верно то, что опция «не использовать таблицы» является опцией , в ответе четко говорится о разглагольствованиях над структурами таблиц, а не о предоставлении полезного ответа.
Эндрю Бикертон