[sql] JSON 문자열 저장에 가장 적합한 SQL 데이터 유형은 무엇입니까?

JSON 문자열을 저장하는 데 가장 적합한 SQL 데이터 유형은 무엇입니까?

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;
}

JSON이 포함 된 문자열을 저장하려면 어떤 SQL 데이터 유형을 사용해야합니까?

  • NVARCHAR(255)?
  • TEXT?
  • VARBINARY(MAX)?


답변

확실히 아닙니다 :

  • TEXT, NTEXT: 이러한 유형은 SQL Server 2005에서 더 이상 사용되지 않으며 새로운 개발에 사용해서는 안됩니다. 사용 VARCHAR(MAX)또는 NVARCHAR(MAX)대신

  • IMAGE, VARBINARY(MAX): IMAGE는처럼 더 이상 사용되지 않으며 TEXT/NTEXT텍스트 문자열을 이진 열에 저장할 필요가 없습니다 ….

따라서 기본적으로 leave VARCHAR(x)또는 NVARCHAR(x): VARCHAR는 비 유니 코드 문자열 (문자 당 1 바이트)을 NVARCHAR저장하고 모든 것을 문자 당 2 바이트 유니 코드 모드로 저장합니다. 그렇다면 유니 코드가 필요합니까? 문자열에 아랍어, 히브리어, 중국어 또는 기타 비서 유럽 문자가 잠재적으로 있습니까? 그런 다음NVARCHAR

(N)VARCHAR열은 두 가지 종류로 제공 : 하나는 8000 바이트 이하 (결과하는 최대 길이 정의 VARCHAR최대 8000 자, NVARCHAR그 충분하지 않습니다 경우 최대 4000가), 또는 사용 (N)VARCHAR(MAX)데이터의 2 기가 바이트까지 저장할 버전.

업데이트 : SQL Server 2016 에는 네이티브 JSON 지원이 포함됩니다. 새로운 JSON데이터 유형 (을 기반으로 함 nvarchar)과 FOR JSON쿼리의 출력을 JSON 형식으로 변환 하는 명령 이 도입 됩니다.

업데이트 # 2 : 최종 제품에서 Microsoft는 별도의 JSON데이터 유형을 포함하지 않았습니다. 대신 유형의 열에서 작동하는 여러 JSON 함수 (데이터베이스 행을 JSON으로 패키징하거나 JSON을 관계형 데이터로 구문 분석)가 있습니다.NVARCHAR(n)


답변

나는 갈 nvarchar(max)것이다. 요구 사항에 맞아야합니다.

업데이트 :
SQL Server 2016 및 Azure SQL에는 많은 추가 네이티브 JSON 기능이 있습니다. 이는 디자인이나 접근 방식에 긍정적 인 영향을 미칠 수 있습니다. 자세한 내용은 https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server 를 읽을 수 있습니다.


답변

nvarchar(max)SQL 2016 또는 Azure SQL에서 JSON 기능을 사용하려는 경우 사용 하는 것이 좋습니다 .

이러한 기능을 사용할 계획이없는 경우 (및 ) 기능 과 varbinary(max)함께 사용할 수 있습니다 . 추가 정보 : https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/COMPRESSDECOMPRESS

COMPRESS 및 DECOMPRESS 기능은 표준 GZip 압축을 사용합니다. 클라이언트가 GZip 압축을 처리 할 수있는 경우 (예 : gzip 콘텐츠를 이해하는 브라우저) 압축 된 콘텐츠를 직접 반환 할 수 있습니다. 이것은 성능 / 스토리지 트레이드 오프입니다. 압축 된 데이터를 자주 쿼리하는 경우 텍스트를 매번 압축 해제해야하므로 마이그레이션 성능이 느려집니다.


답변


답변

nvarchar (max)는 이것에 더 좋습니다. 또한 이와 같이 할 수있는 한 가지 더 있습니다.

public class TableName
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public string FieldJson { get; set; }   //save json in this field and

    [NotMapped]
    public List<FieldList> FieldList  // get return list from this properity
    {
        get => !string.IsNullOrEmpty(FieldJson) ? JsonConvert.DeserializeObject<List<FieldList>>(FieldJson) : null;
    }


}


답변