2012-03-15 3 views
2

엄청난 양의 데이터와 여러 개의 조인으로 응용 프로그램을 만들고 있습니다. 레일즈에서 전체 SQL 문자열을 바로 사용하는 것은 나쁜 습관입니까? 레일즈에서 전체 SQL 쿼리를 작성하면 단점이 있습니까?SQL 쿼리를 레일스에 직접 작성하는 것이 좋은 습관입니까?

+0

복잡한 쿼리의 많은 훨씬 쉽고 SQL에 표현 청소기, 그들은 또한 SQL 튜닝에 훨씬 쉽게입니다. 나는 항상 그것을하고, 나는 또한 진짜 FK, CHECK 제약, 방아쇠, 그리고 야생의 포기한 이교도적인 것들을 사용한다. –

+0

그리고 저는 때때로 차를 타는 것보다 다른 장점이 있기 때문에 때때로 가게로 걸어갑니다. 비록 때때로 다른 곳으로 빨리 갈 수 없기 때문에 때로는 운전을 강요 하지만요. 마치 원시 SQL에서 웹 애플리케이션을 작성하는 것이 더 오래 걸리는 것처럼 말입니다. OP는 (더 좋든 나쁘 든) 그렇게하지 못하도록 고안된 프레임 워크를 사용하면서 원시 SQL을 사용하는 것이 좋은 아이디어인지 묻습니다. 사실은 그가 자신의 특별한 경우에 그렇게해야 할 이유가 없다는 사실입니다. 그리고 특별한 이유가없이 최선의 관행이 아니라고 주장합니다. –

+0

우리가 EAV 모델에서 계속 증가하고 데이터베이스를 유지할 170 만 개의 coloumns에 대해 이야기한다면 어떨까요? – phoenixwizard

답변

3

대체 방법을 이해하지 않고 수행하는 것은 나쁜 습관입니다.

그렇다고하는 이유는 거의 없습니다. 프레임 워크는 그것을 캡슐화하고 이점은 적은 코드를 작성해야한다는 것입니다. 다른 이점은 데이터베이스 독립성입니다. 직접 작성하는 쿼리가 많을수록 데이터베이스 엔진을 전환 할 때 무언가를 쓸 가능성이 커집니다.

테스트하기 쉽습니다. 프레임 워크를 적절히 사용하면 (즉, 수많은 기사에서 논의 된 바와 같이 ActiveRecord를 최적화 함) 여전히 쿼리가 너무 느린 것처럼 느껴지더라도 직접 쿼리를 벤치마킹 할 수 있습니다.

ActiveRecord 연결을 사용하여 무언가를하는 방법을 알지 못하는 것은 직접 SQL을 사용하지 않는 이유입니다.

http://guides.rubyonrails.org/association_basics.html

+3

데이터베이스 독립성은 대부분 신화이며, ORM은 데이터베이스 간의 차이를 방지합니다. 그래서 많은 사람들이 "SQLite로 개발했지만 PostgreSQL과 함께 Heroku를 사용하지 못했습니다."라는 질문과 왜 우리가 항상 동일한 스택에서 개발하고 배포하도록 사람들에게 말했는지에 대한 것입니다. –

+0

개발자 그룹을 한 방에 배치하고 프레임 워크가없고 SQL 쿼리가없는 PHP만으로 웹 애플리케이션을 작성하게하십시오. 그런 다음 다른 유사한 그룹을 방에 넣고 직접 SQL이없는 레일스 또는 다른 좋은 ORM 기반 프레임 워크로 웹 응용 프로그램을 작성하게하십시오. 두 그룹이 같은 양의 데이터베이스 이식성 문제를 갖게 될 것이라고 말합니까? –

+0

네, 그렇게 말할 것입니다. 쇼 스토퍼 이식성 문제 (GROUP BY 동작, 데이터 정렬 문제, 캐스팅, NULL 처리 에지 케이스, LIKE 대/소문자 구분 등)는 동일 할 것이며 사소한 것들 (다른 식별자 인용과 같은 것)은 쉽게 해결할 수 있으며 가치가 없습니다 걱정하고있어. 나는이 문제를 수년간 다루었 기 때문에 맹목적으로 그들의 ORM을 신뢰할 수있는 충분한 사람들을 보았고 배치되었을 때 흥미로운 방식으로 문제가 발생할 때 데이터베이스의 중요한 덩어리를 다시 써야했습니다. –

1

당신이 meta_where 보석을 참조 표준 액티브 모듈을 제공보다 더 강력한 구문이 필요합니다.

1

SQL은 '나쁜 습관'이 아닙니다. 그 자체는입니다. 데이터베이스 시스템은 Ruby로 작성된 경우 실행하기가 훨씬 느리고 작성 및 유지 관리가 더 복잡 할 수있는 많은 원시 SQL 방법을 가지고 있습니다. 오라클의 분석 기능과 같습니다. 말했다

는, 액티브 당신은 아마 SQL 쿼리를 사용하여 성능 향상을 얻을하지 않을 쓰기 꽤 쉽습니다. 적어도 작성한 쿼리가 ActiveRecord 쿼리와 비슷하다면 어쨌든! ;)

아마도 ActiveRecord로 작업하고 다른 방법으로는 해결할 수없는 문제가 발생한 경우에만 SQL에 의존하려고 노력해야합니다. 그렇게하면 다른 방법 (예 : '초기 최적화')을 수행 할 때까지 코드를 간단하게 유지할 수 있습니다.

나는 일반적으로 ActiveRecord (또는 DataMapper 또는 Sequel 또는 기타)에서 작동하도록 노력하지만, 작업이 신속하게 수행되어야 할 때 finder_sql을 확실히 사용했으며 ORM의 '설탕을 사용하여 어디로 가고 싶습니까? '. 다른 시간에 나는 데이터베이스의 단일 대규모보기에 레일 객체를 기반으로했습니다.

희망이 도움이됩니다.

: D

관련 문제