ObjectDatabase++
ObjectDatabase++![]() | |
개발자 | 에키 소프트웨어 |
---|---|
안정적 해제 | 3.4 / 2012년 10월 1일[1] |
기록 위치 | C++, C#, VB.NET & TScript |
운영 체제 | 윈도 & 리눅스 |
유형 | 객체 데이터베이스 |
면허증 | 소유권[2] |
웹사이트 | www |
ObjectDatabase++(ODB)PP)는 최소한의 외부 정비가 필요한 서버 애플리케이션을 위해 설계된 임베디드 객체 지향 데이터베이스다.데이터베이스 무결성을 유지하면서 시스템 충돌 시 자동 복구 기능을 갖춘 실시간 ISAM 수준 데이터베이스로 C++로 작성됐다.그것의 고유한 트랜잭션 프로세스는 거래 롤백을 금지할 수 있는 인덱스 항목의 이중 할당을 방지하여 인덱스와 테이블을 모두 유지관리할 수 있다.
ODBPP의 특징으로는 완전한 다중 프로세스 및 다중 스레드 트랜잭션 제어, 자동 실시간 데이터베이스 복구, 계층적 객체 데이터 설계, 네이티브 코드 및 스크립트 액세스, 객체 ID의 정적 해시 인덱스, 전체 텍스트 및 생체 인식 패턴 일치를 비롯한 수많은 지원 인덱스 방법이 있다.
역사
- 초기 개발은 Ekky Software가 2001년부터 2003년까지 시행했다.
- 데이터베이스를 4번 완전히 다시 작성해야 테스트에서 규격과 일치하고 설계한 대로 작동하는지 검증했다.
- 지난 10년 동안 수많은 제품 개선으로 훨씬 더 많은 인덱스와 데이터 지원이 가능해졌다.
계층 데이터 개체
ODBPP는 XML, JSON 또는 직렬화된 PHP와 유사한 [3][4]설계의 계층적 객체를 지원한다.그것은 객체 데이터베이스와 그들의 관계형 사촌들을 구분하는 이 계층적 객체인데, 그것은 객체 데이터베이스와 관계형 모델과의 구별을 주는 여러 테이블에 그것을 퍼뜨리기 보다는 전체 객체를 하나의 기록으로 유지하는 과정이다.
전통적인 관계 설계
전통적으로 데이터베이스는 관계형 모델로 설계되어 왔다.이렇게 하면 여러 표에 걸쳐 데이터가 분리되고 공통 식별자를 사용하여 모든 자식 레코드를 부모에 다시 연결할 수 있다.이 모델은 개별 데이터 조각을 포함하는 표 내의 각 행에 기초하였다.이 설계에 기반한 SQL 데이터베이스는 전체 관계를 다시 하나로 연결하는 조인을 생성하여 성능 제한에 시달릴 수 있다.[5]
객체-데이터베이스 설계
객체 데이터베이스 설계에서는 데이터 객체를 저장하기 위해 여러 테이블을 사용하는 대신, 하나의 레코드에 저장된다.이것은 전체 물체를 그대로 유지하고 데이터를 다시 결합할 필요성을 줄인다.이 전체 객체를 하나의 테이블에 저장하는 과정은 필요한 잠금, 읽기 및 쓰기 작업의 총량을 감소시킨다.파일 읽기 및 쓰기 양을 줄이는 하나의 레코드에 객체를 저장하는 것도 이 기능으로, 객체 설계는 매우 크고 매우 복잡한 데이터베이스 설계로 효율성을 유지할 수 있다.
오른쪽의 영상을 보면 위의 내용은 관계 모델을 묘사하고 있으며, 부모가 호박색이고 아이들이 파란색으로 된 두 개의 테이블에 데이터가 퍼져 있다.개체 모델에서 부모 및 자식 모두 하나의 데이터 레코드에 저장되며, 이전에 관련 테이블 내에 저장되었던 정보는 이제 Foo의 하위 테이블이나 중첩 테이블 내에 저장된다.
다중공정거래관리
ODBPP는 다른 프로세스가 종료되는 동안 프로세스가 계속 진행될 수 있도록 하는 트랜잭션 제어를 구현한다.이 독특한 트랜잭션 제어는 종료된 트랜잭션을 식별하고, 데이터베이스 무결성을 복구하며, 중간 트랜잭션을 계속할 수 있도록 한다.이 방법을 사용하여 서버에 의한 실시간 트랜잭션 구현이 가능한 어떤 시점에서든 트랜잭션을 종료할 수 있는 능력이다.
트랜잭션 제어는 4개의 별도 파일을 사용하여 전체 프로세스를 구현하고 각 상태 변경을 드라이브로 플러시한 후 다음 상태로 계속 진행하십시오.이것은 각각의 개인이 파일에 쓰는 것이 세 개의 분리된 상태를 가지고 있고 전체 거래는 세 개의 분리된 파일을 통과하는데 필요한 시간 소모적인 과정을 만든다.처음에 모든 추가, 편집 및 삭제는 공유 메모리 파일로 작성되며, 이는 모든 트랜잭션이 인덱스 값과 같은 리소스가 할당되었는지 여부를 알 수 있게 한다.이 메모리 파일은 OS가 데이터베이스 무결성을 방해하지 않고 시작할 때 파괴될 수 있으며 IPC 목적으로만 사용된다.
일단 트랜잭션이 커밋 트랜잭션 방법을 호출하면, 데이터베이스는 작업의 대부분을 수행하고 메모리 파일의 전체 트랜잭션을 로그 파일에 기록한다.이 작업은 3단계 프로세스를 통해 수행되며, 먼저 필요한 변경 사항을 식별한 다음 해당 계획을 파일 뒤쪽으로 플러시하고 드라이브에 기록되면 헤더가 업데이트의 존재를 표시하도록 업데이트된다.두 번째, 파일을 업데이트한 후, 마지막으로 머리글을 수정하여 업데이트를 완료한다.이 상태 프로세스는 1단계에서 프로세스가 중단되면 파일이 단순하게 잘리고 파일이 원래 상태로 반환되며, 2단계에서 트랜잭션이 중단되면 다음 트랜잭션은 파일을 열고 저장된 계획을 식별하고 저장한 파일을 다시 실행하기 때문에 파일의 일관성을 항상 보장한다.d 지시사항
이러한 방식으로 네 개의 파일 각각이 업데이트되었다.트랜잭션은 로그 파일에 대한 하나의 업데이트에 기록되기 전에 메모리 파일에서 시작되며, 일단 거래가 로그 파일에 보안된 트랜잭션으로 보호되면 ODBMS는 인덱스와 테이블 파일을 업데이트할 수 있다.전체 커밋 프로세스는 동시에 커밋하는 여러 트랜잭션과 동시에 실행될 수 있으며, 솔리드 스테이트 드라이브를 사용함으로써 큰 이득을 얻지만, 메모리 파일에서 전체 트랜잭션을 캐슁하고 마지막에 드라이브에만 커밋하는 프로세스는 전체 트랜잭션 시간을 단축하는 데 도움이 되며, 그렇지 않은 것과 비교할 수 있다.n-flashing DBMS.
지원되는 인덱스
이전의 일부 객체 데이터베이스 모델과는 달리,[6][7] ISAM 수준 데이터베이스로서 ODBPP는 매우 다양한 색인을 지원한다.객체 모델의 초기 개발 동안, 기본 설계는 그것의 ID로 참조되고 다른 인덱스 액세스는 제공하지 않는 직렬화된 이진 객체만 포함하는 스키마를 사용하는 것이었다.이것은 라벨 등에 대한 기본적인 검색을 방지하였고, 밑줄 친 아키텍처가 여전히 관련 모델에 기초하고 있었기 때문에 이루어졌다.ODBPP는 항상 객체 모델로 설계되었기 때문에 객체의 계층적 특성을 이해하고 있으며, 그 안에 포함된 데이터를 색인화할 수 있다.
정적 해시 지수
데이터베이스 내의 모든 개체는 정적 해시 인덱스를 통해 관리되는 개체 식별자에 의해 참조된다.정적 해시 인덱스는 단순히 ID 값을 취하여 12를 곱하고 오프셋 값을 추가하여 개체의 주소를 포함하는 위치를 추론하는 배열 인덱스일 뿐이다.이것은 물체의 물리적 주소의 위치를 드러낸다.ID를 물리적 주소로 변환하는 이 방법은 데이터베이스 내에 얼마나 많은 객체가 저장되어 있는지에 관계없이 데이터의 진정한 순서 1(O(1)) 검색을 가능하게 한다.
모든 테이블 스키마타에 정적 인덱스를 적용하면 객체 잠금이 객체 자체가 아니라 인덱스에 있기 때문에 파일의 실시간 압축이 가능하다.이는 더 많은 공간이 필요하거나 파일에서 개체를 삭제하는 다른 트랜잭션에 의해 파일 내에서 잠긴 개체도 이동할 수 있도록 허용한다.언제든지 파일 내에서 개체를 이동할 수 있는 이 능력은 색인을 통해 에 액세스할 필요성을 부과하는 반면,[8] SQL 데이터베이스는 파일을 처음부터 끝까지 스캔하여 모든 레코드를 스캔할 수 있으며, 실시간 압축은 이러한 유형의 액세스를 금지한다.
B+ 트리 인덱스
B+ 트리 색인은 모든 데이터베이스의 주요 업무 중심이며 ODBPP도 예외는 아니다.대부분의 검색은 인덱스 위치를 찾는 것을 통해 수행되며 반복적으로 차상위 값을 부른다.ODBPP는 B+ 트리에 다수의 필터를 지원하여 결과를 보다 유용하게 만든다.예를 들어 모든 소문자를 대문자로 변환하도록 설정하거나, 제거 화이트 스페이스 또는 비 영숫자 문자로 설정할 수 있으며, '9'가 '10' 이전인 경우 자연스러운 정렬 순서를 제공할 수도 있다.
표준 DBMS에 대한 ODBPP의 특징 중 하나는 계층적 객체 내에 저장된 데이터도 색인화할 수 있다는 것이다.그러면 하나의 개체에 대해 0 --n 인덱스 값이 생성되는 상황이 생성된다.
공간 및 시간 인덱스
공간지표는 2차원 좌표공간과 3차원 좌표공간을 모두 검색하는 데 사용된다.시간지표는 1차원의 시간에 따른 유사한 생각이다.
생체 패턴 매칭
ODBPP는 또한 손가락 프린트나 사람 얼굴 같은 2차원 물체 및 3차원 물체 모두의 핵심 포인트를 나타내는 공간 데이터 세트를 지원한다.이러한 집합은 그룹 검색을 허용하는 공간적 색인을 통해 색인화된다.검색 자체는 주어진 오류 내에 최소한 검색 패턴이나 더 많은 포인트를 가진 개체가 있는 임시 인덱스를 만들 것이다.
전체 텍스트 검색
ODBPP는 토큰 목록 색인을 통해 전체 텍스트 색인을 제공한다.이러한 인덱스는 B+ 트리와 버킷 오버플로의 조합으로, 텍스트 문자열이 개별 토큰으로 분할되어 B+ 트리로 인덱싱되며, 여러 개체가 동일한 토큰 값을 가지므로 ID는 버킷 오버플로(동적 해싱과 유사)에 저장된다.이 설계로 B+트리 잎에 있는 모든 토큰을 통해 스캔하여 검색 기준에 맞는 토큰을 식별하고 일치하는 ID를 검색하는 방식으로 전체 텍스트 검색이 이루어진다.
또한 전체 텍스트 검색 쿼리는 검색 결과를 사용할 수 있는 숫자로 줄이기 위해 설정된 논리 함수를 제공한다.예를 들어, 사용자가 토큰 B가 아닌 토큰 A를 포함하는 개체를 검색할 수 있도록 한다.
구현 예
인터페이스 기본 사항
ODBPP는 절차적 스타일과 캡슐화된 객체 C++ 스타일 모두에서 기능하도록 설계되었다.오브젝트 스타일은 낮은 수준에서 데이터베이스와 접속하기 위해 절차적 방법을 여전히 사용하지만, 예에서는 절차적 방법을 보여준다.
네이티브 예제
계급 푸 { 공중의: 열거하다 { 테이블ID = 1}; 서명이 없는 인트로 부모ID; // 이 개체를 상위 개체에 연결하려면 ID 서명이 없는 인트로 깃발[4]; // 0x01 – 상위 항목 있음 열거하다 { 이름,//Foo 객체에 주어진 라벨 설명//Foo에 대한 설명 }; } *fooObject; CODBPP 데이터베이스; CODBPP::오브젝트 반대하다; 서명이 없는 인트로 착오; char16_t *fooName = 텍스트("FooName"), *메세지, 완충하다[128]; 만일 ((착오 = 데이터베이스.오픈데이터베이스(텍스트("C:\\경로\\에게\\Database.odc"))) == NO_ERROR && (착오 = 데이터베이스.비긴트랜잭션()) == NO_ERROR && (착오 = 데이터베이스.오픈테이블(푸::테이블ID)) == NO_ERROR && (착오 = 데이터베이스.ReadObject(푸::테이블ID, CODBPP::이퀄토, &반대하다, 1, fooName)) == NO_ERROR){ fooObject = (푸*)반대하다.고정된; swprintf_s(완충하다, __countof(완충하다), 텍스트("상위 = %d, 플래그 = %d"), 고정 객체->부모ID, fooObject->깃발[0]); 메시지 상자(완충하다); } 만일 (착오 && 데이터베이스.GetErrorMessage(&메세지) == NO_ERROR) 메시지 상자(메세지); 데이터베이스.엔드트랜잭션();
TScript 예제
이름이 "FooName"인 데이터베이스에서 개체를 읽는 동등한 TScript 예는 다음과 같다.
#include "ODBPP.ts" 공중의 본래의(가변적 매개변수 = 무효의 : 구조 결과.) { ODBPP 데이터베이스; ODBPP.오브젝트 객체 핸들; 데이터베이스.오픈데이터베이스(L"c:\\경로\\에게\\Database.odc"); 데이터베이스.비긴트랜잭션(); 데이터베이스.오픈테이블(1); 데이터베이스.ReadIndex(1,CODBPP.이퀄토,1,L"FooName": 객체 핸들); 데이터베이스.조각 오브젝트(1,객체 핸들:결과.); 시스템::메시지 상자(L"부모 = "+결과..부모ID+L", 플래그 = "+결과..깃발); }
C# 예제
ObjectDatabase++는 COM 래퍼 클래스 'ODBPPLib'를 통해서도 노출된다.ODBPP'. 이름이 "FooName"인 데이터베이스에서 개체를 읽는 동등한 C# 예는 다음과 같다.
사유의 공허하게 하다 button1_클릭(반대하다 발송인, 이벤트아그스 e) { 해보다 { ODBPPLib.ODBPP odbpp = 새로운 ODBPPLib.ODBPP(); odbpp.오픈데이터베이스(@"C:\Path\To\Database.odc"); odbpp.비긴트랜잭션(odbpp.공유했습니다., 6000); odbpp.오픈테이블(1); ODBPPLib.DatabaseObject 결과. = odbpp.ReadObject(1, odbpp.이퀄토, 1, "FooName"); 만일 (결과. != 무효의) 메시지 상자.쇼("부모 = " + 결과..readField("ParentID") + ", 플래그 = " + 결과..readField("플랙스")); } 잡히다 (예외 e1) { 메시지 상자.쇼(e1.메시지); } }
참조
- ^ 웨이백 머신에 보관된 Ekky 소프트웨어 2012-09-29
- ^ "Archived copy". Archived from the original on 2013-08-21. Retrieved 2013-08-02.
{{cite web}}
: CS1 maint: 타이틀로 보관된 사본(링크) - ^ Khoualdi, K, & Aughamdi, T 2011, 'ISO 9001:2000 시스템에 대한 객체 지향 데이터베이스 실무 연구를 이용한 시스템 개발', 소프트웨어 엔지니어링 & 애플리케이션 저널, 4, 12, 페이지 666–671, Computers & Applied Science Complete's Complete
- ^ Naser, T, Alhajj, R, & Ridley, M 2009, '객체 지향 데이터베이스와 XML 사이의 양방향 매핑', Informatica(03505596), 33, 3, 페이지 297–308, Computer & Applied Science Complete
- ^ Suri, P, & Sharma, M 2011, '데이터 웨어하우징에서 관계형 데이터베이스와 객체 지향형 데이터베이스의 성능 비교 연구', 국제 데이터베이스 관리 시스템 저널 3, 2, 116–127, 컴퓨터 & 응용 과학 완성
- ^ Hardwick, M, Samaras, G, 1989년, '엔지니어링 설계 시스템의 분산 객체 데이터베이스에 대한 인덱스로 관계형 데이터베이스 사용', 1989년, 제2차 국제 컨퍼런스 날짜: 1989년 10월 16일-18일
- ^ Jang, F, Ma, Z, and Yan, L 2011, '객체 지향 데이터베이스 모델에서 온톨로지 구성', 통합 컴퓨터 지원 엔지니어링, 18, 4, 페이지 327–347, Computer & Applied Science Complete
- ^ Lee, K.C.K; Hong Va Long; Si, A. 2003, 분산 컴퓨팅 시스템 워크샵, 2003.회의 날짜에 관한 제23차 국제 회의: 2003년 5월 19일-22일.