2011-01-05 4 views
11

레일스 철학에 따르면 데이터 무결성 검사는 데이터베이스 수준이 아닌 응용 프로그램 수준에서 수행되어야한다는 것을 알고 있습니다. 다른 많은 개발자들과 마찬가지로, 나는 열광적으로 반대합니다.레일즈 3의 외래 키

이 문제를 해결하기 위해 많은 논의가 있었지만 모두 낡은 것처럼 보였습니다. 당황스럽게도 여러 가지 해결책을 제시하는 것 같습니다.

레일즈 3에서 외래 키 제약 조건을 수행하는 사실상의 표준 방법이 있다고 상상해보아야합니다. 그러나 그것이 존재한다면 (존재하는 경우) 내가 찾지 못해서 모든 과거 토론에 의해 위태로워 보인다. 그것.

이 시점에서 Rails 개발자는 대부분 외래 키가있는 동일한 페이지에 있습니까? 그렇다면, 나는 그들이 일반적으로 어떻게 다루어지고 있는지 알고 싶다. 액티브 레코드는 기능을 직접 작업 할 수있는 도구를 제공하지 않지만

답변

6

필자와 (엔터프라이즈 레일즈를 작성한 사람들 - http://oreilly.com/catalog/9780596515201)는 SQL에서 전체 위아래 마이그레이션을 작성하는 것이 좋습니다.

장점은 다음과 같습니다

  • 테이블 작성에 외부 키를 추가 할 수있는 기능 - tsvectors처럼
  • 그것은 당신을 수 있습니다 - 별도의 테이블 변경 그것은 당신이 데이터베이스 특정 필드 유형을 사용할 수 있습니다
  • 없이 GIN 또는 GIST와 같은 다른 유형의 인덱스를 추가하는 방법
  • 함수 및/또는 트리거를 쓸 수 있습니다.
  • 어떤 SQL 유형이 어떤 SQL 필드 ty와 관련되어 있는지 기억하지 않아도됩니다. pe - 예 : 그것은 (? 누가 걱정하고 데이터베이스를 변경하는 빈도)
  • 그것은 루비 아니다 (그러나 모든 좋은 레일 개발자가 SQL을 알아야 불가지론 데이터베이스가

    • 아니다 : 수

    는 단점이있다 , 맞지?)

그러나 전반적으로 장점은 단점보다 중요합니다.

빠른 예 :

def self.up 
    execute <<EOS 

create table .... (
    .... 
); 

EOS 
    end 
+0

좋은 답변입니다. 그래도'<< -EOS' 형태의 heredoc을 사용할 것을 제안 할 수 있습니까? 그런 식으로 모든 것을 0 열로 정렬 할 필요가 없습니다. – noodl

+0

그래도 완벽하게 타당합니다 - 그래도 약간 이상하고 내 SQL이 올바르게 정렬되도록하고 싶습니다. 특히 동일한 함수/트리거를 작성하는 경우에 특히 그렇습니다. 이주. –

+0

나는 이것이 내가 할 것이라고 생각한다. 단지 호기심에서 벗어나면 내 테이블과 모델을 생성 할 수 없다는 뜻입니까? SQL에서 테이블 정의를 작성한 다음 일치하는 모델을 별도로 작성해야합니까? –

0

은 나 자신은 다른 일 같은 질문을 발견, 그래서 제가 조사를 좀 해봤 an answer to an older but similar Stack Overflow question 내 결과를 대조. 나는 그것이 사용되기를 바랍니다. 당신은 당신이 데이터 무결성 검사는 데이터베이스 레벨 반대로 응용 프로그램 수준에서 이루어져야한다 "열정적으로 동의"고 말할 때

BTW, 난 당신이 그들보다는 모두 수준에서 수행해야한다는 것을 의미 가정 데이터베이스에서.나는 사실상 모든 사람이 응용 프로그램 수준에서 무결성 검사를하는 것이 좋은 것임을 동의하고 토론 할 유일한 주제는 , 또을 데이터베이스에서 수행해야하는지 여부에 동의한다는 것입니다.