문제

MySQL 데이터베이스 (개발 중)를 통한 웹 응용 프로그램이 있습니다. 응용 프로그램을 Google App Engine으로 마이그레이션하는 것을 고려하고 있으며 간단한 관계형 데이터베이스 모델을 비 관계형 접근 방식으로 어떻게 전환 할 수 있는지 더 잘 이해하고 싶습니다.

저는 오랜 시간 관계 데이터베이스 사람이며 BigTable과 같은 열 기반 DBS에 대한 경험이 없습니다. Google이 관계형 데이터베이스의 소규모 배포를 지원하는 경우, 내 질문이 일반적이고 Google에만 국한되지 않는다고 말하고 싶습니다. 간단한 관계형 모델이 비 관계형 DBS로 어떻게 표현 될 수 있는지 이해하고 싶습니다.

내 데이터베이스 (단순화)는 다음과 같습니다.

Items Table
------------

ItemID  ItemName  ItemPriority
1       "Car"     7
2       "Table"   2
3       "Desk"    7

ItemProperties Table
---------------------

ItemID  Property        Importance 
1       "Blue"          1
1       "Four Wheels"   2
1       "Sedan"         0
2       "Rectangular"   1
2       "One Leg"       1

나는 각각 이름과 ID가있는 많은 항목이 있습니다. 각 항목에는 여러 속성이 있으며 각 속성에는 여러 매개 변수가 있습니다 (각 속성의 이름과 "중요성"만 언급했지만 더 많은 것이 있습니다). 나는 수천만 개의 품목을 가지고 있으며 각각 수백 개의 속성이 있습니다.

사용 시나리오 : ItemName을 입력으로 받고 항목 테이블에서 ID를 찾아 모든 속성을 해당 ID로 가져옵니다. 그런 다음 속성 목록 (메모리)에 대한 분석을 수행하고 결과를 반환합니다.

작업의 90%는 매개 변수를 기반으로 한 조회입니다.

권장 접근법은 무엇입니까?

도움이 되었습니까?

해결책

비 관계형 DB와 함께 일한 사람으로부터 두 테이블이 비 임대 DB로 번역하기가 정말 쉽습니다.

두 테이블을 가져 와서 단일 객체로 바꿉니다.

항목 : - id- 이름 - 속성 -Prop1 -Prop2

모든 것을 데이터 스토어 열 (big-table), 문서 (couchDB) 또는 그 밖에 사용하는 모든 것을 저장하십시오.

ID, 이름 또는 속성으로 항목을 찾을 수 있습니다. 비 관계형 DBS의 더 큰 통증 중 하나 인 결합은 없습니다. 당신이 의미하는 바를 이해하지 못한다면 매개 변수 조회는 실제로 고통스러운 점이 아닙니다. 여러 번 조회해야 할 수도 있지만 대부분의 경우 문제가되지 않으며 RDBMS보다 더 잘 확장됩니다.

귀하의 예에서는 실제로 비 관계형 모델을 더 간단하고 구현하고 이해하기 쉽다고 생각합니다.

각 비 관계형 데이터 저장소에는 다른 규칙과 제약이 있지만 일반적인 의미에서 지침을 제공하는 것은 어렵습니다. CouchDB는 예를 들어 뷰와 함께 객체의 모든 부분에 인덱스를 생성 할 수 있습니다. BigTable을 사용하면 빠른 인덱스 조회를 얻으려면 탈피 된 데이터의 여러 사본을 저장해야 할 수도 있습니다. 다른 사람들은 데이터를 저장하는 방법을 결정할 때 고려해야 할 사항이 있습니다. SQL의 세계를 떠나면 많은 차별화가 있습니다.

다른 팁

GQL은 조인을 지원하지 않습니다. 두 가지 방법 으로이 문제를 해결할 수 있습니다.

  • 직접 가입하십시오

항목을 가져오고 ItemId를 확인하고 해당 itemID로 ItemProperties에 대한 쿼리를 확인하십시오. 당신의 테이블은 당신이 지정한 것처럼 보일 것입니다. 물론 이것은 두 쿼리이지만 두 쿼리는 간단합니다.

  • Expando 모델을 사용하십시오

Expando 모델에서는 런타임에 새 필드를 만들 수 있습니다. 그것들은 색인화되지 않기 때문에 검색하고 싶다면 느리게 될 수 있지만 단순히 가져 오는 것은 괜찮습니다. ListProperty와 같은 복잡한 유형도 사용할 수 있습니다. 이런 종류의 유연성을 통해 ItemProperties 테이블의 모든 것을 항목 테이블에 넣고 쿼리를 저장하는 방법을 생각할 수 있습니다. 창의적입니다.

매우 유사한 데이터베이스 구조 ( "레코드"및 "레코드 엔트리"테이블은 귀하의 "항목"및 "ItemProperties"를 미러링)를 가지고 있으며 비 관계형 데이터베이스와 유사한 마이그레이션을 고려하고 있습니다. 우리는 아마도 Google이 아닌 CouchDB 또는 MemcachedB 또는 그와 비슷한 것을 방문 할 것입니다.

당신처럼 나는 비 관계형 데이터베이스를 사용한 경험이 없습니다 (내 개발자도 마찬가지입니다). 그러나 우리는 몇 가지 아이디어를 던졌습니다. 현재의 생각은 (스키마 사용)입니다.

  • 첫째 : 각 항목과 항목 속성을 필드 (본질적으로 XML 문서)가있는 하나의 객체로 붕괴시키고 식별자가 키워진 데이터베이스에 넣습니다. 항목을 검색 할 때마다 모든 ItemProperties도 되돌아갑니다.

우리가 가진 차이점은 데이터베이스 외부 (SOLR) 외부에 컨텐츠를 색인하므로 "이름"속성이므로 ymmv를 사용하여 데이터베이스 자체에서 조회를 할 필요가 없다는 것입니다.

  • 둘째 : 위의 모델에서 지원할 수없는 모든 "관계형"운영에서 목록을 작성하고 있습니다. 여기에는 아이템 테이블의 특수 필드를 기반으로 항목을 쿼리하는 몇 가지 "그룹화"작업과 최근에 수정 된 모든 항목 (이전에 날짜 열에서 쿼리에 의해 달성 된 모든 항목을 감지하려는 쿼리가 포함됩니다. 항목 테이블). 우리는 이러한 각 사례에 대한 대체 구현을 발명하고 있습니다 (운 좋게도 몇 가지만 있습니다).

이것이 너무 어려워지면 다른 모델로 동일한 운동을 시도 할 것입니다. 운 좋게도 우리는 계획 할 시간이 있습니다.

우리의 핵심 요점 중 하나는 우리가 Solr로 외부 인덱싱을 수행하므로 (예를 들어) itemproperties 값의 값에 대한 데이터베이스 조회를 수행하거나 항목 테이블에서 이름으로 조회를 수행 할 필요가 없다는 것입니다.

어쨌든, 그것은 아마도 큰 도움이되지는 않지만, 경험이 많은 사람들이 어떤 종류의 솔루션을 생각해 낼 수 있는지보고 싶어합니다.

추신 : 귀하의 속성 테이블에는 수십억 행이 있어야합니다. MySQL 서버를 정확히 얼마나 정확히, 어떤 하드웨어를 실행하고 있습니까? MySQL에 아직 확장 성 문제가 있습니까?

당신은 그것을 모두 평평하게해야합니다. Appengine은 다음과 같은 구조물을 허용한다고 생각합니다.

id = 1, itemname = car, itempriority = 7, property = (blue, 1), property = (4 휠, 2), property = (세단, 0) id = 2, itemname = table, itempriority = 2, property = (직사각형, 1), Property = (한쪽 다리, 1) ID = 3, ItemName = Desk, ItemPriority = 7

동일한 "필드"는 여러 값을 가질 수 있으며 여러 항목을 사용할 수 있습니다.

샘플 데이터는 한 테이블에서 3 행입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top