2011-12-01 2 views
2

선택적 1 : 1 특성을 자체 별도 모델로 분리하는 것이 장단점입니다.레일스 ActiveRecord 및 DB 정규화

예를 들어, 난 그냥이 같은 레일 코드가 발생했습니다

class Dogs << ActiveRecord::Base 
    # :id (pk), :breed, :weight, :height, :tail_length 
end 

class DogSpotsInfo << ActiveRecord::Base 
    # :dog_id (pk), :spot_color, :avg_spot_size, :num_spots 
end 

을하지만 내가 (자리 필드가 필요 null로 떠나는)을했을 방법입니다

class Dogs << ActiveRecord::Base 
    # :id, :breed, :weight, :height, :tail_length, :spot_color, :avg_spot_size, :num_spots 
end 

상기 DB 수준, 나는 유일한 차이점은 선택적 속성을 포함하는 쿼리가 다른 조인이 필요하다고 생각합니까?

이전 접근 방식에 대한 다른 단점이 있습니까? 어떤 프로가 있습니까?

편집 : 개의 20 % 반점, 어쩌면 하나는 이전의 접근 방식은 빠른 순차적 스캔하지만 그건 만약 내가 그것에 대해 100 % 확실하지 않다, 그리고 프로 한 말을 나는 거대한 개 테이블에 생각

유일한 프로 그것은 조숙 한 최적화처럼 보인다.

제가 생각할 수있는 또 다른 직업은 모델을 더 작고 깨끗하게 유지하는 것입니다. 그러나 이것이 목표라면 아마도 DB 구조에 영향을주지 않고 has_spots :spot과 같은 것을 할 수 있을까요? 가장 좋은 방법은 무엇입니까?

+0

개인적으로 저는 ActiveRecord의 has_one 연관 유형에 대한 팬이 아닙니다. 필드의 하위 집합에 제약 조건 (예 : 호환되지 않는/허용되지 않는 열 값 조합)이있는 경우에만 의미가 있습니다. 사람들이 데이터베이스에 넓은 테이블을 두려워해서는 안됩니다. – Toshio

답변

2

모든 레코드를 하나의 테이블에 포함시키는 것이 우선적 인 방법입니다. 그것은 당신에게 크기의 비용으로 더 나은 성능을 제공합니다.

성능은 테이블의 실제 사용 방법에 따라 결정됩니다. 시스템 비싼 쿼리가 (대량 목록과 같은) 스폿 데이터를 필요로하지 않는다면, 테이블에 저장하지 않는 것이 더 빠를 수도 있지만, 필요한 데이터 만 가져 오도록 쿼리를 조정하는 테이블에 데이터를 저장하면 쿼리의 비용은 거의 전적으로

코드의 논리적 차이보다 개발자가 더 이해하기 때문에 구현 된 1 : 1 관련성을 보았습니다. 왼쪽 외부 조인은 내부 조인보다 비싸고 조인은 조인이없는 것보다 비쌉니다.

이 정보를 테이블에 보관하지 않아도 전체 데이터베이스 크기가 줄어들지 만, 대부분의 작은 응용 프로그램 (1TB 미만)에서는 성능을 위해 최적화해야합니다.

이 설정이 이상적이라고 생각하는 유일한 실제 상황은 사용자가 선택할 수있는 스폿 유형을 제한하려는 경우 또는 독자가 개의 이러한 요소에 대해 많은 처리를 한 경우입니다 .

가능한 모든 값의 찾아보기 테이블을 사용하여 동일한 구속 느낌을 얻을 수 있으며 사용자가 찾아보기 테이블의 값 중에서 선택할 수만 있습니다. 그런 다음 돌아가서 Dog 테이블에 원시 값을 삽입하십시오. 이것은 잠재적으로 웹 애플리케이션에 의해 적절히 제거되지 않은 데이터로 개 테이블을 오염시킬 수있는 부작용을 가지고 있지만, 스팟 룩업 테이블 (spot look look table)과 비교하여 어떤 데이터가 제약 조건 내에 있지 않은지를 단시간에 파악하고 수정할 것입니다 웹 응용 프로그램의 문제.

+1

재미있는 소리. 이 분야에서 얼마나 많은 경험을했는지 물어봐도 되겠습니까? –

+1

필자는 함께 일해 왔고 주요 창고 회사에서 일하는 사람들에게 훈련을 받았습니다. (그들은 사람들에 관한 수백 테라 바이트의 정보를 보관했다.) 나는 그들로부터 내 성과 편견을 대부분 얻었다. 저는 여가 시간에 차원 디자인에 관한 킴볼 (Kimball)의 저서 중 일부를 연구했습니다. 설계된 스키마에 대한 유일한 자료였습니다. 리팩토링 된 쿼리는 가장 강한 점 중 하나입니다. 저는 3 년 동안 데이터베이스 작업을 해왔지만 (아직 그리 오래는 알지 못합니다), 지금까지 매우 몰입 한 경험이었습니다. 그래서 저는 소금 한 알을 가지고 그것을 가지고갔습니다. 그러나 저는 여전히 그것이 단단한 조언이라고 생각합니다. – jTC

2

관계가 "Has-A"유형보다는 "Is-A"유형 일 때 1 : 1 관계가 자주 분해됩니다. 확장 된 ER 모델에서이를 "전문화 (specialization)"라고합니다. SQL 테이블의 세계에서는 때때로 "클래스 테이블 상속"이라는 이름이 사용됩니다. 이 주제 중 하나를 해당 주제에 대해 꽤 잘 처리 할 수 ​​있습니다.

클래스 테이블 상속은 "단일 테이블 상속"과 대비되는데, 이는 값이 부적합한 위치에 NULLS가있는 단일 테이블을 생성합니다. 이것은 Dogs and Spots의 선택과 같습니다.

"Cars"의 세계에서 특수화는 "Vehicles"에 대한 표, "Autos"에 대한 표 및 "Trucks"에 대한 표일 수 있습니다. ("Lorries"는 연못 옆쪽에있는 "트럭"이라고합니다.) 자동차 및 트럭은 특수한 유형의 차량입니다. 트럭이 아닌 트럭에 저장된 속성은 트럭이 아닌 차량과 관련이없는 속성입니다.

목적은 일반적으로 성능을 향상시키는 것이 아니라 쿼리 형식을 향상시키는 것입니다. 트럭 데이터에 관한 쿼리 만 트럭 테이블을 쿼리 할 수 ​​있습니다. 차량 데이터에 관한 쿼리 만 차량 테이블을 쿼리 할 수 ​​있습니다. 또한 차량과 트럭에 대한 데이터가 포함 된 쿼리는 일반적인 열을 통해 차량과 트럭을 연결하는보기를 쿼리 할 수 ​​있습니다.

다른 테이블과는 달리 좁은 테이블은 넓은 테이블보다 성능이 뛰어나지 만 인덱싱 및 조인에 비해 효과는 미미합니다.

클래스 테이블 상속과 "공유 기본 키"라는 기술을 결합하여 조회 할 수 있습니다. 테이블을 서로 연관시키는 다른 방법에 비해 매우 빠르고 조인이 쉽습니다. 공유 된 기본 키는 프로그램 제어하에 일반화 된 테이블의 일반 값을 적절한 특수 테이블로 전파해야하기 때문에 삽입 할 때 더 많은 작업을 필요로합니다.

내가 귀하의 사례를 수행했다면 언급 한 다양한 연료 유형에 대한 전문성을 활용할 방법을 모색 할 것입니다. 일부 쿼리는 다섯 개의 특수 테이블 (일명 "서브 클래스 테이블") 중 하나만 스캔하여 결국 5 배 빠른 속도로 실행될 수 있습니다.

0

엄청난 양의 데이터베이스가있는 경우 전자 방식은 그 다음 날이면 더 좋습니다.

값이 올지 확실하지 않은 별도의 테이블에서 항목을 분리하는 것은 항상 장점입니다. 당신의 경우와 같이 개의 개와 개 자리가 20 %의 개가 반점을 가지면 동일한 데이터베이스 테이블에 그것을 유지할 필요가 없으며 열의 80 %가 nill이 될 것이며 메인 테이블에서 많은 데이터를 검색하는 동안 반드시 서버 성능을 저해 할 수 있습니다. 데이터베이스가 작 으면 아마 하나는 두 번째 테이블을 만들 필요가 없습니다.

우리는 조인 시간 복잡성에 대해 걱정할 경우 색인 작성을 적용하여 비용을 더욱 줄일 수 있습니다.

그래서 데이터베이스가 많은 레코드가 데이터베이스에 u는 후자

갈 수있는 작은 경우 서버 비용

2)를 저장하는 이전 기술을 적용 플러스 일부 색인을 포함하는 경우 주요 지점

1) 해제 정상화의

0

장점 :

  • 각 테이블의 메모리가 적은 테이블을 차지 번 나는 데이터베이스 w 처리 된 적은 오버 헤드를 (의미 총 100MB의 데이터가있는 30K 테이블과 데이터베이스 메모리 사용량은 막대했습니다.)

  • 수동 분석은 쉽게 수행 할 수 있습니다.전자 수출 1 엑셀, Google 스프레드 시트 또는 무엇이든을 표하고 필터

    null 값을 가진 열

단점

  • 로트를 사용합니다.

많은 수의 열과 여분의 속성 테이블을 균형있게 사용하는 또 다른 방법은 iPod interation과 같이 공통적이지 않은 요소에 직렬 배열을 사용한 다음 검색 서버 (elasticsearch, websolr 등)를 사용할 수 있습니다. 전체 텍스트로 쿼리를 처리 ... 이것은 새로운 컬럼없이 Cars 테이블에 새로운 엘리먼트를 추가 할 수있게 해준다. 자가 운전 자동차,자가 주차 차량과 마찬가지입니다.

+0

답장을 보내 주셔서 감사합니다. 좋은 점 –

관련 문제