2009-12-18 2 views
2

내가 작업 한 대부분의 응용 프로그램에는 범주, 우편 번호, 지역 코드 등과 같은 데이터베이스에 저장된 참조 데이터가 있습니다.이 정보는 변경 될 것입니다 매우 드물다. 대부분의 경우 표시 이름을로드하고 싶습니다. 그게 전부입니다.레일에서 참조 데이터로드 및 관리

현재이 문제로 인해 너무 많은 두통이 발생하지는 않습니다. 내 쿼리를 수행 할 때 필요한 모델을 포함시키는 것이 쉽지만 앞으로는 많은 쿼리 노이즈가 발생합니다.

이상적으로는 응용 프로그램이 시작될 때 참조 데이터를로드하고 쿼리에서 참조 할 때 데이터베이스로 이동하는 대신 캐시에서로드하는 것이 좋습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

1

이것은 큰 질문이며, 대부분의 Rails 개발자가 어느 시점에서 처리해야했을 것입니다. 부팅 할 때마다 상수로 모든 것을로드하려고했습니다. 또한 cached_model 또는 cache_fu과 같은 플러그인을 사용하여 Memcached 또는 Redis를 사용해 보았고 응용 프로그램이 부팅 될 때 자동으로 캐시를 채 웁니다. 그러나 이러한 접근법은 단일 객체를 찾는 데만 작용하며 ActiveRecord와 전혀 통합하지 않습니다 (예 : 연관을 사용하지 마십시오).

ActiveRecord 통합 기능이 개선 된 Memcached/Redis 플러그인에 대한 시장은 분명하지만 어려운 일이므로 내 생각에 곧 아무것도 볼 수 없을 것 같습니다.

많은 양의 데이터를 미리로드하는 경우 개발 환경의 모든 요청에 ​​대해 데이터를 미리로드하지 않으려는 경향이 있습니다. 이는 모델이 게으르기 때문에 피하기 어렵습니다. 로드 된 (및 모든 요청에 ​​다시로드) 개발 및 아마 데이터를로드 할 모델이 필요합니다. 즉, 이 ActiveRecord와 긴밀하게 통합되어야하므로 데이터가 DB 또는 캐시에서 오는지 여부에 관계없이 작동합니다 (개발시 미리로드하지 않은 경우).

어쨌든 오랫동안 회답을 보내지 않아서 유감스럽게 생각하지만 토론은 지금까지 할 수있는 최선의 방법이라고 생각합니다.

잘하면 나는 틀 렸습니다. 아무도?

+0

머리에 못을 박은 것처럼 보입니다. 지금까지 살펴본 모든 것을 cached_model/fu 등 ... 활성 레코드와 잘 통합하지 마십시오. 그런데 참조 데이터를 가져 오기 위해 캐시로 나가는 것이 조금 이상하다고 느끼지 만, 이는 내가 추측 한 참조 데이터의 양에 따라 달라집니다. 이것은 분명히 더 많이 조사해야 할 필요가있는 것입니다. 레일스 메일 링리스트에 올려 놓을 가치가 있습니다. – jonnii

+0

그래, 20 MB의 우편 번호 데이터를 캐시에 던지면 기분이 좋지 않습니다. 그러나 앱의 각 인스턴스에 대해 20MB 이상의 메모리가 필요합니다. 이것이 Rails 메일 링리스트의 주제라고 동의한다. –

0

이러한 데이터를 정의하려면 renum-gem을 사용하고 레일 통합의 경우에는 has_enum-gem을 사용하십시오.

+0

renum에 정의 된 열거 형은 데이터베이스에 의해지지되지 않으므로 모든 열거 형 값을 먼저 알아야합니다. – jonnii