2021 04 10 - sql Antipatterns 반올림 오류 소수를 가지고 계산해야 할때 당연히 컬럼의 속성을 FLOAT로 했는데, 계산결과 오류가 발생했다. 왜일까. 안티패턴 FLOAT 데이터 타입 사용 SQL의 FLOAT타입은 다른 프로그래밍 언어와 마찬가지로 실수를 이진형식으로 부호화 한다. 필요에 의한 반올림 십진수로 표현된 모든 수르 이진수로 표현할 수는 없다 어떤 수는 사용자의 의도와는 상관 없이 반올림 되어야 한다. 예를들어 3.333333.. 컴퓨터의 해결책은 바로 유한소수를 사용하고, 3.333과 같이 원래의 값에 가까운 값을 선택하는것이다! 안티패턴 : SQL에서 FLOAT 사용 예를들어 아래 쿼리는 59.59를 리턴한다. SELECT hourly_rate FROM Accounts WHERE account_id = 123; 하지만 F.. 2021. 4. 10. 2021 04 07 - sql Antipatterns 다형성 연관을 사용하는 테이블 다형성 연관 이슈트래킹 시스템에는 BUG도 올릴 수 있고, 새로운 FEATER를 요청 할 수도 있다. 그리고 각각에 댓글도 달 수 있겠지.. 또한 책에서는 BUG 테이블과 FEATER 테이블이 각각 만들어져 있다는것에 주목하자. 그리고 저자는 BUG의 댓글과, FEATER의 댓글을 하나의 Comment테이블에 관리하고 싶어한다! CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, bug_id BIGINT UNSIGNED NOT NULL, author_id BIGINT UNSIGNED NOT NULL, comment_date DATETIME NOT NULL, comment TEXT NOT NULL, FOREIGN KEY (author_id) REFERENCES.. 2021. 4. 7. 2021 04 06 - sqlAntipatterns 두개 이상의 테이블이 거의 유사한 구조를 가질때 엔터티-속성-값 예를들어, 날짜별로 버그리포팅의 개수를 센다고 가정하자. 아래의 쿼리를 가장 먼저 떠올릴것이다. SELECT date_reported, COUNT(*) FROM Bugs GROUP BY date_reported;하지만 날짜가 서로 다른 형식으로 저장되어 컴퓨터에서 두 날짜를 비교 할 수 없다면 어떻게 될까? 또는, BUG와 FEATER 두개의 테이블이 있는데, 이 테이블 두개는 거의 비슷한 컬럼구조를 가진다. 왠지 하나로 합치고싶은 느낌적인 느낌이 들것이다. 목표: date_reported가 형식이 여러개여도 의도한대로 동작하게 하자! 안티패턴 : 범용 속성 테이블 사용. 이 설계는 엔터티-설계-값 또는 줄여서 EVA로 불린다. 별도 테이블을 생성해 속성을 행으로 저장. 각 행은 세개의 .. 2021. 4. 6. 2021 04 06 - PK를 어떻게 잡아야 하지! PK 중복행 방지하기 목표: PK 관계 확립 PK는 테이블 내의 모든 행의 유일함을 보장하기 때문에, 각 행에 접근하는 논리적 매커니즘이 된다.(인덱스를 말하는듯?) 중복행이 저장되는것을 방지한다. 만약 PK를 누락하지 않고 테이블을 생성했다고 가정하자. 새로운 컬럼을 추가해서 아무런 의미를 가지지않는 임의의 값을 넣어서 PK처럼 사용한다고 했을때, 이런형태의 컬럼을 가상키, 또는 대체키라고 한다. 안티패턴 : 아무 생각없이 테이블에 id를 PK로 넣지말라구! pk와 비슷하게 사용되는 키가 만들어질지도 모르니까 말이야. CREATE TABLE Bugs ( id SERIAL PRIMARY KEY, bug_id VARCHAR(10) UNIQUE, --bug_id는 UNIQUE해서 pk처럼 동작하고 있는걸. .. 2021. 4. 6. 2021 04 06 - Sql Antipatterns 계층구조 만들기 - 클로저테이블 클로저 테이블 클로저 테이블 클로저 테이블은 다른 트리모델과는 달리, 트리의 모든 경로를 데이터와 분리하여 별개의 테이블에 저장한다. 이 테이블에는 자기자신을 참조하는 행을 포함한, 트리의 조상, 자손 관계를 가진 모든 노드 들의 관계를 한 행으로 저장한다. 그러니까 자기 자신을 기준으로 자신의 자손노드 전부를 한 행으로 갖는다. CREATE TABLE TreePaths( ancestor BIGINT UNSIGNED NOT NULL, descendant BIGINT UNSIGNED NOT NULL, PRIMARY KEY (ancestor, descendant), FOREIGN KEY(ancestor) REFERENCES Comments(comment_id), FOREIGN KEY(descendant) R.. 2021. 4. 6. 2021 04 05 - sql Antipatterns 댓글의 댓글의 댓글의 댓글.... 이번 안티패턴에서는 깊이의 제한이 없는 댓글타래를 구현한다고 가정하자. 여담으로 댓글의 댓글은 예전부터 어렵게 생각했었던 기능인데 이번기회에 구현방법을 알게되어서 뿌듯하다 무야호 목표 계층구조 데이터를 저장 및 조회하기 안티패턴 parent_id칼럼을 추가하는것은 안티패턴이다. 왜냐 항상 부모에 의존하기 때문 이 컬럼은 자기 자신을 FK로 참조해서 항상 부모를 갖게된다. 인접 목록에서 트리 조회하기(특정 댓글의 대댓글 조회!) select c1.*, c2.* from comments c1 left outer join comments c2 -- left 조인과 left outer조인은 같다. on c2.parent_id = c1.comment_id 그러나 이 쿼리는 2단계.. 2021. 4. 6. 이전 1 ··· 5 6 7 8 9 10 11 ··· 47 다음