2013-10-01 1 views
1

나는 이상한 문제가 있습니다. 알아낼 수 없습니다.레일즈 4는 MySQL을 사용하는 대체 기본 키

mysql의 클러스터링 기능을 사용하여 디스크상의 서로 다른 관련 레코드를 저장하려고합니다. Mysql 클러스터 테이블의 기본 키에 의해, 어떤 기본 레일 모델에 대한 ID입니다.

그러나 많은 테이블의 경우 테이블의 기본 키가 user_id, subscription_id와 같이 각각의 옆에있는 관련 레코드를 클러스터링하고 요청했을 때 매우 효율적으로 조회 할 수 있습니다. 모든 사용자의 구독에 대한 데이터베이스

이 작업을 수행하려면, 내가 좋아하는 MySQL의 테이블을 만들어 내 PK가

execute('create table subscriptions (
      id   integer not null auto_increment, 
      user_id integer not null, 
      feed_id integer not null, 
      folder_id integer, 
      created_at  datetime, 
      updated_at  datetime, 
      primary key (user_id, feed_id), 
      key id (id) 
     ) engine=InnoDB default charset=utf8'); 

공지 사항 USER_ID, FEED_ID하지만 난 여전히 ID 열 선물을 가지고, 나는 레일 여전히 사용하려는 것과 그것을 테이블에 대한 PK라고 생각합니다.

우선,이 모든 내가 설정 될 때까지 작동하지 않았다 :

class Subscription < ActiveRecord::Base 

    self.primary_key = 'id' 
    ... 
end 

지금 이상한 부분을 온다.

내 테스트를 실행

, 나는 이상한 오류 얻을 : 그러나

Mysql::Error: Field 'id' doesn't have a default value: INSERT INTO `subscriptions` 

를 - 내가 개발 모드에서 응용 프로그램을 스틱 웹 페이지를 통해 작업을 할 경우, 그냥 잘 작동합니다.

은 인터넷 검색을 많이 후, 나는 엄격한 모드로 MySQL의 설정 레일 정지 원숭이 패치 발견 :이 추가하면

class ActiveRecord::ConnectionAdapters::MysqlAdapter 

private 
    alias_method :configure_connection_without_strict_mode, :configure_connection 

    def configure_connection 
    configure_connection_without_strict_mode 
    strict_mode = "SQL_MODE=''" 
    execute("SET #{strict_mode}", :skip_logging) 
    end 
end 

, 내 테스트 슈트는 대부분의 시험 (작업 나타납니다,하지만 all), 생성 된 모든 모델의 ID는 0입니다.

다시 프로덕션 모드에서 웹 페이지를 통해 정상적으로 작동하고 모델에서 auto_increment ID가 예상대로 발생합니다.

누구든지 내가 할 수있는 것에 대해 아이디어를 얻었습니까?이 설정에서 테스트 스위트가 올바르게 작동합니까?

+0

UUID 기본 키를 사용하면 이보다 더 신뢰할 수 없습니까? – tadman

+0

UUID PK에 대해 확실하지 않습니다. ID 시퀀스와 비슷한 또 다른 surrogate PK입니다. 필자는 MySQL 클러스터링에 대한 논의를 시작하고 싶지는 않지만 user_id, feed_id에 PK를 사용하면 사용자가 오랜 기간 피드를 만들 때도 디스크에 서로 저장되며, 하나의 DB 읽기 또는 둘 중 하나를 사용하여 모든 것을 읽을 수 있습니다. 테이블은 테이블에 고유해야하므로 테이블의 자연스러운 키입니다. –

+0

'(user_id, feed_id)'쌍에 유일한 제약 조건/인덱스를 던져 PK를 그냥 두지 않는 이유는 무엇입니까? 아마도 Rails를 사용하면 PK로 엉망이되기 쉽습니다. –

답변

0

나는 무슨 일이 일어나고 있는지 알아 냈습니다.

내가 기억하지 못했던 것은 개발 데이터베이스가 schema.rb 파일을 생성하는 데이터베이스에 대해 마이그레이션을 실행하여 만들어 졌다는 것입니다. 그런 다음 schema.rb 파일을 사용하여 테스트 데이터베이스를로드합니다.

내 개발 데이터베이스가 예상대로 보이지만 테스트 데이터베이스가 다르게 보입니다. schema.rb 파일을 생성하는 코드는 내가 만든 데이터베이스 형식을 이해할 수 없으며 반영하는 schema.rb를 만들지 않는 것처럼 보입니다. 마이그레이션이 올바르게 수행되었습니다.

나는 내 테스트 데이터베이스를로드하는 경우 :

$ rake db:migrate RAILS_ENV=test 

그리고 내 테스트 스위트 실행

$ rake test:all 

상황이 제대로 작동합니다. 이는 test : all 태스크가 테스트 스위트를 실행하기 전에 데이터베이스를 다시로드하지 않기 때문입니다.

그래서 schema.rb 부분을 제외하고 레일 ID 키를 유지하면서 대체 기본 키를 만드는 방법에 대해 설명했습니다.

관련 문제