uncategorized

기자재 대여 데이터베이스 설계

프로젝트 소개

기리기리 프로젝트는 광운대학교 미디어커뮤니케이션 학부 기자재 및 랩실 대여 관리 웹 서비스이다.
기리기리 프로젝트는 다음과 같은 기능을 제공한다.

  • 기자재 랩실 정보 조회
  • 특정 날짜에 기자재 대여 가능 갯수 조회
  • 대여 상태 관리
  • 대여 취소
  • 특정 날짜에
  • 회원 관리
  • 페널티 관리
    등등…

테이블 후보 찾기

데이터베이스의 테이블이 될 후보를 찾아본다. 테이블 후보는 요구사항에서 추출할 수 있다. 예를 들어

사용자는 기자재의 이름, 카테고리, 사용법을 조회할 수 있다.

이런 요구사항이 있다고 가정하자. 그러면 우리는 여기서 대상과 특징을 추출할 수 있다. 위 예시에서는 사용자와 기자재가 대상이 되고 이름, 카테고리, 사용법은 특징이 된다.

요구사항으로 추출된 테이블 후보는 다음과 같다.

1
관리자, 기자재, 랩실, 대여, 페널티

도메인에 대해 더 살펴보기

하지만 아직 부족하다. 단순히 요구사항에서 자주 등장하는 단어만으로 테이블로 요구사항을 다 구현할 수 없다. 그래서 좀 더 구체적으로 대여 도메인에 대해 이해해보자.

  1. 기자재는 추상적인 개념이다.
    일반적으로 기자재를 대여한다고 하지만 실제로는 기자재는 하나의 개념에 가깝다. 동일한 모델의 물리적인 장비가 여러개가 있다. 여기서 모델은 추상적인 개념이고 실제 장비는 현실세계에서 물리적으로 관리되는 개념이다. 우리는 추상적인 개념을 기자재로 취급하고 물리적인 장비의 개념은 품목이라는 테이블로 관리하기로 했다.
  2. 담은 기자재를 따로 테이블로 분리한다.
    우리 서비스에서 기자재를 담을 때 특정 기자재와 대여 갯수, 대여 기간등을 저장해야 한다. 대여와 비슷한 모습이 되지만 담은 기자재와 대여의 생명주기가 크게 다르다.
  3. 대여는 예약과 대여로 나눠질 수 있다.
    사용자는 대여를 신청한다고 하지만 실제로는 미래에 대여할 것을 예약하는 개념이다. 그래서 대여를 예약하는 행위와 대여를 실제로 사용자가 수령하고 반납하는 행위를 분리해야 한다.
  4. 대여 예약은 또 대여 예약 상세로 나눠질 수 있다.
    예약을 할 때 구체적으로 어떤 기자재를 몇개를 어떤 기간 동안 대여할 지를 다루는 테이블과 그 대여 예약에 대한 공통적인 정보를 모은 테이블을 분리해야 한다.

이렇게 해서 테이블을 다음과 같이 설계했다.
자산, 담은 기자재(인벤토리), 품목, 사용자, 페널티, 대여 예약, 대여 예약 상세, 대여 상세

각 테이블 상세 설계

자산 (기자재, 랩실)

대여 대상이 되는 것들에 대한 정보를 관리한다. 앞서 말했듯이 현실세계에서 물질적인 것을 말하는 것이 아닌 추상적인 개념을 의미한다. 대신 특정 자산의 대여 가능 갯수를 판단하는 집계 칼럼을 포함한다. 이를 통해 쿼리 비용을 줄일 수 있다.

그리고 기자재와 랩실은 dtype으로 구분한다. 어플리케이션에서 기자재와 랩실 엔티티가 이 기자재 테이블에서 비롯된다. 즉 단일 테이블로 다형성이 구현된 예시다. 단일 테이블로 다형성을 구현하면 자산 단위 조회 시 조인 비용이 줄어들고 ID에 의존하는 다른 테이블이 있다면 ID의 유일성을 구현하기가 유리하다. 다만 단일 테이블로 다형성을 구현하는 경우에는 불필요한 칼럼이 모이게 되는데, 현재 상황에서는 수많은 타입으로 구현해야 하지 않아도 된다고 판단해서 구현이 편리한 단일 테이블 방식을 선택했다.

품목

현실 세계에서 기자재의 물리적인 장비들을 의미한다. 자산 번호를 가지고 기자재에 의존한다. 각 장비 운용 가능 여부를 책임진다. 애플리케이션에서 품목의 운용 가능 여부에 따라 기자재 테이블의 대여 가능 갯수를 조절한다.

담은 기자재

기자재를 특정 기간동안 특정 갯수를 대여 예약하기 전에 장바구니에 담는 개념이다.

회원

기리기리 서비스를 이용하는 사람들을 의미한다. Role 칼럼을 통해 사용자(일반 학생)과 조교(관리자)를 구분한다.

대여 예약과 대여 예약 상세

사용자가 추후에 대여할 기자재를 예약한 데이터를 의미한다. 대여 예약과 대여 예약 상세는 일대다 관계이다. 대여 예약은 예약 신청한 사용자의 정보를 가지는데, 이때 신청자의 이름, 연락처 등을 기존 회원 정보와 다르게 입력할 수 있어서 해당 데이터를 관리하도록 했다.

대여 예약 상세는 예약 기간, 예약 갯수, 예약할 자산을 나타낸다. 그리고 대여 예약과 대여 예약 상세는 status로 상태를 가진다. 어플리케이션에서 대여 예약은 대여 예약 상세의 상태들을 기반으로 상태가 변경되도록 구현했다.

대여 상세

대여 상세는 현실 세계에서 실제로 사용자가 대여를 시작했을 때 생성되는 데이터이다. 대여 수령 시각과 대여 반납 시각을 다룬다. 특이한 점은 대여 상세는 현실 세계의 대여를 다루다보니 품목의 정보를 알아야 한다. 그래서 propertyNumber를 갖도록 했다. id를 통해 의존해도 되지만 대여 상세를 조회할 때 propetyNumber를 대부분 같이 조회하고 품목의 자산번호가 변경되는 일이 희박해서 해당 칼럼으로 의존하도록 했다.

대여 상세는 회원, 대여 예약, 대여 예약 상세와 일대다 관계이다.

페널티

반납을 잘못한 회원의 경우 일정 기간 동안 대여를 막아야 한다. 페널티 테이블에서 사용자의 패널티 기간을 다룬다.

Share