2009-06-30 3 views
4

많은 DB 쓰기가 필요한 Erlang 응용 프로그램을 개발 중입니다. 내 스키마에는 기본 키 외에도 고유 한 제약 조건이 적용된 다른 특성이 있습니다.Mnesia의 고유 제한

ID, unique_constraint_field 및 일부 다른 입력란이 있습니다. 고유 ID에 해당하는 DB의 행을 업데이트해야합니다. 다른 행에 이미 업데이트 할 unique_constraint_field 값이 있어야합니다.

많은 수의 업데이트로 인해 (각 업데이트는 1 행에만 영향을 미침) 수행해야합니다 (대기 시간이 너무 짧음). 대신 기본 키와 해당 속성의 고유 제한 조건을 사용하여 복제를 잡습니다. 하위 쿼리를 사용하는 업데이트 문의 이를 통해 단일 쿼리 (95 %의 시간에 발생)에서 업데이트를 수행 할 수 있으며 나머지 5 %에서는 기본 키 또는 고유 한 특성 위반에 대해 필요한 조치를 취하기 위해 예외를 catch 할 수 있습니다.

현재 ODBC mysql 드라이버를 사용하고 있습니다. 그러나 드라이버가 모든 오류에 대한 매우 일반적인 오류 메시지를 반환합니다. 어떤 오류가 중요한 위반이라고 가정 할 때 현재 프로토 타입이 잘 작동하고 있지만이 모델에는 분명히 결함이 있습니다. 나는 erlang에서 mysql에 연결할 다른 괜찮은 드라이버/방법을 찾을 수 없다.

Erlang과 Mnesia가 완벽하게 융합하여 Mnesia (내 속도 요구 사항에 대해 메모리 전용 모드)로 전환 할 생각입니다. 그러나 Mnesia에는 단일 쿼리에서 DB 업데이트를 수행하는 데 사용할 수있는 고유 한 키 제약 조건이 없다는 것을 알았습니다.

얼랭 (Erlang) 내에서이 요구 사항을 가장 잘 구현하는 방법에 대한 제안이 필요합니다. Mnesia에서 조건부 업데이트를 수행 할 방법이 있습니까? 아니면 내가보아야 할 다른 고속 DB 대안이 있습니까? 어떤 도움이나 통찰력이라도 대단히 감사합니다.

답변

1

나는 무엇이 최선의 해결책인지 모르겠다. 그러나 내가 시도하고자하는 것은 unique_constraint_field과 함께 두 개의 테이블을 하나의 레코드로 만들고 하나는 인덱스로 만들고, 각각의 CUD는 CRUD 연산의 트랜잭션을 점검하고 업데이트하는 것이다. 이유는 횡격 장구에서 색인 유형을 설정할 수 없으며 항상 중복 가방입니다. 어쨌든 색인이 고유 할 것이기 때문에 추가적인 성능 저하를 초래해서는 안됩니다. mnesia index 기능을 사용하면 자신의 CUD 연산을 작성해야하며 결과는 두 개의 테이블을 사용하는 것과 거의 같습니다. 다행스럽게도 mnesia는 최소한의 개발자 노력으로 중첩 된 트랜잭션을 처리하므로이 작업은 기존의 RDBMS에 비해 상대적으로 쉽습니다.

1

Ulf Wiger는 mnesia를 관계형 데이터베이스로 사용할 수있는 라이브러리를 출시했습니다. 그것은 'rdbms'라고 불리우며, 몇 년 전의 것으로, 오랜 기간 업데이트되지는 않았지만, 그대로 사용하거나, 최소한 자신의 작업을 기반으로 처리 할 수 ​​있습니다. 원하는 경우 Grab the source. 그것의

그의 설명 :

나는 'RDBMS'의 contrib이 화합물의 특성 및 사용자 정의 인덱싱에 대한 지원을 제공 포함하여, 이것에 대한 해결책 을 제공 나의 표준 응답을 털어 의 옵션은 인덱스 값이 고유해야 함을 지정합니다.

Rdbms/have/been used, 일반적으로 상업용으로는 에 대해 아직 고려하지 않았습니다.나는 을 아무 것도하지 않았기 때문에 어떤 사용자라도인지하지 못하기 때문에 압력을 받고 있지만, 변경을 원하는 사람은 물론 에게 연락하고 그들의 주장을 환영합니다.

'독특한'제약 조건을 mentionning 기타 문서 가 here을 찾을 수 있습니다 -

http://ulf.wiger.net/rdbms/doc/rdbms.html (위 참조. 워드 프로세서 많은, 내가 아는 원하는 수 둡니다). 실적이 좋을 가능성이 있습니다. 기억 상실증은 키 - 값 저장소가 될 수 있습니다. 나는 정확하게 기억할 수는 없지만 '유일한'색인을 정의하는 것은 그것들을 검사 할 때 전체 테이블 순회를 포함 할 수 있습니다.

모두 오래되었으므로 실행하는 데 문제가있을 것입니다. trapexit thread about it을 참조하십시오. 어떻게 그것이 완료되었는지 연구하는 것은 더 좋은 생각 일 수 있습니다.

2

mnesiacrashtune it을 제외하고 많은 양의 쓰기가 있습니다. 그러나 {ID, UniqueConstraint}과 같은 복잡한 기본 키를 사용하면 업데이트를 훨씬 간단하게 만들 수 있습니다. 또한 대용량 쓰기를 처리하기 위해 특별히 작성된 ordered_set 디스크의 디스크 용 osmos에 대한 새로운 erlang 라이브러리가 있습니다.

+0

감사합니다. 재미있을 것 같습니다. 한번보세요. – jeffreyveon