IT

비 관계형 데이터베이스 디자인

lottoking 2020. 7. 26. 11:54
반응형

비 관계형 데이터베이스 디자인 [닫기]


관계형아닌 "nosql"데이터베이스 와 함께 사용했던 디자인 전략 , 즉 기존 관계형 디자인이나 SQL (예 : Hypertable, CouchDB, SimpleDB, Google App Engine 데이터 저장소, Voldemort, Cassandra, SQL 데이터 서비스 등). 또한 종종 "키 / 값 저장소"라고도하며 기본적으로 거대한 분산 영구 해시 테이블처럼 작동합니다.

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

  • 비 관계형 세계에서 훨씬 더 잘 작동하는 대체 디자인을 생각해 보십니까?

  • 불가능 해 보이는 것에 대해 머리를 쳤습니까?

  • 디자인 패턴과의 격차를 해소 한 적이 있습니까?

  • UML에서와 같이 명시 적 데이터 모델을 사용하거나 반 구조적 / 문서 지향적 데이터 블롭을 위해 완전히 척척을 수행 했습니까?

  • 관계 조건, 임의 복잡한 트랜잭션 지원, 트리거 신호 같이 RDBMS가 제공하는 주요 추가 서비스를 놓치 고등학교?

나는 SQL 관계형 DB 배경에서 왔고 정규화가 내 피 속에 있습니다. 즉, 단순성 및 확장 성을 위해 비 관계형 데이터베이스의 이점을 디자인하고, 내 직감은 기능이 훨씬 더 많이 쌓입니다. 무슨 짓을 한거야?

참고로 야구 주제에 대한 StackOverflow 토론이 있습니다.


DBMS는 데이터 모델과 관련하여 많은 차이가 있으므로 개념적 데이터 디자인도 크게 관계를 생각합니다. NOSQL Google 그룹비 관계형 데이터베이스있는 단일 데이터 디자인에서 다른 패러다임은 다음과 분류됩니다.

  1. 대단한 시스템 (HBase, Hypertable 등)
  2. 주요 가치 상점 (도쿄, 볼드 모트 등)
  3. 문서 데이터베이스 (CouchDB, MongoDB 등)
  4. 그래프 데이터베이스 (AllegroGraph, Neo4j, Sesame 등)

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

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

graphdb 특정 질문에 대답하기 :

대체 설계 : 걱정할 필요없이 또는 여러 가지 여러 가지 관계가 있습니다.

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

명시 적 데이터 모델 :이 작업을 항상 수행하고 (화이트 보드 스타일) DB에서와 만나 모델을 사용합니다.

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


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

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

비 관계형 세계에서 훨씬 더 잘 작동하는 대체 디자인을 생각해 보십니까?

모든 뷰 이동 : DB 테이블에 해당하는 문서 모델의 디자인은 거의 관련이 없지만 (쿼리에 해당)에 달려 있습니다.

문서 DB 종류는 대체합니다. SQL에는 유연한 데이터와 유연한 쿼리가 있고 문서 DB는 다른 방법입니다.

CouchDB 모델은 "JSON 문서"(기본적으로 중첩 된 해시 테이블)의 모음입니다. 각 문서는 고유 한 ID를 사용하여 간단하게 검색 할 수 있습니다. 다른 쿼리의 경우 맵 / 축소 함수 세트로 명명 된 "보기"를 작성합니다. 뷰는 결과 세트를 키 / 값 쌍의 목록으로 리턴합니다.

트릭은 SQL 데이터베이스를 쿼리한다는 의미에서 데이터베이스를 쿼리하지 않는 것입니다. 뷰 함수 실행 결과는 고급에 저장 수준 만 쿼리 할 수 ​​있습니다. ( "모든 항목 가져 오기 오기", "키 가져 오기 오기"또는 "키 범위 가져 오기")

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

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

  • 조인에 해당하는 물품 보관 관련 데이터를 동일한 문서에 함께 보관하십시오.
  • 모든 문서 업데이트가 재색 인화를 신속하게 문서를 너무 크게 업데이트하여 너무 자주 업데이트하지 않습니다 (예 : 한 해 동안 모든 회사 매출을 동일한 문서에 넣는 것과 같이).

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

내가 대체 설계는 CouchDB를 사용하여 SQL 데이터베이스보다 작업 순서가 스토리지 수준이 아닌 시스템 수준에 수준에 있다는 것을 알았습니다. 일부 데이터가 있고 웹 페이지에 제공하려는 경우 전체 시스템의 제도이 최소 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와 같은) 문서 데이터베이스가 신의 선물입니다.


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

더 세게 :

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

더 쉬움 :

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

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

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


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

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

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


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

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

참고 URL : https://stackoverflow.com/questions/1189911/non-relational-database-design

반응형