나는 이상한 문제가 있습니다. 알아낼 수 없습니다.레일즈 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가 예상대로 발생합니다.
누구든지 내가 할 수있는 것에 대해 아이디어를 얻었습니까?이 설정에서 테스트 스위트가 올바르게 작동합니까?
UUID 기본 키를 사용하면 이보다 더 신뢰할 수 없습니까? – tadman
UUID PK에 대해 확실하지 않습니다. ID 시퀀스와 비슷한 또 다른 surrogate PK입니다. 필자는 MySQL 클러스터링에 대한 논의를 시작하고 싶지는 않지만 user_id, feed_id에 PK를 사용하면 사용자가 오랜 기간 피드를 만들 때도 디스크에 서로 저장되며, 하나의 DB 읽기 또는 둘 중 하나를 사용하여 모든 것을 읽을 수 있습니다. 테이블은 테이블에 고유해야하므로 테이블의 자연스러운 키입니다. –
'(user_id, feed_id)'쌍에 유일한 제약 조건/인덱스를 던져 PK를 그냥 두지 않는 이유는 무엇입니까? 아마도 Rails를 사용하면 PK로 엉망이되기 쉽습니다. –