관계형 데이터베이스에서 사용자 데이터 트리 추출

5984 단어 postgresrakumysql

문제



관계형 데이터베이스는 훌륭합니다. 스키마를 정규화하면 문서 지향 NoSQL 솔루션보다 저렴하고 빠르게 애플리케이션에 사용자 데이터를 저장할 수 있습니다. 그러나 행 소유권을 확인하고 추출해야 하는 경우 복잡하고 심층적인 스키마는 정말 골칫거리가 될 수 있습니다.

데이터베이스에서 일부 사용자와 그에 속한 모든 레코드(예: 주소, 주문, 설명 등)를 추출하려는 몇 가지 시나리오가 있습니다.

  • 백업용. 비활성 사용자 데이터를 저렴한 장기 스토리지 및 무료 데이터베이스 공간으로 이동합니다.

  • 법적 목적을 위해. 사용자의 현재 상태를 확보해야 하는 경우.

  • 더 나은 로드 밸런싱을 위해. 데이터베이스 샤드 간에 사용자를 마이그레이션합니다.

  • 판매용. 응용 프로그램에서 역할 모델 데모 사용자를 준비하려면 그의 데이터를 저장하고 응용 프로그램의 데모 인스턴스에 로드하십시오.

  • 디버깅을 위해. 애플리케이션이 오작동하고 사용자 데이터를 격리된 방식으로 분석하고 프로덕션 시스템에서 로컬 시스템으로 복제하려는 경우.

  • 해결책



    저는 큰 스키마로 많은 작업을 합니다. 수백 개의 데이터베이스, 각 데이터베이스의 수백 개의 테이블, 깊은 관계 체인, 하루에 최대 몇 번의 스키마 변경. 그래서 관계형 데이터 추출을 자동화하는 도구를 만들었습니다: UpRooted .

    목표는 간단했습니다.

  • 완전 자동화. 나는 싱글 JOIN을 쓰고 싶지 않습니다.

  • 최적. 관련 테이블의 데이터는 데이터베이스 관점에서 가장 효율적인 방법으로 도달해야 합니다.

  • 똑똑한. 제약 조건을 위반하지 않고FOREIGN KEY 나중에 다른 데이터베이스에 로드할 수 있도록 데이터를 처리해야 합니다.

  • 예시



    MySQL 데이터베이스가 있고 관련 테이블의 모든 데이터와 함께 users = 1인 id 테이블에서 사용자를 추출해야 한다고 가정합니다.

    UpRooted 사용을 시작하는 가장 쉬운 방법은 Docker 컨테이너를 사용하는 것입니다.

    예를 들어 다음과 같이 스크립트 및 출력 파일을 위한 작업 디렉토리를 생성합니다.

    mkdir /Users/me/uprooted
    


    Docker를 실행하고 이 디렉터리를 마운트합니다.

    docker run --interactive --tty --volume /Users/me/uprooted:/home/uprooted bbkr2/uprooted:latest
    


    UpRootedRaku에 작성되었으므로 이 디렉토리에 다음 내용으로 example.raku 파일을 생성합니다(연결 자격 증명을 조정해야 함을 기억하십시오).

    use DBIish;
    use UpRooted::Schema::MySQL;
    use UpRooted::Tree;
    use UpRooted::Reader::MySQL;
    use UpRooted::Writer::MySQLFile;
    
    my $connection = DBIish.connect(
        'mysql',
        host => '***', port => 3306, user => '***', password => '***', database => '***'
    );
    
    my $schema = UpRooted::Schema::MySQL.new( :$connection );
    my $tree = UpRooted::Tree.new( root-table => $schema.table( 'users' ) );
    my $reader = UpRooted::Reader::MySQL.new( :$connection, :$tree );
    my $writer = UpRooted::Writer::MySQLFile.new;
    
    $writer.write( $reader, id => 1 );
    


    컨테이너 내에서 스크립트를 실행합니다.

    raku example.raku
    


    사용자는 out.sql 디렉토리의 /Users/me/uprooted 파일에 저장됩니다.

    더 많은 정보


    UpRooted:: 네임스페이스의 각 모듈에 대한 설명, 고급 사용 사례 및 잠재적인 스키마 설계 문제에 대해서는 UpRooted README를 읽을 것을 강력히 권장합니다.

    버그를 발견했거나 몇 가지 제안 사항이 있는 경우 GitHub에서 문제를 자유롭게 생성하세요.

    행복한 데이터 추출 :)

    좋은 웹페이지 즐겨찾기