Хранить массив чисел в поле базы данных - PullRequest
20 голосов
/ 17 марта 2011

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

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

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

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

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

EDIT: Немного предыстории: числа, которые хранятся, являются лишь некоторыми коэффициентами, которые не участвуют ни в каких отношениях и всегда используются в качестве массива (то есть никогда значение не извлекается или используется отдельно).

Ответы [ 6 ]

38 голосов
/ 17 марта 2011

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

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

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

12 голосов
/ 17 марта 2011

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

5 голосов
/ 21 ноября 2012

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

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

ВЫ, как разработчик, должны понимать, насколько «монолитным» является этот массив целых чисел.

3 голосов
/ 17 марта 2011

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

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

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

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

1 голос
/ 17 марта 2011

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

1 голос
/ 17 марта 2011

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

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

...