레일즈 애플리케이션에는 사용자 데이터가 들어있는 다양한 데이터베이스 테이블이 있습니다. 이 테이블 중 일부는 많은 행을 가지며 (경우에 따라 사용자 당 500,000 행까지) 자주 질의됩니다. 어떤 테이블이라도 쿼리 할 때마다 현재 사용자의 user_id는 쿼리의 어딘가에 있습니다. 테이블과 사용자가 직접 관계가 있거나 직접 다른 테이블을 통해 관련이있는 경우 조인을 통해 테이블에 연결됩니다.user_ids를 정규화하거나 정규화하지 않기 위해서
더 빠른 성능을 위해 user_id를 비정규 화하여 모든 테이블에 포함시켜야합니까? 그래서,
- 주소가 사용자에 속하고,
- 봉투 사용자에 속하는 USER_ID을 가지고 있으며,
- AddressesEnvelopes는 주소와 봉투를 연결하는 USER_ID 있습니다
여기에 하나의 예입니다 그것은 envelope_id와 address_id를 가지고 있습니다 - 그것은 user_id가 없지만 봉투 나 주소 (동일한 사용자에 속해야 함)를 통해 접근 할 수 있습니다.
하나 개의 일반적인 고가의 쿼리는 내가 그 테이블에서 아무것도 필요하지 않더라도, 주소 또는 봉투 중 하나와 결합하여 수행 할 수있는 특정 사용자에 대한 모든 AddressesEnvelopes을 선택하는 것입니다. 아니면이 테이블에 사용자 ID를 복제 할 수 있습니다. 여기
다른 시나리오입니다 :
- 편지 사용자에 속하고,
- 수령인이 편지에 속하는 USER_ID을 가지고 있으며,
- RecepientOption가 수령인에 속하는 letter_id을 가지고 있으며,이 있습니다 recepient_id
수신자와 수신자 모두에서 user_id를 복제하는 것이 합리적일까요? 비록 내가 항상 편지를 통해 협회를 통해 올라갈 수있는 옵션을?
일부 노트 :
- 는 사용자간에 공유되는 물건이 결코 없습니다. 관련 개체의 전체 은 항상 은 (는) 같은 사용자에게 속합니다.
- 개체의 사용자 소유자가 변경되지 않습니다.
- 데이터 집약적 인 응용 프로그램이기 때문에 데이터베이스 성능이 중요합니다. 많은 쿼리와 많은 테이블이 있습니다. 인덱스를 만들 때
그래서 모든 테이블에 user_id를 포함해야한다 그래서 그것을 사용할 수 있습니까? 아니면 나쁜 디자인일까요?
고마워, 롤랜드. 그게 정확히 내가하고 싶은 생각이야.아마도 나는 사용자 테이블 내에서 다른 테이블로 데이터를 역 정규화하지 않기 때문에 사용하는 잘못된 단어입니다. user_id를 다른 키를 통해 user_id에서 가져올 수있는 테이블의 키로 포함하는 것만으로 (예 : 주소 또는 봉투를 통해 user_id를 얻을 수있는 address_envelopes 예제). 클러스터 된 인덱싱 및 사용자 별 테이블/머신 간 데이터 파티셔닝은 훌륭한 아이디어입니다! –