사용자 도구

사이트 도구


database:sqlantipatterns

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
database:sqlantipatterns [2011/10/21 17:43]
kwon37xi [외교적 면책특권]
database:sqlantipatterns [2016/09/24 15:16] (현재)
kwon37xi
줄 15: 줄 15:
  
 ===== 순진한 트리 ===== ===== 순진한 트리 =====
-  * 목표 : 재귀적 관계를 갖는데이터를 트리나 계층적 구조로 만든다.+  * 목표 : 재귀적 관계를 갖는 데이터를 트리나 계층적 구조로 만든다.
   * 안티패턴 : parent_id 칼럼을 추가하라.   * 안티패턴 : parent_id 칼럼을 추가하라.
-  * 해법 : 다른 트리 모델을 사용하라.(생략)+  * 해법 : 다른 트리 모델을 사용하라.
   * Tip : 계층 구조에는 항목과 관계가 있다. 작업에 맞도록 이 둘을 모두 모델링해야 한다.   * Tip : 계층 구조에는 항목과 관계가 있다. 작업에 맞도록 이 둘을 모두 모델링해야 한다.
  
줄 30: 줄 30:
  
 ===== 키가 없는 엔트리 ===== ===== 키가 없는 엔트리 =====
-  * 목표 : 데이터베이스 아키텍를 단순화하고 싶다.+  * 목표 : 데이터베이스 아키텍를 단순화하고 싶다.
   * 안티패턴 : FK 제약조건 생략.   * 안티패턴 : FK 제약조건 생략.
     * 이 경우 참조 정합성을 보정하는 코드를 직접 작성하는 책임을 져야 한다.     * 이 경우 참조 정합성을 보정하는 코드를 직접 작성하는 책임을 져야 한다.
줄 36: 줄 36:
   * 해법 : 참조 정합성을 강제하는 FK를 사용하라. 데이터 정합성 오류를 찾아내 정정하는 대신, 처음부터 잘못된 데이터가 입력되지 않도록 하라.   * 해법 : 참조 정합성을 강제하는 FK를 사용하라. 데이터 정합성 오류를 찾아내 정정하는 대신, 처음부터 잘못된 데이터가 입력되지 않도록 하라.
   * Tip : 제약조건을 사용해 데이터베이스에서 실수를 방지하라.   * Tip : 제약조건을 사용해 데이터베이스에서 실수를 방지하라.
- 
 ===== 엔티티-속성-값 ===== ===== 엔티티-속성-값 =====
   * 목표 : 가변 속성 지원(보통 엔티티의 상속 구조를 표현할 때 이런 경우가 발생한다)   * 목표 : 가변 속성 지원(보통 엔티티의 상속 구조를 표현할 때 이런 경우가 발생한다)
줄 59: 줄 58:
       * 모든 서브타입에 대한 조회가 많고 공통 칼럼을 참조하는 경우가 많을 때 적합하다.       * 모든 서브타입에 대한 조회가 많고 공통 칼럼을 참조하는 경우가 많을 때 적합하다.
     * 반구조적 데이터(Semistructured Data)     * 반구조적 데이터(Semistructured Data)
-      * 단일 테이블 상속과 유사하지만 서브타입의 송석을 칼럼으로 저장하지 않는다.+      * 단일 테이블 상속과 유사하지만 서브타입의 속성을 칼럼으로 저장하지 않는다.
       * 데이터의 속성 이름과 값을 XML또는 JSON 형식으로 부호화해 TEXT혹은 CLOB 칼럼으로 저장.       * 데이터의 속성 이름과 값을 XML또는 JSON 형식으로 부호화해 TEXT혹은 CLOB 칼럼으로 저장.
       * 서브타입의 개수를 제한할 수 없고, 어느 때고 새로운 속성을 정의 할 수 있는 완전한 유연성이 필요할 때 적합하다.       * 서브타입의 개수를 제한할 수 없고, 어느 때고 새로운 속성을 정의 할 수 있는 완전한 유연성이 필요할 때 적합하다.
줄 124: 줄 123:
     * NUMERIC과 DECIMAL은 유리수가 반올림되지 않고 저장된다.     * NUMERIC과 DECIMAL은 유리수가 반올림되지 않고 저장된다.
   * Tip : 가능하면 FLOAT을 사용하지 말라.   * Tip : 가능하면 FLOAT을 사용하지 말라.
 +  * Precision and scale : http://sqlrelay.sourceforge.net/sqlrelay/programming/precisionscale.html
 +    * precision 정밀도 : 소수점 앞뒤를 모두 포함한 총 자리수
 +    * scale : 소수점 뒤 자리수
 +    * 예) 112.34 : precision 5, scale 2
  
 ===== 31가지 맛 ===== ===== 31가지 맛 =====
줄 169: 줄 172:
     * IS NULL/IS NOT NULL/IS DISTINCT FROM(피연산자가 NULL이더라도 true/false리턴, MySQL에서는 ''<=>'')     * IS NULL/IS NOT NULL/IS DISTINCT FROM(피연산자가 NULL이더라도 true/false리턴, MySQL에서는 ''<=>'')
     * 어떤 칼럼이 논리적인 디폴트 값을 가지지 않더라도 NOT NULL 제약조건이 필요한 경우는 정당하고 흔하다.     * 어떤 칼럼이 논리적인 디폴트 값을 가지지 않더라도 NOT NULL 제약조건이 필요한 경우는 정당하고 흔하다.
-    * COALESCE() 함ㅜ : 가변인수를 받아서 NULL이 아닌 첫 인수 리턴+    * [[http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce|COALESCE()]] 수 : 가변인수를 받아서 NULL이 아닌 첫 인수 리턴
   * Tip : 어떤 데이터 타입에 대해서든 누락된 값을 뜻하는 데는 NULL을 사용하라.   * Tip : 어떤 데이터 타입에 대해서든 누락된 값을 뜻하는 데는 NULL을 사용하라.
  
줄 271: 줄 274:
 ===== 마법의 콩 ===== ===== 마법의 콩 =====
   * 목표 : MVC에서 모델 단순화하기   * 목표 : MVC에서 모델 단순화하기
-  * 안티패턴 : 안티패턴은 MVC 애플리케션에서 모든 모델 클래스가 액티브 레코드(ActiveRecor) 클래스를 상속하는 관행이다.+  * 안티패턴 : MVC 애플리케션에서 모든 모델 클래스가 액티브 레코드(ActiveRecord) 클래스를 상속하는 관행
   * 안티 패턴 사용이 합당한 경우 : 프로토타이핑   * 안티 패턴 사용이 합당한 경우 : 프로토타이핑
   * 해법 : 액티브 레코드를 가지는 모델   * 해법 : 액티브 레코드를 가지는 모델
줄 278: 줄 281:
  
 이 항목은 따로 설명하면, 액티브 레코드가 나쁘다는 얘기가 아니다. 이 항목은 따로 설명하면, 액티브 레코드가 나쁘다는 얘기가 아니다.
-컨트롤러에서 DAO 혹은 액티브 레코드의 DB관련 메소드를 직접 호출하지 말라는 얘기이다. + 
-Java로 설명하면 Controller는 Service를 호출하고 Service에서 DAO를 호출해야 한다. DAO가 Controller에서 직접 호출되면 안된다. +컨트롤러에서 DAO 혹은 액티브 레코드의 DB관련 메소드(혹은 그 외의 데이터 접근에 직접 관련된 메소드)를 직접 호출하지 말라는 얘기이다. 
-이 원칙을 액티브 레코드를 사용하는 MVC 프레임워크에서도 그대로 적용하며 Controller에서 ActiveRecord의 메소드를 직접호출하지 말고 중간 모델 객체(서비스 객체)를 두라는 의미이다.+Java로 설명하면 Controller는 Service를 호출하고 Service에서 DAO를 호출해야 한다. Controller에서 DAO를 직접 호출되면 안된다. 
 +이 원칙을 액티브 레코드를 사용하는 MVC 프레임워크에서도 그대로 적용하며 Controller에서 ActiveRecord의 데이버테이스 접근 메소드를 직접 호출하지 말고 중간 모델 객체(서비스 객체)를 두라는 의미이다. 
 + 
 +====== 책 외의 다른 정보 ====== 
 + 
 +===== EXIST()를 사용할 곳에 COUNT() 사용금지 ===== 
 +  * [[https://blog.jooq.org/2016/09/14/avoid-using-count-in-sql-when-you-could-use-exists/|Avoid Using COUNT() in SQL When You Could Use EXISTS()]] 
 +  * ''exists()''로 존재만 검사할 때는 첫번째 존재에서 바로 ''true''를 리턴하면 되지만 이걸 ''count()''로 하면 전체 데이터를 모두 훑어야 하므로 당연히 느리다.
database/sqlantipatterns.1319186598.txt.gz · 마지막으로 수정됨: 2011/10/21 17:43 저자 kwon37xi