관계형 데이터베이스에 xml을 저장하면 어떤 이점이 있습니까?


23

오늘 AdventureWorks 데이터베이스를 주위에 파고 있었고, 난 테이블의 수는 (것으로 나타났습니다 HumanResources.JobCandidateSales.Individual예를 들면) XML 데이터를 저장하는 열을 가지고있다.

내가 알아야 할 것은 기본적으로 데이터베이스 테이블 행의 가치가있는 데이터를 다른 테이블의 열에 저장하면 어떤 이점이 있습니까? 이로 인해이 정보를 쿼리하기가 어렵지 않습니까? 아니면 데이터를 쿼리 할 필요가없고 저장 만하면된다는 가정입니까?

답변:


30

모든 데이터를 관계형으로 저장하고 데이터를 처리하기위한 코드를 작성할 필요는 없기 때문에 관계형 스토리지를위한 XML로 전달 된 것은 시간이 많이 걸리고 매우 지루합니다. 이는 많은 일반 XML 데이터가 시스템에서 대량의 일반 응답을 발생시키는 경우에 특히 그렇습니다.

다른 시스템에서 메시지가 수신되는 상황을 자주 보았으며 포함 된 내용의 98 %를 신경 쓰지 않습니다. 그래서 우리는 관심있는 2 %를 나누고 관계를 저장 한 다음 나머지 98 %가 나중에 필요할 경우를 대비하여 전체 메시지를 저장하도록 구문 분석합니다.

그리고 SQL Server는 T-SQL에서 XML로 작업 할 수있는 OK-ish 도구 및 구문을 제공하므로 내용을 저장하는 방식과 같은 임시 쿼리의 실제 범위를 완전히 넘어서는 것처럼 보이지 않습니다. CSV의.

그리고 실제로 저장하려는 항목이 XML 일 가능성을 배제합니다 (예 : 지원 및 디버그 목적으로).


10
+1, "지금 먹기. 나중에 구하기." 사탕에 대한 비참한 마케팅 캠페인 이었지만이 경우에는 XML 저장소에서 작동합니다.
Dan Rosenstark

11

데이터 형식이 일시적이고 변경이 가능한 경우,이를 XML로 조합하여이 형식으로 데이터베이스에 저장하여 향후 데이터베이스 스키마 변경을 피할 수 있습니다.

동일한 접선에서 일부 외부 시스템에서 데이터를 제공하고 다시 사용하여 영구적 인 형식을 제공 할 수없는 경우, 그렇게합니다.

이로 인해이 정보를 쿼리하기가 어렵지 않습니까?

SQL Server는 XML 필드 및 변수를 쿼리 할 수 ​​있습니다. 반드시 어렵지는 않지만 더 많은 작업이 필요합니다. 그러나 가능합니다.


데이터베이스 스키마에서 데이터를 분리하려면 +1입니다. 또한 XPath 쿼리를 명시 적으로 언급 할 수 있습니다.
Gary Rowe

방금하신 것 같아요 :)

5

내 경험상 XML 데이터는 일반적으로 저장 및 쿼리가 거의 없지만 필요할 때 종종 추출됩니다. 일반적으로 다른 시스템에 관계형 데이터에서 즉시 생성하기 어렵거나 불가능한 일부 데이터의 XML 표현이 필요한 경우. XML 데이터는 다른 프로세스에 의해 미리 채워질 수 있습니다.


3

BLOB의 바이너리 스트림에 데이터를 저장하는 것을 상상할 수 있다면 데이터를 XML 형식으로 Blob에 저장하는 것을 상상할 수 있습니다.

물론 많은 사람들이 상상가의 상상력에 가장 잘 남아 있습니다.

예를 들어 전자 의료 기록은 다음과 같습니다.

ASCII HL7 V2.x를 데이터베이스의 필드에 저장했을 가능성이 큽니다. 아마도 HL7 V3.0을 데이터베이스의 필드에 저장하는 것이 좋습니다.

따라서 이점은 편의성입니다.


2

나는 현재 이것을하는 프로젝트를 진행하고 있습니다. 관계형으로 저장된 여러 번 처리해야하는 데이터가 있습니다. 그러나 처리는 Java로 수행되며 XML로 작업하기가 더 쉽습니다. 따라서 관계형 데이터를 한 번만 통과하여 테이블에 XML로 저장합니다. 그런 다음 매번 데이터를 검색하지 않고 하나의 비조 인 쿼리로 해당 데이터를 Java로 처리하고 동일한 데이터를 계속해서 마음의 내용으로 처리 할 수 ​​있습니다. 훨씬 간단하고 효율적입니다.


2

XML을 저장하는 좋은 예는 데이터베이스에서 UI 상태를 유지하려는 경우입니다. 모든 애플리케이션 뷰의 상태는 직렬화되어 데이터베이스에 저장되므로 XML을 쿼리 할 필요가 없습니다. UI 상태는 정렬 순서, 창 크기 등을 의미합니다.


1

종종 XML과 관계형이 혼합 된 데이터를 얻습니다. (이것의 좋은 예는 각 문서에 제목, 작성 날짜, 소유자 등과 같은 메타 데이터 필드가있을 수있는 문서 저장소입니다.)

이 시점에서 세 가지 옵션 중에서 선택해야합니다.

  1. 관계형 DB에 모든 것을 저장하십시오.
  2. 네이티브 XML DB에 모든 것을 저장하십시오.
  3. 기본 XML의 XML과 관계형 메타 데이터의 두 가지 개별 DB에 데이터를 저장합니다.

옵션 3은 아마도 가장 깨끗하지만 가장 비싸고 구현하기가 어려우며, 그리 크지 않은 시스템에서 분산 트랜잭션을 반드시 원하지는 않습니다. 네이티브 XML 데이터베이스는 일반적으로 관계형 데이터 (검색에 사용할 가능성이 높음)를 처리하는 데 매우 열악하고 기술이 전체적으로 관계형 DB보다 덜 성숙하기 때문에 옵션 2는 그리 좋지 않습니다.

따라서 옵션 1을 사용하는 것이 가장 좋은 해결책은 아니지만 가장 나쁜 해결책은 아닙니다.


1

내 경험에 따르면 데이터베이스에서 XML을 사용하면 데이터 소스가 데이터를 저장하는 방식이거나 기존 데이터베이스에 추가하여 지원하기 위해 많은 데이터베이스 프로그래밍이 필요하지 않은 방식으로 기능을 확장하기 때문에 .

새 데이터를 자주 검색하려는 경우 XML을 대신 구성 요소 부분으로 분할하는 것이 좋습니다. 그렇지 않은 경우 자주 변경되지 않은 데이터를 저장하는 유용한 방법이 될 수 있습니다.

이것이 도움이되기를 바랍니다, Jeff


1

요즘에는 문서 지향 데이터 저장소 (일명 NoSql)가 많이 사용됩니다.

http://en.wikipedia.org/wiki/Document-oriented_database

관계형 데이터베이스에서 문서 지향 체계를 사용할 수없는 이유는 없습니다. Mongo와 같은 이점을 모두 얻을 수는 없지만 단점도 없습니다.

문서 지향 스토리지를 사용하려는 경우 오랫동안 XML과 같은 구조화 된 데이터를 큰 열에 넣는 것이 유일한 선택이었습니다. 관계형 데이터베이스는이를 지원하기 위해 인덱싱 및 일치와 같은 기능을 추가했습니다.

Mongo와는 대조적으로 데이터베이스의 유일한 것은 문서입니다. 그러나 그것은 또 다른 주제입니다.

편집 : 문서 지향의 핵심 아이디어는 데이터를 꺼내서 조작하고 전체적으로 되돌려 놓는 것입니다. 때로는 문서를 클라이언트로 전송할 때와 같이 전체 항목을 한 방울 씩 보내서 처리하도록 할 수도 있습니다. 이점 (및 단점)은 유연성입니다. 문서의 유효성 검증 및 정확성은 데이터베이스 외부 에서 수행 됩니다.

편집 편집 : 또 다른 대비. JPG 이미지 또는 Word 문서를 데이터베이스 열에 저장한다고 상상해보십시오.


0

튜플 목록 (데이터베이스 테이블)에 트리 (XML)를 저장하면 어떤 이점이 있습니까?

XPath 또는 SPARQL과 같은 XML을 DBMS에서 쿼리 할 수없는 이유는 없습니다.

내가 알다시피, 그들은 단순히 두 개의 다른 데이터 구조입니다. 그리고 그들이 서로 포함되어서는 안될 이유가 없습니다.

PostgreSQL에 JSON 데이터 유형이 추가 된 이유를 찾을 수 있습니다. 나는 같은 주장들 중 다수가 적용된다고 생각한다. XML / XSD의 경우를 제외하고 훨씬 더 많은 검증이 가능합니다.


-1

XML (또는 JSON)은 메타 데이터를 계층 구조로 저장하는 데 매우 좋습니다. 대안은 무엇입니까? refid / key / value / depth를 가진 메타 데이터 테이블은 아마도? 약간 성가신 일이지만 (필요한 경우 쿼리하는 것이 좋습니다). 문서 (문서 테이블의 행)에 대한 일부 XML 데이터를 저장하는 것은 외부 테이블에 의존하거나 정보의 "유형"당 1 개의 열을 추가하지 않고도 일부 계층 정보를 저장하려는 경우 매우 편리합니다.


1
이것은 이전 11 답변에 이미 게시 된 것보다 실질적인 것을 추가하지 않는 것 같습니다
gnat

-2

정보를 파싱하려는 노력을 기울일 필요가있는 비효율적 태그로 효율적인 스토리지를 막을 때 나쁜 습관이라고 말하고 싶습니다. 각 행의 각 열에 대해 하나의 태그가 필요하므로 XML은 설명하는 데이터와 비교하여 끔찍한 스토리지 오버 헤드를 갖습니다. 이에 비해 관계형 형식으로 구문 분석되고 저장된 데이터에는 열 이름이 ONCE로 저장됩니다. dev에 열 줄이 있습니다. 상자, 큰 문제이지만 개발자가 이것이 수백만 행으로 확장 가능하다고 가정하는 것을 보았습니다. 이는 수십 GB의 데이터에 대해 100 GB의 오버 헤드를 나타낼 수있어 운영상의 문제가 발생합니다. 당신은 기본적으로 당신 자신의 책임을 포기하고 당신이 작성한 쓰레기를 지원해야하는 사람들을 강요합니다.

그렇다면 운영 데이터와는 별도로 자체 데이터베이스에 저장하지 않겠습니까? 아니면 의도 한대로-플랫 파일에서? 아마도 다시는 보지 않을 것이므로 운영 체제의 성능에 영향을 미치지 않는 이유는 무엇입니까? XML은 시스템 간의 스토리지 프로토콜 차이로 인해 명확하지 않은 데이터 스키마에 대한 설명 만 제공한다는 점을 기억하십시오. 그것은 전체 요점입니다. 그것에 대해 영리한 것은 없습니다. 주어진 양의 데이터에 대해 10 배의 오버 헤드를 저장한다는 것은 당신이 생각하지 못하고 소비하는 데이터를 현명하고 효율적이며 빠른 쿼리 형식으로 처리 할 수없는 거친 개발자라고 말합니다. 운영 지원에 대한 노력을 멈추고 데이터를 더 잘 처리 할 수있는 방법에 대해 생각하십시오. 그것은 내 전화가 될 것이라고 받았습니다. 데이터를 수신 한 후에는 목적에 따라 데이터를 XML로 저장하는 데 대한 방어책이 없습니다.


1
그러나 여기서 XML 조각의 데이터는 관계형 데이터라고 가정합니다. XML은 계층 적 데이터에 매우 유용하며 관계형 DB에서는 표현하기가 매우 어려울 수 있습니다. 관용적 인 XML 문서 (예 : 속성을 잘 사용하는 것)도 공간 오버 헤드가 거의 없을 것입니다. 주된 문제는 각 액세스에서 조각을 파싱하는 비용입니다.
amon

데이터를 빠른 쿼리 형식으로 처리하지 못할 수도 있습니다 (또는 쿼리하지 않아도 됨). 소수의 필드가 한 번에 채워지는 수백 개의 선택적 필드가있는 XML 스키마를 상상해보십시오. 이 관계형 모델링을 고집하면 NULL로 채워진 방대한 테이블이나 EAV 인 괴물로 끝날 것입니다.
Julia Hayward
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.