2013-02-12 4 views
0

매일 다른 자원의 조합에 대한 값을 추적해야합니다. 그래서이 작업을 수행하는 테이블이 보일 수 있습니다 같은 :복합 키의 수직 분할

res5에 이르기까지 res1는 해당 테이블에 대한 foreign 키입니다
CREATE TABLE `data` (
    `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT, 
    `datetime` DATETIME NOT NULL, 
    `res1` INT UNSIGNED NOT NULL, 
    `res2` INT UNSIGNED NOT NULL, 
    `res3` INT UNSIGNED NOT NULL, 
    `res4` INT UNSIGNED NOT NULL, 
    `res5` INT UNSIGNED NOT NULL, 
    `value` DECIMAL(10,0) NOT NULL, 
    UNIQUE INDEX `datetime_res1_to_res5` (`datetime`, `res1`, `res2`, `res3`, `res4`, `res5`) 
) 

.

이 표에는 많은 행이 들어있어 쉽게 2,000 만 개가됩니다.

CREATE TABLE `data` (
    `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT, 
    `datetime` DATETIME NOT NULL, 
    `superKeys_id` INT UNSIGNED NOT NULL, 
    `value` DECIMAL(10,0) NOT NULL, 
    UNIQUE INDEX `datetime_superKeys_id` (`datetime`, `superKeys_id`) 
) 

CREATE TABLE `superKeys` (
    `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT, 
    `res1` INT UNSIGNED NOT NULL, 
    `res2` INT UNSIGNED NOT NULL, 
    `res3` INT UNSIGNED NOT NULL, 
    `res4` INT UNSIGNED NOT NULL, 
    `res5` INT UNSIGNED NOT NULL, 
    UNIQUE INDEX `res1_to_res5` (`res1`, `res2`, `res3`, `res4`, `res5`) 
) 

data : 나는 그래서 같은 두 개의 테이블을 가지고 있도록, 별도의 테이블에 외래 키의 조합을 넣어하는 경우는 내가의 궁금 무엇

이다. superKeys_idsuperKeys의 외래 키입니다. id.

이렇게하면 테이블 크기가 크게 줄어 듭니다. 그러나 내가 모르는 이유로 나쁜 생각 일지 모르겠다. 분명히 select는 데이터의 붕괴를 가져 오기 위해 조인을 필요로 할 것이고 이것은 약간의 오버 헤드를 추가 할 것이지만 이것이 문제가 될 것이라고 생각해서는 안됩니다.

제 실제 상황에서는 리소스 중 하나가 user_id이고 자주 사용자의 값을 합산해야하므로 superKeys 테이블의 일부가 아닌 data에 이러한 열을 유지하는 것이 좋습니다. 모든 쿼리에 참여하지 않아도됩니다. 그런 다음 다른 자원에 대한 값을 더 적게 합산해야하는 경우에만 조인을 사용하십시오.

+0

대용 암호 키'id'를 모두 생략 할 수 있습니까? res1 ... res5가 자연스러운 고유 키이면 다른 키가 불필요합니다. – wildplasser

+0

5 개보다 많거나 적은 리소스를 비교해야합니까? 이것은 고도로 비정규 화 된 스키마처럼 보입니다. –

+0

예, 테이블의 "핫"절반에 대한 I/O를 최소화하기 위해 수직 분할을 수행 할 수 있습니다. 그러나 이것은 대용량 테이블에 대해서만 의미가 있으며, 2 천만 개는 @Catcall (너무 웅변으로 설명) (http://stackoverflow.com/a/14823645/533120) (+ 그에게 1). –

답변

1

데이터의 크기가 줄어들지 않습니다. 하나의 테이블에 2,000 만 행의 데이터를 저장하고 다른 테이블에는 2 천만 행의 수퍼 키를 저장해야합니다.

5 개의 정수는 40 바이트입니다. 2 천만 - 800 메가 바이트를 곱하고 날짜 시간 열과 소수를 곱합니다. 이 테이블 전체가 내 넷북의 RAM에 맞을 것입니다.

"데이터"테이블을 유지하십시오. 대리 키를 버리십시오.

+0

슈퍼 키에 값 열을 넣은 예제에서 실수가있었습니다. 1 일에 res1 ~ res5 만 10,000 조합이 있고 2 일에 10,000 만개의 고유 조합이있을 수 있지만 함께 2 일 동안 만 12,000 개의 고유 조합 만있을 수 있습니다. 확실히 2 만 개가 아닙니다. 따라서 '데이터'에는 2 만 줄이 있지만 '수퍼 키'에는 12,000 줄 밖에 없다. – user2045006

관련 문제