안녕하세요.
이번에 새로운 기능을 추가하는 데 있어서 테이블 설계에 대해 고민을 하고 있습니다.
예를 들어서 설명드리면,
A라는 남성이 집에 도어락(비밀번호로 문을 여는 역할)을 설치하였습니다.
해당 도어락의 비밀번호는 매일매일 바뀌고, 어플리케이션 쪽에서 바뀐 비밀번호를 A남성에게 알림으로 알려주게 됩니다.
오늘 날짜가 2019-01-23 이라고 하면, 과거인 비밀번호 (2019-01-22)는 필요없게 됩니다. 로그로써 남기는 게 나을 거 같긴 합니다...
lock이 도어락 테이블이라고 치면, lock_password라는 테이블을 생성하고
lock_id(도어락 테이블 PK), today_date(오늘 날짜) 을 PK로 두고
password 칼럼을 두려고 합니다.
CREATE TABLE `lock_password` ( `lock_id` int(10) unsigned NOT NULL COMMENT '[lock ID]', `today_date` date NOT NULL COMMENT '[target date]', `password` varchar(10) NOT NULL COMMENT '[pw]', PRIMARY KEY (`lock_id`, `today_date`) ) ENGINE=InnoDB
위 테이블을 가지게 되면 과거의 데이터도 계속 가지게 되는 데... 좋은 방법이 없을까요?
###
생각해본 방법으로는
1. lock_password 에 새로운 날짜의 데이터가 들어오면 트리거를 이용해서 로그 테이블로 과거 데이터를 옮긴 뒤 인서트 한다.
(이 방법은 lock_password에 과거 데이터는 보이지 않지만, 내부적으로는 남아있기 때문에 디스크 사이즈를 위해 optimize를 실행해줘야 하는데 테이블 락이 걸린다)
2. lock_password 에 년마다 파티션을 걸어서 정기적으로 로그 테이블로 옮긴다
(이 방법 또한, 옮기고 난 후 내부적으로 남아 있기 때문에 디스크 사이즈가 줄지 않으므로 opmizite를 실행해줘야 한다...)
감사합니다!
제가 말씀 드리고 싶은 점을 잘 전달 못해드린 거 같네요... 죄송합니다.
예를 들어서 설명드리면,
2018-01-23 비밀번호는 today_password에 들어가 있습니다.
내일(1월 24일)이 되면 today_password 에 들어있는 2018-01-23 비밀번호는 past_password로 이동하겠죠?
이동 시킨 뒤 today_password에 저장되어 있던 2018-01-23 비밀번호를 삭제합니다.
검색 시 today_password에 2018-01-23 비밀번호는 보이지 않지만 내부적으로 아직 존재합니다.
그러므로 디스크 사이즈 또한 줄어들지 않습니다...
접근방법이 다른 방법인데요.
해시함수 같은 것을 이용한 펑션을 만들면 로그를 남길 필요가 없을 것 같은데요.
사용자별로 유니크한 KEY를 할당하고, 해당 사용자 KEY + 일자를 입력값으로 하는 해시함수를 만드는 겁니다.
그러면 데이터를 따로 저장할 필요도 없고 과거 이력도 조회해 볼 수 있으니 좋을 것 같은데요.
예) 사용자 A : KEY001, 사용자 B : KEY002
사용자 A의 2019-01-23일 패스워드를 조회시
ㅇ 입력값 : KEY00120190123
ㅇ 출력값 : 해시값
사용자 A의 2019-01-22일 패스워드를 조회시
ㅇ 입력값 : KEY00120190122
ㅇ 출력값 : 해시값