SQL AntiPatterns 개발자가 알아야할 25가지 SQL 함정과 해법
기억 재생을 위한 간략한 정리이다. 실질적으로 왜 해당 항목이 안티 패턴인지에 대한 구체적 이유, 구체적인 해결책은 무엇인지 등에 대해서는 책을 참조한다.
CREATE TABLE Bugs ( bug_id SERIAL PRIMARY KEY, description VARCHAR(1000), tag1 VARCHAR(20), tag2 VARCHAR(20), tag3 VARCHAR(20) );
CREATE TABLE Tags ( bug_id BIGINT UNSIGNED NOT NULL, tag VARCHAR(20), PRIMARY KEY (bug_id,tag), FOREIGN KEY (bug_id) REFERENCES Bugs (bug_id) );
ALTER TABLE Bugs ADD COLUMN hours NUMERIC(9,2);
⇔
)LIMIT 1 OFFSET :offset
으로이 항목은 따로 설명하면, 액티브 레코드가 나쁘다는 얘기가 아니다.
컨트롤러에서 DAO 혹은 액티브 레코드의 DB관련 메소드(혹은 그 외의 데이터 접근에 직접 관련된 메소드)를 직접 호출하지 말라는 얘기이다. Java로 설명하면 Controller는 Service를 호출하고 Service에서 DAO를 호출해야 한다. Controller에서 DAO를 직접 호출되면 안된다. 이 원칙을 액티브 레코드를 사용하는 MVC 프레임워크에서도 그대로 적용하며 Controller에서 ActiveRecord의 데이버테이스 접근 메소드를 직접 호출하지 말고 중간 모델 객체(서비스 객체)를 두라는 의미이다.
exists()
로 존재만 검사할 때는 첫번째 존재에서 바로 true
를 리턴하면 되지만 이걸 count()
로 하면 전체 데이터를 모두 훑어야 하므로 당연히 느리다.