[Final Project] DB setting

hailey·2021년 4월 18일
0

FinalProject

목록 보기
3/4

지난 프로젝트를 마치면서 다음 프로젝트에서는 DB 세팅을 꼭 해보고싶다고 생각했었다. 그래서 업무분담 때 곧장 DB 세팅을 찜했었고, 고통이 시작된 것도 그때부터였을거다. 여러 관계성을 정의해줘야 하는데 정확한 가이드나 삽질의 흔적이 남은 레퍼런스를 찾기가 하늘의 별따기였다. 그 유명한 '이게 되네?' '이게 왜 안 되지?'를 반복했고, DB schema가 완성되어야 그 다음 단계의 작업을 할 수 있으니 마음의 압박도 컸던 이슈였다.
또 DB schema와 API는 프로젝트 중에도 수시로 변경되어서 정신 똑바로 붙들지 않으면 구렁텅이에 빠지기 십상이다.

  • 최종 스키마

  • one-to-many-relationship
    user - schedule_date (schedules_udate)
    user - schedule_common (schedules_ucommon)
    schedule_common - schedule_date (schedules_codate)

이때 1에 해당하는 모델은

db.relationship(연결된 객체명, backref=가상 필드명, loding relationship)

//아래는 users 모델의 실제 코드
schedules_commons = db.relationship('Schedules_common', backref='schedules_ucommon', lazy=True)

n에 해당하는 모델은

db_ForeignKey(참조할 테이블 명.필드명)

//아래는 schedules_common 모델의 실제 코드
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)

로 정의해준다.

backref가 뭐지요?
일대다의 관계에서 1에 해당하는 테이블에는 FK가 없고, N에 해당하는 테이블에는 1 테이블의 id가 FK로 설정되어 있다. 이때 1 테이블이 N 테이블에 접근하려면 역참조(backfer)가 필요하다. 속성을 추가하여 관계의 반대방향까지 정의해주는 것!

  • many-to-many relationship
    users_medicines <-> schedules_medicines

다대다 관계의 설정은 class로 각 테이블을 연결하는 방법과 db.Table을 사용하는 방법이 있다. 우리는 공식문서에서 권장하고 있는 db.Table을 사용하기로 했다.

schedules_medicines = db.Table('schedules_medicines',
    db.Column('schedules_common_id', db.Integer, db.ForeignKey('schedules_common.id')),
    db.Column('medicines_id', db.Integer, db.ForeignKey('medicines.id'))
)

timetotake = db.relationship('Schedules_common', secondary=schedules_medicines, backref=db.backref('ttt', lazy='dynamic'))

다대다의 경우, 관계 있는 테이블을 연결해주는 테이블에서 모든 설정이 이뤄진다. 위는 schedules_medicines 모델의 코드 일부다.
먼저 참조하는 양 테이블의 FK를 적고, backref로 관계를 설정한다.

  • 주의!
    다대다 관계 설정 시에는 모델의 관계를 정의할 때마다 다른 이름을 사용해야 한다. 가 테이블과 나 테이블에서 test라고 정의했다면, 가 테이블과 다 테이블은 test2나 secondtest 등으로 써주는 식이다.
profile
옳고 그름을 고민합니다

0개의 댓글