Сохранить массив чисел в поле базы данных

Контекст: SQL Server 2008, C#

У меня есть массив целых чисел (0-10 элементов). Данные не часто меняются, но часто извлекаются.

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

Вопрос 1. Следует ли хранить массив в отдельной таблице? Пожалуйста, укажите причины того или иного варианта.

Вопрос №2: (независимо от ответа на вопрос №1), как лучше всего хранить int[] в поле базы данных? XML? JSON? CSV?

РЕДАКТИРОВАТЬ: Некоторая предыстория: сохраняемые числа — это всего лишь некоторые коэффициенты, которые не участвуют ни в каких отношениях и всегда используются как массив (т. е. никогда значение не извлекается и не используется изолированно).


person THX-1138    schedule 17.03.2011    source источник


Ответы (6)


«Лучший» способ хранения данных в базе данных — это способ, наиболее подходящий для операций, которые будут выполняться с ней, и способ, который облегчает обслуживание. Именно это более позднее требование должно привести вас к нормализованному решению, которое означает хранение целых чисел в таблице со связью. Помимо простоты обновления, следующему разработчику, который придет после вас, будет легче понять, что и как хранится информация.

person Thomas    schedule 17.03.2011

Отдельная таблица, нормализованная

Не как XML или json, а отдельные числа в отдельных строках

Что бы вы ни думали, это лучший способ. Вы можете поблагодарить меня позже

person gbn    schedule 17.03.2011
comment
Привет, я из далекого будущего (2014). Я здесь, чтобы поблагодарить вас. - person Voldemort; 23.10.2014
comment
@gbn, мне любопытно, почему вы считаете, что это лучший вариант по сравнению с другими альтернативами. Не могли бы вы расширить свой ответ? Спасибо! - person Yogster; 22.10.2015
comment
это очень плохое решение для многих приложений. - person Guido Mocha; 24.08.2017
comment
Как вы думаете, масштабируется ли это решение? У меня есть упорядоченный массив из 400 тыс. целых чисел, мне трудно думать, что это эффективно. Как спрашивает @jorge, не могли бы вы расширить? - person Martin Hansen; 11.01.2018
comment
@MartinHansen Этот ответ был получен до редактирования, когда мы узнали, что массив обрабатывается как блок. Если массив не требует синтаксического анализа или работы с БД, то это не ряд чисел с точки зрения БД, а простой объект, который можно хранить как тест, CSV, JSON или что-то еще. Во многих случаях это возвращается к вам, когда кто-то просит проанализировать этот массив для поиска или экспорта и т. д. Здесь есть много вопросов на эту тему. Вот почему такие типы БД, как я, будут рекомендовать раздельный подход... и почему в качестве принятого ответа это имеет x3 положительного ответа... - person gbn; 11.01.2018

Сохраните его как массив JSON, но знайте, что все обращения теперь будут ко всему массиву — никаких отдельных операций чтения/записи для определенных коэффициентов.

В нашем случае мы храним их в виде массива json. Как и в вашем случае, между отдельными номерами массива нет никакой связи - массив имеет смысл только как единица, и как единица он имеет связь с другими столбцами в таблице. Кстати, все остальное нормализовано. Я сравниваю это с этим: если бы вы собирались сохранить 10-байтовый фрагмент, вы бы сохранили его упакованным в один столбец VARBINARY(10). Вы не будете разбивать его на 10 байтов, хранить каждый в столбце VARBINARY(1), а затем сшивать их вместе с помощью внешнего ключа. Я имею в виду, что вы могли бы, но это не имело бы никакого смысла.

ВАМ, как разработчику, нужно будет понять, насколько "монолитным" является этот массив целых чисел.

person DeepSpace101    schedule 21.11.2012

Отдельная таблица была бы наиболее «нормализованным» способом сделать это. И, вероятно, в долгосрочной перспективе это лучше, поскольку вам не придется анализировать значение столбца для извлечения каждого целого числа.

Если вы хотите, вы также можете использовать XML-столбец для хранения данных. .

Разреженные столбцы также могут подойти вам.

Если вы хотите, чтобы это было действительно просто, вы можете просто разделить значения: 10;2;44;1

person Josh M.    schedule 17.03.2011
comment
Столбцы XML имеют некоторые досадные ограничения, например, не работают со связанным сервером. - person Patrick Honorez; 17.03.2011
comment
Полезно знать, спасибо. И в случае, если я не был ясен в своем ответе, я рекомендую отдельную таблицу как подходящее решение для большинства случаев. - person Josh M.; 17.03.2011

Я думаю, что, поскольку вы говорите о сервере sql, это указывает на то, что ваше приложение может быть приложением, управляемым данными. Если это так, я бы определенно сохранил массив в базе данных как отдельную таблицу с записью для каждого значения. Он будет нормализован и оптимизирован для поиска. Даже если у вас есть только несколько значений в массиве, вам может потребоваться объединить эти данные с другими извлеченными данными, которые, возможно, потребуется «присоединить» к вашим значениям массива. В этом случае sql оптимизируется с использованием индексов, внешних ключей и т. д. (нормализованных).

При этом вы всегда можете жестко закодировать 10 значений в своем коде и сохранить путь туда и обратно в БД, если вам не нужно изменять значения. Это зависит от того, как работает ваше приложение и для чего будет использоваться этот массив.

person AGoodDisplayName    schedule 17.03.2011

Я согласен со всеми остальными в том, что лучше всего использовать отдельную нормализованную таблицу. Но если вы настаиваете на том, чтобы все это было в одной таблице, не помещайте массив в один единственный столбец. Вместо этого создайте 10 столбцов и сохраните каждое значение массива в другом столбце. Это избавит вас от проблем с разбором и обновлением.

person Clodoaldo Neto    schedule 17.03.2011
comment
Я не очень согласен с этим - иногда вам может понадобиться 2 столбца, иногда вам может понадобиться 40. И если у вас есть куча необязательных столбцов в вашей таблице, они просто будут занимать место. - person Josh M.; 17.03.2011
comment
@Josh Как я понимаю из OP, никогда не будет больше 10. - person Clodoaldo Neto; 18.03.2011