'작성 시간'은 '생성 시기'와 다르다. 예를 들어, '생성 시기'가 2021-02-21이지만, '작성 시간'은 똑같은 날이 될 수도 있고 그 이전 날이 될 수도 있다.
혈당일지 스키마 : 특정 혈당 일지에 대해 각 혈당 기록, 비고, 생성 시기, 갱성 시기,작성 시간은 단 하나 뿐이다.
(예를 들어 02-21에 작성한 혈당일지는 공복 혈당, 아침 점심 저녁 혈당이 단 한 개씩뿐이다.)
작성자 스키마: 하나의 작성자 ID에 대해 이름, 이메일, 역할은 단 하나씩이다. (이메일은 단 1개로 고정)
식단 스키마: 하나의 식단 ID에 대해 음식 명은 여러 개 있을 수 있다. 예를 들어 저녁 식단에 '햄', '밥', '찌개' 등의 음식명이 들어갈 수 있다.
스키마 이름도 적절하지 않아보인다. 차라리 '음식' 스키마로 바꾸고 '음식 명' 칼럼을 '이름'으로 바꾸는 게 좋아보인다.
식단 태그 스키마 : 식단 스키마를 음식 스키마로 바꾸엇기 때문에 식단 태그 스키마를 식단 스키마로 바꾸는 게 적절해보인다.
특정 시간에 작성된 한 식단에 대해 식사 시간은 유일해야 하므로 제 1정규형을 만족한다.
그리고 관계를 좀 바꿔야 한다.
특정 시간에 작성된 혈당일지 하나에 식단은 여러 개 있을 수 있기 때문에 1:N 관계 그대로가 맞다.
반면 식단 스키마와 음식 스키마는 1:N으로 바꿔야 한다. 식단 하나에 음식은 여러 개 있을 수 있기 때문이다.
식단 id(결정자) → 식사 시간(종속자)
음식 id(결정자) → 음식 이름 (종속자)
전부 인위적으로 만든 숫자 id가 기본키이기 때문에 부분적 함수 종속이 발생하지 않는다. 모두 제2 정규형을 만족한다.
(기본키가 합성키이고 합성 키의 일부 속성에 종속될 경우에만 부분적 함수 종속이 발생한다.)
x→y , y→z이면 y→z가 되는 관계(또는 기본키가 아닌 열이 변경되었을 때 다른 열에도 영향을 주는 관계)를 이행적 함수 종속이라 한다.
모든 스키마가 그러한 관계가 적용되지 않으므로 제 3정규형을 만족한다.
혈당 일지 릴레이션 내에 아침 혈당, 점심 혈당 ,저녁 혈당은 식단의 "혈당"으로 변경하는 것이 좋아 보인다.
예를 들어, 식단의 "식사 시간"을 아침으로 하고 "혈당"을 100으로 하는 게 더 좋아보인다.
또한 음식 릴레이션에서 혈당 수치를 알아보고 싶을 수가 있다. 이 경우를 따져봤을 때도 식단 릴레이션에 "혈당" 칼럼을 넣는 게 더 자연스럽다.
그렇지 않으면 이중 조인을 해야 해서 연산 비용이 증가한다.
그리고 모든 JPA 엔티티가 BaseTimeEntity라는 (생성 시기, 갱신 시기) 전용 클래스를 상속할 예정이기 때문에 모든 DB 스키마에 (생성 시기, 갱신 시기) 칼럼을 추가하였다.