본문 바로가기
MYSQL

데이터모델링_트랜잭션_savepoint

by kcj3054 2022. 9. 23.

duplicate

  • duplicate는 조심해야한다 만약 INSERT를 할 때 실패를 했고 on duplicate key update dname ='서버팀2'를 한다면 row를 두번타게된다..
INSERT INTO Dept (PID, dname ) VALUES (2, '서버팀')
ON duplicate key update dname ='서버팀2' 
  • 위대로 한다면, 중복값으로 값이 못들어가서 실패 그후에 dname을 서버팀2로 들어가게된다 이럴때 pk값이 1개를 건너 뛰게된다.

transaction, savepoint

  • select @@autocommit 에서 autocommit이 1이라면 true이다..

start transaction;

select * from Dept  where id in(1,2);

SAVEPOINT SA1;
update Dept set dname='영업부서' where id = 1;

commit;
rollback  TO SAVEPOINT SA1;
  • start transaction을 하게된다면 auto commit이 잠시동안 false로 된다..

데이터 모델링 간단 정리.

  • 테이블에 데이터가 너무 많아서 group by를 할 때 시간이 걸리게 된다면 group by할 컬럼을 미리 만들어 놓는 것도 성능향상에 있다, group by하는 것도 시간이 걸리기 때문이다.

  • pk가 가장 중요하다, 유일 값을 갖는 기본키가 필수이다, 변경이 된다면 큰일,,, 제가 테이블 characterItem 테이블을 만들었던 적이 있습니다. 그때 스미가

CREATE DATABASE IF NOT EXISTS RedDB;
USE RedDB;

DROP TABLE IF EXISTS RedDB.`CharacterItem`;
CREATE TABLE IF NOT EXISTS RedDB.`CharacterItem`
(
    CharacterItemId BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '고유 번호',
    CharacterId BIGINT NOT NULL COMMENT '소지한 캐릭터 번호',
    Code INT NOT NULL COMMENT '마스터 아이템 데이터의 Code 값',  
    Status INT DEFAULT 0 NOT NULL COMMENT '상태 (ex : 파괴, 장착)',
    CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '생성 날짜'
) COMMENT '캐릭터 보유 아이템'; 
  • 라고 존재했었는데, 여기서 저는 characterId로 아이템 테이블에 접근을 했습니다. 그런데 캐릭터아이템ID를 주키로 잡아버리면 모든 ROW들을 다 검사를 해야한다. 내가 찾는 것은 캐릭터ID라서... 그래서 해결 방법은 주키를 캐릭터ID로 했거나 아이템ID랑 캐릭터ID를 조합해서 주키로 사용을 했어야했다... 조심. ..

컬럼은 비싸다..

  • 데이터를 정의할 때 컬럼은 비싸다 그래서 ROW로 변경을 할 수 있다면 변경하는 것이 이득..

적절한 정규활를 하자.

  • 정규화의 목표는 중복데이터를 지우는 것이다. 또한 NULLABLE 할 필요가 없다면 NOT NULL를 넣어두자..

  • 테이블에서 예를 들어서 물건 테이블과 임차인 테이블이 존재햇을 때 임차인이 사라졌으면 물건 테이블에서도 해당 임차인에 대한 정보를 삭제해줘야한다. 외래키를 걸어 CASCADE DELETE를 하면 연관된 것이 지워지지만 관계를 걸지 않으면 참조 무결성이 깨져버린다..

'MYSQL' 카테고리의 다른 글

MYSQL VERSION 확인  (0) 2023.10.05
partition / index 타기 (정리 예정)  (0) 2022.09.18
InnoDB VS MyISAM, 인덱스 최적화, 쿼리 최적화  (0) 2022.09.17