비 관계형 데이터베이스 설계 [닫기]


114

비 관계형 "nosql"데이터베이스에서 사용했던 디자인 전략에 대해 듣고 싶습니다. 즉, 기존의 관계형 디자인이나 SQL (예 : Hypertable, CouchDB)을 사용하지 않는 (대부분 새로운) 데이터 저장소 클래스입니다. SimpleDB, Google App Engine 데이터 저장소, Voldemort, Cassandra, SQL 데이터 서비스 등). 또한 "키 / 값 저장소"라고도하며 기본적으로 거대한 분산 영구 해시 테이블처럼 작동합니다.

특히, 이러한 새로운 데이터베이스와 개념 데이터 디자인 의 차이점에 대해 배우고 싶습니다 . 더 쉬운 것, 더 어려운 것, 전혀 할 수없는 것은 무엇입니까?

  • 비 관계형 세계에서 훨씬 더 잘 작동하는 대체 설계를 생각해 보셨습니까?

  • 불가능 해 보이는 것에 머리를 부딪힌 적이 있습니까?

  • 예를 들어 하나에서 다른 것으로 변환하기 위해 디자인 패턴과의 격차를 해소 했습니까?

  • 지금은 명시 적 데이터 모델을 전혀 수행하고 있습니까 (예 : UML에서) 아니면 반 구조적 / 문서 지향 데이터 블롭을 위해 완전히 척결 했습니까?

  • 관계형 무결성, 임의의 복잡한 트랜잭션 지원, 트리거 등과 같이 RDBMS가 제공하는 주요 추가 서비스를 놓치고 있습니까?

저는 SQL 관계형 DB 배경 출신이므로 정규화가 제 피 속에 있습니다. 즉, 단순성과 확장 성을 위해 비 관계형 데이터베이스의 이점을 얻었고, 내 직감은 설계 기능이 더 많이 겹치도록해야한다고 말합니다. 무슨 짓을 한거야?

참고로 여기에 유사한 주제에 대한 StackOverflow 토론이 있습니다.


2
키 / 값 데이터베이스는 오래된 새로운 것입니다.
Christopher

1
관심이 많은 사람을 위해 NoSQL Google 그룹에서 진행되는 긴 형식의 토론이 있습니다. groups.google.com/group/nosql-discussion/browse_thread/thread/…
Ian Varley

4
참고로이 주제에 대한 긴 형식의 보고서를 여기에 작성했습니다. google.com/url?sa=D&q=http://ianvarley.com/UT/MR/… 도움을 주신 모든 분들께 감사드립니다!
Ian Varley

답변:


55

비 관계형 DBMS는 데이터 모델과 관련하여 많이 다르므로 개념적 데이터 디자인도 많이 다를 것임을 고려해야합니다. NOSQL Google 그룹비 관계형 데이터베이스 에있는 데이터 디자인 스레드 에서 다른 패러다임은 다음과 같이 분류됩니다.

  1. Bigtable과 유사한 시스템 (HBase, Hypertable 등)
  2. 키-값 저장소 (Tokyo, Voldemort 등)
  3. 문서 데이터베이스 (CouchDB, MongoDB 등)
  4. 그래프 데이터베이스 (AllegroGraph, Neo4j, Sesame 등)

저는 주로 그래프 데이터베이스를 사용하고 있으며이 패러다임을 사용하는 데이터 디자인의 우아함이 RDBMS 의 단점에 지쳐 저를 데려 왔습니다 . 이 위키 페이지 에 그래프 데이터베이스를 사용하여 데이터 디자인의 몇 가지 예를 넣었 으며 기본 IMDB 영화 / 배우 / 역할 데이터 를 모델링 하는 방법에 대한 예도 있습니다.

프리젠 테이션 슬라이드 (slideshare) 그래프 데이터베이스 및 대규모 지식 경영의 미래 에 의해 마르코 로드리게스 뿐만 아니라 그래프 데이터베이스를 사용하여 데이터 설계에 아주 좋은 소개가 포함되어 있습니다.

graphdb 관점에서 특정 질문에 답하기 :

대체 설계 : 연결할 수있는 엔티티를 사전 정의 할 필요 나 걱정없이 다양한 유형의 엔티티간에 관계를 추가합니다.

격차 해소 : "테이블 지향 그래프"등을 원하지 않기 때문에 도메인 자체에 따라 모든 경우에 대해 다르게하는 경향이 있습니다. 그러나 여기 RDBMS에서 graphdb에 자동 번역에 대한 몇 가지 정보.

명시 적 데이터 모델 : 항상이 작업을 수행하고 (화이트 보드 스타일) DB에있는 그대로 모델을 사용합니다.

Miss from RDBMS world : 손쉬운 보고서 작성 방법. 업데이트 : 어쩌면 아니다 것을 그래프 데이터베이스에서 만들 하드 보고서, 참조 Neo4J 샘플 데이터베이스에 대한 보고서를 작성 .


79

저는 비 관계형 DB로 시작했을 뿐이고 여전히이 DB에 머리를 감고 최상의 모델이 무엇인지 알아 내려고 노력하고 있습니다. 그리고 저는 CouchDB에 대해서만 말할 수 있습니다.

그래도 몇 가지 예비 결론이 있습니다.

비 관계형 세계에서 훨씬 더 잘 작동하는 대체 설계를 생각해 보셨습니까?

디자인 초점이 바뀝니다. 문서 모델 (DB 테이블에 해당)의 디자인은 거의 관련이없는 반면 모든 것이 뷰 (쿼리에 해당) 디자인에 달려 있습니다.

문서 DB 종류는 복잡성을 바꿉니다. SQL에는 유연하지 않은 데이터와 유연한 쿼리가 있으며 문서 DB는 그 반대입니다.

CouchDB 모델은 "JSON 문서"(기본적으로 중첩 된 해시 테이블)의 모음입니다. 각 문서에는 고유 한 ID가 있으며 ID로 간단하게 검색 할 수 있습니다. 다른 쿼리의 경우 맵 / 축소 함수의 이름이 지정된 "뷰"를 작성합니다. 뷰는 키 / 값 쌍 목록으로 결과 집합을 반환합니다.

비결은 SQL 데이터베이스를 쿼리한다는 의미에서 데이터베이스를 쿼리하지 않는다는 것입니다. 뷰 함수를 실행 한 결과는 인덱스에 저장되며 인덱스 만 쿼리 할 수 ​​있습니다. ( "모두 가져 오기", "키 가져 오기"또는 "키 범위 가져 오기")

SQL 세계에서 가장 가까운 비유는 저장 프로 시저를 사용하여 DB 만 쿼리 할 수있는 경우입니다. 지원하려는 모든 쿼리는 미리 정의되어야합니다.

문서의 디자인은 매우 유연합니다. 두 가지 제약 만 찾았습니다.

  • 조인에 해당하는 것이 없으므로 관련 데이터를 동일한 문서에 함께 보관하십시오.
  • 모든 문서 업데이트가 재 인덱싱을 트리거하므로 문서를 너무 크게 만들어 너무 자주 업데이트하지 마십시오 (예 : 해당 연도의 모든 회사 판매를 동일한 문서에 넣음).

그러나 모든 것은 뷰 디자인에 달려 있습니다.

내가 발견 한 대체 설계는 어떤 SQL 데이터베이스보다 CouchDB에서 더 나은 작업 순서가 스토리지 수준이 아닌 시스템 수준에 있다는 것을 발견했습니다. 일부 데이터가 있고 웹 페이지에 제공하려는 경우 전체 시스템의 복잡성이 최소 50 % 감소합니다.

  • DB 테이블 설계 없음 (사소한 문제)
  • ODBC / JDBC 중간 계층 없음, http를 통한 모든 쿼리 및 트랜잭션 (중간 문제)
  • JSON의 간단한 DB-to-object 매핑은 SQL에서 동일한 것에 비해 거의 사소합니다 (중요!)
  • AJAX를 사용하여 브라우저에서 직접 검색 할 문서를 디자인하고 HTML로 표시되기 전에 약간의 JavaScript 폴리싱을 추가 할 수 있으므로 전체 애플리케이션 서버를 건너 뛸 수 있습니다. (거대한!!)

일반 웹앱의 경우 문서 / JSON 기반 DB는 큰 승리이며, 유연성이 떨어지는 쿼리와 데이터 유효성 검사를위한 추가 코드의 단점은 비용이 적게 드는 것 같습니다.

불가능 해 보이는 것에 머리를 부딪힌 적이 있습니까?

아직. 데이터베이스 쿼리 수단으로서의 매핑 / 축소는 익숙하지 않으며 SQL을 작성하는 것보다 더 많은 생각이 필요합니다. 매우 적은 수의 프리미티브가 있으므로 필요한 결과를 얻는 것은 주로 키를 지정하는 방법을 창의적으로 만드는 문제입니다.

쿼리가 동시에 두 개 이상의 문서를 볼 수 없다는 제한이 있습니다. 조인이나 다른 종류의 다중 문서 관계는 없지만 지금까지 극복 할 수있는 것은 없습니다.

제한의 예로서 개수와 합계는 쉽지만 평균은 CouchDB보기 / 쿼리로 계산할 수 없습니다. 수정 : 합계와 개수를 별도로 반환하고 클라이언트에서 평균을 계산합니다.

예를 들어 하나에서 다른 것으로 변환하기 위해 디자인 패턴과의 격차를 해소 했습니까?

그게 가능한지 모르겠습니다. 기능적 스타일 프로그램을 객체 지향 스타일로 번역하는 것과 같은 완전한 재 설계에 가깝습니다. 일반적으로 각 문서에 SQL 테이블과 더 많은 데이터가있는 것보다 훨씬 적은 문서 유형이 있습니다.

이를 생각하는 한 가지 방법은 삽입 및 일반적인 쿼리에 대한 SQL을 보는 것입니다. 예를 들어 고객이 주문할 때 어떤 테이블과 열이 업데이트됩니까? 월별 판매 보고서에는 어떤 것이 있습니까? 해당 정보는 아마도 동일한 문서에 있어야합니다.

즉, 고객 ID 및 제품 ID가 포함 된 주문 문서 하나, 쿼리를 단순화하는 데 필요한 복제 된 필드가 있습니다. 문서 내의 모든 항목을 쉽게 쿼리 할 수 ​​있으며, 주문과 고객간에 상호 참조가 필요한 모든 작업은 클라이언트가 수행해야합니다. 따라서 지역별 판매 보고서를 원하면 주문에 지역 코드를 입력해야합니다.

지금은 명시 적 데이터 모델을 전혀 수행하고 있습니까 (예 : UML)?

죄송합니다. 문서 DB 전에 UML을 많이 한 적이 없습니다. :)

그러나 어떤 필드가 어떤 문서에 속하고 어떤 종류의 값이 포함되어 있는지 알려주는 일종의 모델이 필요합니다. 나중에 참조하고 DB를 사용하는 모든 사람이 규칙을 알고 있는지 확인하십시오. 예를 들어 텍스트 필드에 날짜를 저장하는 경우 더 이상 오류가 발생하지 않고 누구나 원하는 필드를 추가하거나 제거 할 수 있으므로 여유를 가져 오기 위해 유효성 검사 코드와 규칙이 모두 필요합니다. 특히 외부 리소스로 작업하는 경우.

RDBMS가 제공하는 주요 추가 서비스를 놓치고 있습니까?

아니. 하지만 제 배경은 웹 애플리케이션 개발자입니다. 우리는 데이터베이스를 다뤄야합니다. :)

제가 근무하던 회사에서 여러 벤더의 SQL 데이터베이스에서 실행되도록 설계된 제품 (웹앱)을 만들었는데 "추가 서비스"는 DB마다 너무 다르기 때문에 각 DB에 대해 별도로 구현해야했습니다. 따라서 RDBMS에서 기능을 이동하는 것은 우리에게 더 적은 작업이었습니다. 이것은 전체 텍스트 검색으로 확장되었습니다.

그래서 내가 포기하고있는 것은 처음에 내가 결코 가지지 못한 것입니다. 분명히 당신의 경험은 다를 수 있습니다.


주의 사항 : 지금 작업중인 것은 재무 데이터, 주식 시세 등을위한 웹 앱입니다. 이것은 문서 DB와 매우 잘 일치합니다. 제 관점에서 DB의 모든 이점 (지속성 및 쿼리)을 번거 로움없이 얻을 수 있습니다.

그러나 이러한 데이터는 서로 상당히 독립적이며 복잡한 관계형 쿼리가 없습니다. 시세별로 최신 시세를 확인하고 시세 및 날짜 범위별로 시세를 확인하고 회사 메타 정보를 확인하세요. 그게 전부입니다. 내가 본 또 다른 예는 블로그 애플리케이션이며 블로그는 엄청나게 복잡한 데이터베이스 스키마로 특징 지워지지 않습니다.

내가 아는 문서 DB의 모든 성공적인 응용 프로그램은 처음에 문서 (Google 검색에서와 같이), 블로그 게시물, 뉴스 기사, 재무 데이터와 같이 상호 연관성이없는 데이터를 사용했습니다. .

문서 모델보다 SQL에 더 잘 매핑되는 데이터 세트가있을 것으로 예상하므로 SQL이 살아남을 것이라고 생각합니다.

그러나 데이터를 저장하고 검색하는 간단한 방법을 원하는 사람들에게는 (CouchDB에서와 같이) 문서 데이터베이스가 신의 선물입니다.


9
굉장히 유용하다. 특히 "SQL에는 유연성이없는 데이터와 유연한 쿼리가 있으며 문서 DB는 반대입니다."와 조인이 없습니다.
j_random_hacker

2
+1, 이것은 매우 통찰력이있었습니다.
Mas

2
사실, 가능하면 한 번 이상 찬성했습니다.
Octavian A. Damiean 2012

이는 2014 년에도 여전히 매우 유용했습니다. 2010 년 이후로 배운 내용을 추가하거나 다른 곳에있을 수있는 정보에 링크 할 수 있다면 좋을 것입니다.
Maggie 2014

11

나는 내 마음의 뒤쪽에 CouchDB로 이것을 대답하고 있지만, 다른 DB에서도 대부분이 사실이라고 생각합니다. CouchDB를 사용해 보았지만 데이터 액세스가 사전에 알려지지 않았고 확장 성이 문제가되지 않았기 때문에 마침내 반대 결정을 내 렸습니다.

더 세게 :

  • 개념적 수준에서 재검토를 취하므로 단지 다르기 때문에 '더 어렵습니다'. 데이터 액세스 패턴을 미리 알아야하므로 자동 번역을 적용 할 수 없습니다. 최소한 액세스 패턴을 추가해야합니다.
  • 일관성은 데이터베이스에서 처리되지 않지만 응용 프로그램에서 처리되어야합니다. 보장이 적다는 것은 더 복잡한 애플리케이션을 사용하는 대신 더 쉬운 마이그레이션, 장애 복구 및 더 나은 확장 성을 의미합니다. 응용 프로그램은 충돌과 불일치를 처리해야합니다.
  • 교차 문서 (또는 키 / 값)를 응용 프로그램 수준에서 처리해야하는 링크입니다.
  • SQL 유형의 데이터베이스에는 훨씬 더 성숙한 IDE가 있습니다. 많은 지원 라이브러리를 얻을 수 있습니다 (하지만 이러한 라이브러리의 계층화로 인해 SQL에 필요한 것보다 훨씬 더 복잡해집니다).

더 쉬움 :

  • 데이터 액세스 패턴을 알고 있으면 더 빠릅니다.
  • 응용 프로그램 프로그래머로서의 약속이 없기 때문에 데이터베이스의 마이그레이션 / 페일 오버가 더 쉽습니다. 최종 일관성을 얻지 만. 아마. 드디어. 언젠가.
  • 하나의 키 / 값은 테이블의 한 행보다 이해하기 훨씬 쉽습니다. 모든 (나무) 관계가 이미 존재하며 완전한 객체를 인식 할 수 있습니다.

모델링은 거의 동일해야하지만 하나의 문서에 넣는 내용에주의해야합니다. UML은 이미 두 개의 다른 짐승 인 DB 모델링뿐만 아니라 OO 모델링에도 사용할 수 있습니다.

C # / Silverlight와 잘 통합 된 좋은 개방형 OO 데이터베이스를보고 싶었습니다. 선택을 더 어렵게 만들기 위해서입니다. :)


1

플랫 파일은 오랫동안 모든 크기의 데이터 세트에 대해 비현실적이고 비실용적 인 것으로 간주되었습니다. 그러나 더 많은 메모리를 가진 더 빠른 컴퓨터는 적어도 합리적으로 작은 n 및 로컬 단일 사용자 응용 프로그램의 경우 파일을 메모리에로드하고 실시간으로 정렬 할 수 있습니다.

예를 들어 일반적으로 10,000 개의 레코드 파일을 읽고 허용 가능한 응답 시간 인 0.5 초 이내에 필드에서 정렬 할 수 있습니다.

물론 관계형 작업, 데이터 무결성, 다중 사용자 기능, 원격 액세스, 더 큰 용량, 표준화 등 플랫 파일 대신 데이터베이스를 사용하는 이유가 있지만 컴퓨터 속도와 메모리 용량이 증가하여 메모리 내 조작이 이루어졌습니다. 어떤 경우에는 더 실용적인 데이터입니다.


1

내가 실생활에서 보는 관계형 데이터베이스는 당신의 주장과는 달리 전혀 정규화되지 않은 경향이 있습니다. 질문을 받으면 디자이너는 대부분 성능 때문이라고 말합니다. RDBM은 조인에 능숙하지 않으므로 정규화 관점에서 테이블이 너무 넓은 경향이 있습니다. 객체 지향 데이터베이스가 훨씬 더 나은 경향이 있습니다.

RDBM에 문제가있는 또 다른 지점은 히스토리 / 시간 종속 키를 처리하는 것입니다.


3
스테판-정규화 부서에는 실제 시스템이 부족한 경우가 많다는 말이 맞습니다. 그러나 RDBMses가 "결합에 좋지 않다"고 말하는 것은 정확하지 않습니다. 대부분의 상용 제품 (예 : Oracle, MS SQL Server 등)에는 매우 진보 된 쿼리 최적화 프로그램이 있으며 응용 프로그램 코드에서 동일한 작업을 수행 할 수있는 것보다 훨씬 빠르게 다양한 물리적 조인 알고리즘을 수행 할 수 있습니다. (MySQL은 내가 이해하는 것에 대한 예외입니다). 제 경험상, 조기 비정규 화는 다른 조기 최적화와 마찬가지로 종종 열악한 개발자의 신호입니다.
Ian Varley

2
이 생각을 계속합니다. 조인이 잘못되면 인덱싱 및 통계가 잘못되어 발생합니다. 옵티 마이저에 작업 할 것이 없거나 가지고있는 정보가 오래된 경우 잘못된 선택을합니다. 많은 사람들이 이것을 "조인 불량"으로 착각합니다. 현대 RDBMS 시스템은 자체 조정이있는 마스크 인덱스와 통계를 설정할 때 당신의 두뇌를 사용할 필요. 또한 사람들은 논리적 스키마 (다섯 번째 정규형)와 물리적 스키마 (자주 세 번째 정규화로 비정규 화됨)를 혼동합니다. 당신이 보는 DB 가 "넓다"라고해서 그것이 논리적으로 잘못 설계되었다는 의미는 아닙니다.
Godeke 2010-08-25
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.