Какой лучший тип данных SQL для хранения строки JSON?
Какой лучший тип данных SQL для хранения строки JSON?
static List<ProductModel> CreateProductList()
{
string json = @"[
{
ProductId: 1,
ProductCode: 'A',
Product: 'A'
},
{
ProductId: 2,
ProductCode: 'B',
Product: 'B'
}
]";
IList<JToken> tokenList = JToken.Parse(json).ToList();
List<ProductModel> productList = new List<ProductModel>();
foreach (JToken token in tokenList)
{
productList.Add(JsonConvert.DeserializeObject<ProductModel>(token.ToString()));
}
return productList;
}
Какой тип данных SQL следует использовать для хранения такой строки, содержащей JSON?
-
NVARCHAR(255)
?
-
TEXT
?
-
VARBINARY(MAX)
?
Ответы
Ответ 1
Конечно НЕ:
-
TEXT, NTEXT
: эти типы устарели с SQL Server 2005 и не должны использоваться для новой разработки. Вместо этого используйте VARCHAR(MAX)
или NVARCHAR(MAX)
-
IMAGE
, VARBINARY(MAX)
: IMAGE
устарел так же, как TEXT/NTEXT
, и нет смысла хранить текстовую строку в двоичном столбце....
Таким образом, в основном уходит VARCHAR(x)
или NVARCHAR(x)
: VARCHAR
хранит строки не Unicode (1 байт на символ), а NVARCHAR
хранит все в режиме Unicode в 2 байта за символ. Вам нужен Юникод? У вас есть арабский, иврит, китайский или другие незападные европейские персонажи в ваших строках? Затем перейдите к NVARCHAR
Столбцы (N)VARCHAR
представлены в двух вариантах: либо вы определяете максимальную длину, которая составляет 8000 байт, либо меньше (VARCHAR
до 8000 символов, NVARCHAR
до 4000), или если этого недостаточно, используйте версии (N)VARCHAR(MAX)
, в которых хранится до 2 ГБ данных.
Обновление: SQL Server 2016 будет иметь встроенную поддержку JSON - будет введен новый тип данных JSON
(который основан на NVARCHAR
), а также a FOR JSON
для преобразования вывода из запроса в формат JSON
Обновление # 2: в конечном продукте, Microsoft не включила отдельный тип данных JSON
- вместо этого существует ряд JSON-функций (для упаковки строк базы данных в JSON или для разбора JSON в реляционных данных), которые работают с столбцами типа NVARCHAR(n)
Ответ 2
Я пойду за nvarchar(max)
. Это должно соответствовать требованиям.
Update:
С SQL Server 2016 и Azure SQL существует множество дополнительных возможностей JSON. Это может положительно повлиять на ваш дизайн или подход. Вы можете прочитать это для более: https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server
Ответ 3
Я бы рекомендовал использовать nvarchar(max)
, если вы планируете использовать функции JSON на SQL 2016 или Azure SQL.
Если вы не планируете использовать эти функции, вы можете использовать varbinary(max)
в сочетании с функциями COMPRESS
(и DECOMPRESS
). Дополнительная информация: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/
Функции COMPRESS и DECOMPRESS используют стандартное сжатие GZip. Если ваш клиент может обрабатывать сжатие GZip (например, браузер, который понимает содержимое gzip), вы можете напрямую возвращать сжатый контент. Обратите внимание, что это компромисс производительности/хранения. Если вы часто запрашиваете сжатые данные, у вас есть более медленная производительность, потому что текст должен каждый раз распаковываться.