데이터베이스 정규화의 중요성

2024년 5월 28일 화요일

Today I Learned

날짜

2024년 5월 28일 화요일

내용

정규화와 연관된 데이터 업데이트

리스트 디자이너 고도화작업을 시작했다. 이전에 개발된 것에서 문제를 찾았는데, 상품 정보가 변경되어도 곧바로 리스트 디자이너 위젯에 적용되지 않는다. 우선 이 부분을 해결하려 했다. 계획상으론 그리 어렵지 않았는데, 웹훅을 이용해 상품이 업데이트 될 경우 그 상품이 ListDesignerProduct 에 연관된 데이터가 존재할 경우 그 데이터도 업데이트 시켜주면 될거라 생각했다.

하지만 예상치 못한 곳에 빠져 고민이 생겼다.

  1. 필요한 데이터는 product가 아닌 product_variants에 있다.

    product_variant는 상품에 옵션이 적용된 구체적인 데이터이다. 쇼피파이에서 모델명이 A인 상품이 있다고 가정하면 이 상품에 대한 정보는 product 라는 객체다. 여기에 사이즈, 색깔 등 옵션이 선택되면 그 객체는 product_variant가 된다. 옵션 항목, 가짓수에 따라 갯수는 천차만별이다. 리스트 디자이너에서 필요로 하는 상품 데이터는 상품 이미지와 상품의 할인 전후 가격이다. 이미지는 product 객체에 있지만 가격은 product_variant에 있다.

  2. product_variant와 list_designer_product는 모두 product에 연관되어 있다.

    쇼피아이에서 웹훅을 통해 데이터가 들어온다. 이때, product 테이블에서 필요한 정보를 찾아 업데이트하고 저장한다. 그리고 product_variant에서 필요한 데이터를 찾아 저장한다. 따라서, 두 테이블 모두 업데이트 되고 나서 list_designer_product 테이블이 업데이트 되야 한다. 구현 자체로는 어렵지 않을 수 있으나 상당히 복잡해질 가능성이 있다. product_varaint를 이용해 product를 찾고, 다시 연관된 list_designer_product를 찾아서 업데이트 해야한다. 최대한 데이터베이스 탐색을 줄이고 싶은데 어떻게 해야할지 머리가 꼬인다.

정규화는 데이터베이스 내에서 중복된 데이터를 최소화하는 것을 의미한다. 지금처럼 필요한 데이터를 가져와 저장하지 않고, 애초에 list_designer_product가 매번 product와 연관된 product_variant를 조인해서 달고다니는게 효율적이 였을까? 데이터를 사용할때야 저장해두니 편하게 썼지만 막상 중복된 데이터가 존재하니 업데이트에서 여러모로 혼란이 생긴다. 왜 정규화가 필요한지 확실히 느꼈다..

아무래도 현재 최선은, 가장 중심이 되는 후보키인 product_id를 기준으로 필요한 데이터만 취하고, 그 데이터를 이용하는 함수를 하나 추가하는것 같다. 웹훅에서 상품이 업데이트될 때 들어오는 데이터 형식을 직접 봐야 해결되지 않을까

회고

구조를 잘 짜자.