hasMany 메서드에서는 sourceKey 속성에 id를 넣고, belongsTo 메서드에서는 targetKey 속성에 id를 넣습니다. sourceKey의 id와 targetKey의 id 모두 User 모델의 id입니다. hasMany에서는 sourceKey를 쓰고, belongsTo에서는 targetKey를 쓴다고 생각하면 됩니다.
foreignKey를 따로 지정하지 않는다면, 이름이 ‘모델명+기본 키’인 컬럼이 모델에 생성됩니다. 예를 들어 commenter를 foreignKey로 직접 넣어주지 않았다면 user(모델명)+기본 키(id)가 합쳐진 UserId가 foreignKey로 생성됩니다.
npm start 명령어로 서버를 시작하고 나서 콘솔을 보면 다음과 같은 메시지가 나옵니다. 시퀄라이즈가 스스로 실행하는 SQL문입니다.
콘솔
$ npm start
Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(20) NOT NULL UNIQUE, `age` INTEGER UNSIGNED NOT NULL, `married` TINYINT(1) NOT NULL, `comment` TEXT, `created_at` DATETIME NOT NULL DEFAULT now(), PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `users` FROM `nodejs`
Executing (default): CREATE TABLE IF NOT EXISTS `comments` (`id` INTEGER NOT NULL auto_increment , `comment` VARCHAR(100) NOT NULL, `created_at` DATETIME DEFAULT now(), `commenter` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`commenter`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `comments` FROM `nodejs`
시퀄라이즈는 워크벤치가 테이블을 만들 때 실행했던 구문과 비슷한 SQL문을 만듭니다(7.4.2절 참조). CREATE TABLE 뒤에 IF NOT EXISTS라고 되어 있는데, 이 부분은 테이블이 존재하지 않을 경우에 실행된다는 뜻입니다. 이미 워크벤치 또는 콘솔로 테이블을 만들어뒀으므로 구문은 실행되지 않습니다. 대신 실수로 테이블을 삭제했을 때는 위의 구문으로 인해 다시 테이블이 생성됩니다.
예제에는 사용되지 않았지만, 1:1 관계와 N:M 관계도 알아봅시다.