Coding History/project

sample DB 다시 설계

BlackBirdIT 2024. 9. 26. 00:05
CREATE TABLE `samples` (
                           `id` int(10) NOT NULL AUTO_INCREMENT,
                           `u_id` int(10) NOT NULL,
                           `istm_id` int(10) NOT NULL,
                           `reg_date` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
                           `s_name` varchar(100) NOT NULL,
                           `bpm` int(10) NOT NULL,
                           `genres` varchar(100) NOT NULL,
                           `price` int NULL DEFAULT 0,
                           `del_status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '삭제 여부 (0=삭제 전, 1=삭제 후)',
                           `del_date` DATETIME(6) NULL COMMENT '삭제 날짜',
                           `field` VARCHAR(255) NULL,
                           PRIMARY KEY (`id`)
);

CREATE INDEX `IDX_samples_u_id` ON `samples`(`u_id`);
CREATE INDEX `IDX_samples_istm_id` ON `samples`(`istm_id`);

우선 프로젝트 처음에 준비를 해뒀던 DB 테이블인데 만들어보려고 생각중에 음악을 만들 때 사용하는 샘플 종류가 있다는게 떠올랐다.

one-shot과 loop 개념.

말 그대로 one-shot을 직독직해하면 한번만 쏜다. 한번의 소리만 들린다 이고, loop는 다양한 소리들이 loop의 형태로 사용할 수 있게 하는 개념이라고 생각하면 쉽다.

loop는 드럼의 패턴일 수도 있고 드럼들과 다른 악기들이 종합된 형태일 수 있으며, 또 그냥 코드의 정렬일 수도 있고(여기서 말하는 코드는 음악에서의 코드다), 멜로디만 구성되어있을 수도 있다. 즉 loop의 바리에이션은 넓다.

근데 one-shot은 그게 아니다. 드럼의 킥 사운드, 스네어, 심벌즈 등이 한번만 찍는 소리고 작곡가가 무한하게 가공 및 조합해서 사용할 수 있게끔 제공한다. 또, 사운트 효과로 분류되는 FX의 개념도 one-shot인 경우가 많다.

그래서 이걸 왜 말하냐고?

bpm이 not null로 선언되면 안된다는 것을 길게 말한 것이다. one-shot은 반드시 bpm의 개념이 필요하지 않다. 왜? 한번만 소리가 찍힐테니까 90bpm의 곡에서도 200bpm의 곡에서 사용할 수 있으니까. 근데 또 one-shot이지만 길게 쓸 수 있는 one-shot 샘플도 존재한다. 이 경우에는 one-shot임에도 불구하고 bpm이 필요할 수도 있다. 그러니까 결론은 bpm이 not null이면 안된다는 것과, one-shot인지 아닌지 구분할 수 있는 칼럼이 지금 이 테이블에 필요하다는 것이 결론이다.

그래서 이렇게 변경.

-- samples 테이블 생성
CREATE TABLE `samples` (
                           `id` int(10) NOT NULL AUTO_INCREMENT,
                           `u_id` int(10) NOT NULL,
                           `istm_id` int(10) NOT NULL,
                           `reg_date` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
                           `s_name` varchar(100) NOT NULL,
                           `bpm` int(10) NULL,  -- BPM 필드는 NULL 가능하게 변경
                           `genres` varchar(100) NOT NULL,
                           `price` int NULL DEFAULT 0,
                           `is_one_shot` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'one-shot 여부 (0=아님, 1=one-shot)',
                           `del_status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '삭제 여부 (0=삭제 전, 1=삭제 후)',
                           `del_date` DATETIME(6) NULL COMMENT '삭제 날짜',
                           `field` VARCHAR(255) NULL,
                           PRIMARY KEY (`id`)
);

CREATE INDEX `IDX_samples_u_id` ON `samples`(`u_id`);
CREATE INDEX `IDX_samples_istm_id` ON `samples`(`istm_id`);

is_one_shot 칼럼 추가와 bpm null 허용! 이게 결론이다.