2014-02-28 1 views
5

Laravel 4.1에서 여러 DB 연결을 처리하는 것에 대한 질문이 있습니다. 그 DB를 3 개 가지 연결하기Laravel 4 및 MySQL이 너무 많습니다.

'mysql' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_1', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql2' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_2', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql3' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_3', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

내가해야합니다 내가

는 예를 들어, 호스트에 3 개 DB를 하나 개의 DB 호스트를 말해봐?

아니면 단순히 하나의 연결을 가지고 있으며 각 모델에 같은으로 테이블 이름 을 지정해야합니다 :

public $table = "DB_2.table_name"; 

물어 이유, 나는 그것이 를 배출하기 쉽다는 것을 눈치 챘을 것입니다 다른 데이터베이스에 연결할 필요가있을 때 새로운 DB 연결을 생성하므로 데이터베이스 연결이 필요합니다.

저는 둘 다 잘될 것이라는 것을 알고 있지만, 이런 상황에서 "우수 사례"로 간주되는 것에 관심이 있습니다.

의견에 미리 감사드립니다.

건배.

답변

1

DB 구현이 아닌 테이블을 지정하십시오.

나는 동일한 서버에있는 DB 사이에서 MySQL에 대해 DB 간 쿼리를 허용하는 '기능'에 대한 큰 팬이 아닙니다. 이것이 당신이 언급하는 것을 허용 할 것입니다.

  • db의 이름을 변경하면 코드에서 테이블 이름을 리팩터링해야합니다.
  • 코드 또는 db 수정을 테스트하기 위해 table_name_test과 같은 테스트 데이터베이스를 만드는 경우 구성 파일을 편집하는 것과 db를 건너 뛸 때마다 코드에서 모든 테이블 이름을 수정해야합니다.
  • DB 이름이없는 다른 DB 기술로 이동하는 경우 (서버 당 1Db/fuile이면 각 클래스의 테이블 이름 속성을 리팩터링해야합니다)
  • 어둡고 유혹스러운 아직은 경로를 이끌어냅니다 select * from db1.foo f Join db2.bar b on b.id = f.id;과 같은 교차 DB 검색어 중 축하합니다. 실제로 당신의 2 dbs를 실제로 MySQL 외부에서 실행되지 않는 하나의 큰 db로 바꾸 었습니다.

또한 3 개의 연결을 지정하고 있어도 3 개의 연결을 모두 지정하지 않고 한꺼번에 사용하는 것이 좋습니다. .. 나는 희망. 만약 당신이 응용 프로그램/사이트에 2 개의 연결을 저장하는 요청에 대해 3 개의 연결을 모두 사용한다면 아마도 마이크로 최적화 일 것입니다.

+0

네, 당신이 옳다고 생각합니다. 궁극적으로 우리는 한 번의 작업 흐름에 대해, 특히 단일 쿼리의 경우에 여러 개의 DB 연결을 만들 필요가 없도록 데이터 모델을 다시 설계해야합니다. 그 때까지는 시스템에 과부하가 걸리지 않도록해야합니다. 내가 가진 문제는 동시 요청이 많이 처리되는 경우입니다. 따라서 요청 당 최대 3 개의 연결이 이루어 지므로 트래픽이 많을 때 성능이 저하 될 수 있습니다. – Gimli

+0

@Gimli 동일한 연결에서 db를 '전환'하기 위해 PDO에는 아무런 방법이 없습니다 (laravel에서이를 사용한다고 가정). dsn이 생성자에 전달되면 설정됩니다. DSN에 db가 지정되어 있어야합니다. $ 테이블에서 db 이름을 사용하려고하면'select * from DB1.DB2.footable'과 같은 요청을 얻을 수 있습니다. – Ray

+0

@Gimili 물론 수동으로 작성한 쿼리를 사용하면 orm 또는 DQL을 사용하지 않는 경우이 작업을 수행 할 수 있습니다. – Ray

0

이 코드는 필요할 때 나를 위해 속임수를 사용했습니다. 귀하의 경우에는

Config::set('database.default', 'database_name'); 

, 당신이해야 할 수도 있습니다 사람과 데이터베이스 _를 교체합니다. 스위치를 만들 필요가있을 때마다 컨트롤러에서이를 호출합니다. 예를 들어, 쿼리하기 전에.

적이 그것을 할 수있는 가장 좋은 방법 인 경우 나도 몰라,하지만 나를 위해 일한 내가 가치 공유를 생각했다! = D

+1

이것이 작동하는 동안 컨트롤러에서 데이터베이스 연결을 만드는 것이 좋은 방법인지 잘 모르겠습니다. 그러나, 나는 열심히 연결을 열고 닫는 것이 가장 중요한 일이 될 것이라고 확신하지 못합니다. 특히 여러 데이터베이스에 대한 쿼리를 수행해야하는 경우. 최악의 경우, 3 개의 별도 DB 연결이 필요합니다. – Gimli