swsnu / swpp2019-team6

Triplannet helps you to share and organize your travel plans easily.
3 stars 1 forks source link

[Backend] Travel Model #63

Open dreamsh19 opened 4 years ago

dreamsh19 commented 4 years ago

issue #50 및 그동안의 논의 사항을 반영하여 아래와 같이 Travel 관련 Backend 구성하였습니다. 수정이 필요한 부분이나 개선방향이 있으면 자유로운 의견 부탁드립니다.

수정 내역

1. Travel Model

여행계획 repo를 의미 travel의 setting 관련 field. Frontend의 Travel Setting page에서 다루는 field

Field Type Detail
id AutoField django 고유 id
author User 여행계획 생성 유저(1명)
collaboraters* User 여행계획 수정 권한 있는 유저 리스트(다수, author 제외)
head TravelCommit 현재 master의 head에 해당하는 TravelCommit
fork_parent Travel fork했을 때의 original repo(fork한 repo가 아닌 경우 null)
register_time DateTime 최초 등록 시간(백엔드에서 자동저장)
last_update_time DateTime 최종 수정 시간(백엔드에서 자동저장) Recent Travel 서빙에 활용
is_public* Boolean private / public 여부, default=True
allow_comments* Boolean 댓글 허용 여부, default=True
comments Comment Travel에 달린 댓글 리스트(현재는 제외됨. 추후 Comment 모델 작성 후 추가 예정)
likes User Travel에 like를 누른 유저 리스트. Popular Travel 서빙에 활용

*는 Travel Setting page에서 유저가 수정가능한 field, 나머지는 유저가 수정불가능하고 백엔드에서 관리하는 field

2. TravelCommit Model

실질적인 여행계획 정보를 담고 있는 모델 ( 여러개의 TravelDay 로 구성) Frontend의 Travel Create page / Travel Edit page에서 수정가능한 field.

Field Type Detail
id AutoField django 고유 id
title CharField 제목
summary TextField 요약
description TextField 상세설명
start_date DateField 여행기간 시작 날짜
end_date DateField 여행기간 끝 날짜
register_time DateTimeField 최초 등록 시간(백엔드에서 자동저장)
travel Travel 해당 commit이 속해 있는 Travel id
author User Commit을 작성한 유저
tags Tag tag의 리스트현재는 제외됨. 추후 Tag 모델 작성 후 추가 예정추가완료
photo ImageField 여행사진현재는 제외됨, 추후 django imagefield 활용 추가 예정추가완료
days TravelDay 해당 commit에 속해 있는 TravelDay의 리스트

3. TravelDay Model

실질적인 여행 계획 중 하루의 계획을 담고 있는 Model ( 여러개의 TravelBlock으로 구성)

Field Type Detail
id AutoField django 고유 id
title CharField 제목
day DateField 날짜
parent_day TravelDay TravelDay가 해당 커밋에서 수정되었을 때 수정되기 전의 부모 TravelDay id.
modified Boolean 해당 커밋에서 수정되었는지 여부, 새로 만들어진 경우도 True
blocks TravelBlock 해당 TravelDay에 속해있는 TravelBlock 리스트

4. TravelBlock Model

실질적인 여행계획의 활동 단위 모델.

Field Type Detail
id AutoField django 고유 id
title CharField 제목
description TextField 상세설명
time TimeField 해당 블럭의 시간
start_location TextField 블럭의 시작 장소(TextField는 임시로 적용. Frontend의 구현에 따라 추후 수정 예정)
end_location TextField 블럭의 종료 장소
block_type CharField (with limited choices) 블럭의 활동 타입. "CUS","ACT","ACM","TRN","RST"중 하나.
parent_block TravelBlock 해당 블럭이 커밋에서 수정되었을 때 수정되기 전의 부모 TravelBlock id.
modified Boolean 해당 커밋에서 수정되었는지 여부, 새로 만들어진 경우도 True
block_type Detail
CUS Custom
ACT Activity
ACM Accomodation
TRN Transportation
RST Restaurant

Json Format Example

  {
    "id": 2,
    "head": {
      "id": 1,
      "days": [
        {
          "id": 1,
          "blocks": [
            {
              "id": 2,
              "title": "travelblock1 title",
              "description": "",
              "time": null,
              "start_location": "travelblock1 start",
              "end_location": "travelblock1 end",
              "block_type": "ACM",
              "modified": true,
              "parent_block": null
            }
          ],
          "title": "travelDay1 title",
          "day": "2019-11-01",
          "modified": true,
          "parent_day": null
        },
        {
          "id": 2,
          "blocks": [
            {
              "id": 2,
              "title": "travelblock1 title",
              "description": "",
              "time": null,
              "start_location": "travelblock1 start",
              "end_location": "travelblock1 end",
              "block_type": "ACM",
              "modified": true,
              "parent_block": null
            }
          ],
          "title": "travelDay2 title",
          "day": "2019-11-02",
          "modified": true,
          "parent_day": null
        },
        {
          "id": 3,
          "blocks": [],
          "title": "travelDay3 title",
          "day": "2019-11-03",
          "modified": true,
          "parent_day": null
        }
      ],
      "author": {
        "id": 1,
        "email": "test@test.io",
        "nickname": "test",
        "status_message": ""
      },
      "title": "travelCommit1 title",
      "summary": "",
      "description": "",
      "start_date": "2019-11-01",
      "end_date": "2019-11-03",
      "travel": 1
    },
    "author": {
      "id": 1,
      "email": "test@test.io",
      "nickname": "test",
      "status_message": ""
    },
    "collaboraters": [
      {
        "id": 2,
        "email": "test2@test.io",
        "nickname": "test2",
        "status_message": ""
      }
    ],
    "is_public": true,
    "allow_comments": true,
    "fork_parent": null,
    "likes": [
      3,
      2
    ]
  }
deploy-soon commented 4 years ago

지금 TravelBlock에 additional data로 end time도 넣고 있는데 이것도 추가하면 좋을 것 같아요. location관련 정보는 결정되면 공유할게요, 지금 관련 테이블이 있는데 그쪽으로 foriegn key 잡아서 저장하게 될 것 같긴해요

jang1suh commented 4 years ago

고생 많으셨습니다! 일단 생각나는 것들 두 가지만 말씀드리면

  1. 사소한 거긴 한데, 콜라보레이터의 정확한 스펠링은 "collaborator"라고 하네요... 나중에 스펠링 차이로 실수하는 경우가 있을 것 같아서 수정해 주시면 감사하겠습니다!
  2. TravelCommit에서 Head 이전 commit에 접근하려면 어떻게 해야하나요? issue #50에서는 TravelCommitLog로 트리 구조를 제시해 주셨는데, 복잡하진 않더라도 linked list로 commit들을 연결만 해줘도 이전 commit에 빠르게 접근할 수 있지 않을까요?

전체적으로 필요한 필드들 잘 구현해 주신 것 같아요. 감사합니다 :smiley::+1:

dreamsh19 commented 4 years ago

@deploy-soon

지금 TravelBlock에 additional data로 end time도 넣고 있는데 이것도 추가하면 좋을 것 같아요.

start time과 end time 둘다 있는건가요?? 논의 당시에는 time을 하나만 넣기로 한 것 같아서요

@RXWE

  1. 사소한 거긴 한데, 콜라보레이터의 정확한 스펠링은 "collaborator"라고 하네요... 나중에 스펠링 차이로 실수하는 경우가 있을 것 같아서 수정해 주시면 감사하겠습니다!

중요한 지적이네요. 수정하겠습니다.

  1. TravelCommit에서 Head 이전 commit에 접근하려면 어떻게 해야하나요? issue #50에서는 TravelCommitLog로 트리 구조를 제시해 주셨는데, 복잡하진 않더라도 linked list로 commit들을 연결만 해줘도 이전 commit에 빠르게 접근할 수 있지 않을까요?

지금의 구조에서는 TravelCommit에서 커밋이 속해있는 Travel id를 저장해서 해당 Travel id를 가진 TravelCommit을 조회하여 이전 커밋들을 조회할 수 있습니다. 바로 이전 커밋보다 이전 커밋 목록을 조회하는 경우가 많을 것 같아서 저렇게 했는데 혹시 부모 커밋을 저장해야하는 경우가 있을까요?

deploy-soon commented 4 years ago

네 time 하나로 관리하기로 했는데 교통편의 경우 시작지점 끝지점도 있어서 끝 시간이 없으니 뭔가 허전하더라고요. 그래서 필수 데이터가 아닌 추가 데이터 형식으로 끝 시간도 추가했는데 다루기 불편할까요?

jang1suh commented 4 years ago

지금의 구조에서는 TravelCommit에서 커밋이 속해있는 Travel id를 저장해서 해당 Travel id를 가진 TravelCommit을 조회하여 이전 커밋들을 조회할 수 있습니다. 바로 이전 커밋보다 이전 커밋 목록을 조회하는 경우가 많을 것 같아서 저렇게 했는데 혹시 부모 커밋을 저장해야하는 경우가 있을까요?

이전 커밋 목록을 조회할 때 데이터가 많아지면 전체 TravelCommit을 다 보고 해당하는 커밋들만 필터링해서 보는 방식을 사용할 경우 느려지지 않을까 싶어서요. 쿼리가 어떻게 작동하는지 잘 몰라서 상관 없을수도 있는데, 일단 저희가 커밋을 백만 개 만들 건 아니니 번거로우시면 지금 방식대로 해도 될 것 같습니다!