Programming/온라인 영어암기 단어장 개발

온라인 영어 암기 단어장 만들기(4) - 데이터베이스 설계하기

juhpark 2024. 12. 3. 16:42

처음부터 JOIN이 쉽지 않은 Mongo DB를 선택하여 진행하다 보니 어떤 방식의 설계가 적합할지 고민이 들었다. 물론 $lookup을 사용한 조인이 가능하기는 하지만 가장 Mongo DB의 특성을 잘 살려 구현하고 싶었다.

Mongo DB 의 데이터 디자인 방식에는 Embedding 방식과 Referencing 방식이 존재한다.

Embedding 방식은 한마디로 모든 데이터를 하나의 collection에 중첩된 형태로 다 집어 넣는 방식이고 Referencing 방식은 관계형 DB와 비슷한 방식으로 별도 collection으로 나누어 저장하는 방식을 말한다.

보통 다음의 5가지의 형태에 따라 Embedding 또는 Referencing방식을 선정한다.

One-to-One : Key-Value 선호
One-to-Few: Embedding 선호
One-to-Many: Embedding 선호
One-to-Squillions : Referencing 선호
Many-to-Many : Referencing 선호


가능하면 Embedding 방식을 사용하되, 어쩔수 없는 부분에서만 Referencing 방식을 사용하면 될것 같다. 사용자에 대한 정보와 학습에 대한 모든 정보는 하나의 Collection(user)로 설계하고, 단어에 대한 학습정보와 퀴즈정보를 저장하는 Collection(study), 단어정보를 저장하는 Collection(word)별도로 설계하려 한다.

현재까지 구상한 데이터베이스의 모습은 다음과 같다.

# user
{
	_id : ObjectId(""),
	user_id : “abc”,
	password : “12345”,
	email : “a@a.com”,
	study_set : [
		{
			title : “1월 모의고사”,
			study_cnt : 1,
			quiz_cnt : 1,
			success_rate : 90,
			word_ids : [ObjectId(""),ObjectId(""),…]
		},
	]
}
# study
{
	_id : ObjectId(""),
	user_id : "abc",
	word_id : ObjectId(""),
	study_cnt : 1,
	quiz_cnt : 1,
	success_rate : 90
}
# word
{
	_id: ObjectId(‘’),
	word : “school”,
	meaning : “학교”,
    // 기타 통계정보 컬럼
}

 

처음에는 Study(collection) 를 User 에 넣어서 설계를 했었는데, 동일한 스터디 객체를 여러 학습세트(study_set)에서 참조를 할수 있을 것 같아서 별도로 분리를 하였고, word로 분리 한 이유는 사용자마다 다른 Study(collection)정보를 저장해야 하기에 별도로 구성하는 것이 맞는 것 같다. User> study_set > word_ids 는 word의 id 값이 20~30개 정도 입력될 예정이다.  ( 실제 구현하면 맞지 않을 수도 있지만 일단은 이렇게 설계 완료 ! )

다음에는 단어를 입력하는 화면 부터 구성해 보자