2010-11-18 2 views
1

저는 파이썬 3을 사용하고 있습니다 만, 문제는 실제로 특정 언어에 묶여 있지 않습니다.서브 테이블 구현하기 (테이블보기) : 클래스 관계 디자인하기

나는 기본 키가있는 테이블을 구현하는 class Table입니다. 이 클래스의 인스턴스에는 실제 데이터 (매우 큰 데이터)가 들어 있습니다.

사용자가 테이블의 행에 필터를 제공하여 하위 테이블을 만들 수있게하려고합니다. 나는 테이블을 복사하고 싶지 않기 때문에 부모 테이블의 기본 키의 하위 집합 만 하위 테이블에 보관할 계획이었습니다.

분명히, 서브 테이블은 부모 테이블에 대한 뷰일뿐입니다. 상위 테이블이 변경되면 변경되고 상위 테이블이 삭제되면 유효하지 않게되며 상위 테이블에서 삭제되면 일부 행이 손실됩니다. [EDIT : 명확히하기 위해 부모 테이블이 변경된 경우 하위 테이블에 어떤 영향을 미치지 않습니다. 모든 동작은 정상입니다.]

두 클래스를 어떻게 연결해야합니까? 나는 생각했다 :

class Subtable(Table): 
    def __init__(self, table, filter_function): 
    # ... 

내 가정이 SubtableTable의 인터페이스를 유지이었다, 약간 상속 된 메소드를 오버라이드 (override)를 제외하고 단지 행에이 좋은 구현되어 있는지 확인 할 수 있습니다.?

문제는 전달 된 테이블 개체를 복사하지 않으려는 경우 주어진 Subtable 인스턴스를 초기화하는 방법을 잘 모르겠습니다. 심지어 가능할까요?

class Table 또한 Subtable 인스턴스를 반환하는 인스턴스 메서드를 제공하려고 생각했습니다. 하지만 SubtableTable의 의존성이 생기고, 피하는 것이 더 낫다고 생각하십니까? 내가 사용하는거야

+0

이 데이터 구조를 데이터베이스로 옮겼습니다. 파이썬에는 메모리에 SQL DB를 생성 할 수있는'sqlite3'이있다. – katrielalex

+0

네,하지만 지금은 맞춤 구현을 고수하기로 결정했습니다. – max

답변

1

다음 (I이 배열에서 아주 잘 작동과 같은 종류의 많은 방법, 생략, 생략 오류 처리) : 기본적으로

class Table: 
    def __init__(self, *columns, pkey = None): 
     self.pkey = pkey 
     self.__columns = columns 
     self.__data = {} 

    def __contains__(self, key): 
     return key in self.__data 

    def __iter__(self): 
     for key in self.__order: 
      yield key 

    def __len__(self): 
     return len(self.__data) 

    def items(self): 
     for key in self.__order: 
      yield key, self.__data[key] 

    def insert(self, *unnamed, **named): 
     if len(unnamed) > 0: 
      row_dict = {} 
      for column_id, column in enumerate(self.__columns): 
       row_dict[column] = unnamed[column_id] 
     else: 
      row_dict = named 
     key = row_dict[self.pkey] 
     self.__data[key] = row_dict 

class Subtable(Table): 
    def __init__(self, table, row_filter): 
     self.__order = [] 
     self.__data = {} 
     for key, row in table.items(): 
      if row_filter(row): 
       self.__data[key] = row 

을, 나는 차를 복사 해요 키에만 연결하고 연결된 데이터에 대한 참조를 만듭니다. s 위 테이블의 행이 h 제되면 서브 테이블에 계속 존재합니다. 상위 테이블에서 행이 수정되면 하위 테이블에서도 행이 수정됩니다. 내 요구 사항은 "부모 테이블이 수정 될 때 어떤 일이든"이므로 괜찮습니다.

이 디자인에 문제가있는 경우 알려주십시오.