2011-07-01 4 views
2

현재 프로젝트에서 우리는 다른 데이터베이스에 대해 높은 수준의 DBI가 필요합니다. - DBI 모든 읽기 캐시하고 (우리가 코딩 응용 프로그램이 무거운 스레드, 그리고 빠른 필요 쓰기 호출에 캐시를 업데이트 할 수 있어야한다 메모리 캐시에서C++ DBI 클래스 - 가장 좋은/개발자 가장 친숙한 스타일

  • 에는 다음과 같은 기능을 제공한다 항상 현재 데이터에 대한 액세스). 메모리 캐시를 기반으로합니다 boost::multi_index
  • 자동 SQL 건물 - 우리는 우리가 기능을 제공하기 위해 필요에 따라 메모리 캐시

에 참조하기위한 SQL 문을 구문 분석하지 않으 : 테이블을 정의 레이아웃, 선택 작업, 삽입 작업, 업데이트 작업, 조인 작업 ... 인터페이스가 매우 복잡해집니다.

인터페이스 기능을 호출하는 좋은 방법이 필요합니다.

주위에는 여러 가지 스타일이 있지만 Google에서 유용하게 사용할 수는 없습니다.

다음은 몇 가지 예 :

SOCI

sql << "select name, salary from persons where id = " << id, into(name), into(salary); 

우리는 몇 가지 SQL 문을 원하지 않는다, 그래서 우리는 whatfrom 다른 방법을 정의해야합니다.

pqxx

Conn.prepare("select_salary", 
    "select name, salary from persons where id = $1") 
    ((string)"integer",prepare::treat_direct); 

오버로드 operator()의 무거운 사용은 추악한,하지만 너무 우리를 위해 일할 수 있습니다.

어떤 제안이 있나요? 디자인 인터페이스?

답변

1

개체 관계형 매핑을 사용하는 방법은 어떻습니까? 내 머리 꼭대기에서 코드 조각 아이디어를 몇 가지 소개합니다. 파이썬에서는이 코드를, C++에서는 절대 사용하지 않았고, 아주 간단한 데이터베이스에서만 코드화 된 코드를 사용했습니다. 객체가 모든 관계형 물건 프레임 워크에 의해 처리로 너무 많은 바퀴 관련 R & D.이

class people: public dbi_table 
{ 
    // id column handled by dbi_table. 
    name: string_column; 
    salary: money_column; 
}; 

class cost_center: public dbi_table 
{ 
    name: string_column; 
    office: foreign_key<offices>; 
}; 

class people_cost_center_link: public link_table 
{ 
    // Many-many relationships. 
}; 

그런 다음 기록을 조작 할 수 피해야 list of frameworks on Wikipedia이있다. 쿼리는 쿼리 개체를 정의한 다음 결과에 대한 반복자를 가져 와서 수행됩니다 (코드 예는 the ODB wikipedia page 참조).

+0

아이디어에 감사드립니다.하지만 이미이를 평가했습니다.ODB는 자체 컴파일러/전처리기를 사용하며, 대부분의 ORM 프레임 워크는 데이터베이스 종속 데이터 유형 등을 사용하고 있습니다. 나는 ODB와 함께 사용할 코딩 스타일을 좋아하지만, 지금 당장은 컴파일러/프리 프로세서가 필요없이 구현하는 방법을 모릅니다. 내부 캐시를 쿼리해야하므로 sql 데이터 유형을 해당 내부 유형에 매핑 할 수 있어야합니다. 아마도 너. –

+1

기존 프레임 워크를 사용하지 않는다면 가장 큰 문제는 쿼리 구문입니다. 맞습니까? ID로 삽입, 업데이트 및 검색은 모두 테이블, 열 등의 개체로 처리 할 수 ​​있습니다. "search_by "메소드를 구현 한 경우 기본적으로 "캐시에 없다면 sql select * 테이블에서 field_name은 blah"로 실행됩니다. –

+0

'search_by '소리가 좋습니다. 나는 오늘 밤에 더 자세히 살펴 보겠습니다 –

0

내가 이런 식으로 할 것 (그리고 관점 C++로 좋은 것, 몰라가 있다면 올바른 데이터베이스 물건) : 일반적으로 이러한 기능은 다음과 같이 구현 될 것이다

struct Handle { int id; } 
class DBI 
{ 
public: 
    virtual Handle select(int column_id)=0; 
    virtual Handle select(int column1, int column2)=0; 
    virtual Handle id(int id)=0; 
    virtual Handle join(Handle i1, Handle i2)=0; 
    virtual void execute_query(Handle i)=0; 
}; 

:

Handle select(int column_id) { 
    return new_handle(new SelectNode(column_id)); 
} 

여기서 new_handle 함수는 SelectNode를 std :: vector 또는 std :: map에 삽입하고 핸들을 만듭니다.

관련 문제