둘 다 데이터를 쪼개는 거임.
하나의 테이블에 다 담을 수 없다거나…
아니면 테이블이 아닌 별도의 노드에서 관리하는 경우(redis, kafka 등등)
노드의 트래픽을 분산해서 성능을 향상시키는 이점이 존재.

아래와 같은 데이터가 있다고 가정.

1
2
3
4
5
6
id | name | hobby
------------------
1 | ygs | sleep
2 | yks | coding
3 | exo | soccer
4 | bud | write

샤딩 (Horizontal Partitioning)

아래와 같이 특정 샤드키를 가지고 쪼개서 저장하는 걸 의미

1
2
3
4
id | name | hobby
------------------
1 | ygs | sleep
2 | yks | coding

1
2
3
4
id | name | hobby
------------------
3 | exo | soccer
4 | bud | write

샤드키를 제대로 지정하지 않으면 특정 테이블(혹은 노드)에 데이터가 몰려 핫스팟이 형성됨.
또한 테이블(혹은 노드)가 늘어나거나 줄어들 수도 있으므로 이에 대비해서 샤드키를 잘 선정해야함.
두 개의 테이블에서 데이터를 조회해야할 수도 있으므로 단점으로 작용할 수도 있음.

카프카에서는 이 방식을 파티셔닝이라고 칭함.

파티셔닝 (Vertical Partitioning)

아래와 같이 특정 컬럼들을 쪼개는 걸 의미

1
2
3
4
5
6
id | name 
----------
1 | ygs
2 | yks
3 | exo
4 | bud
1
2
3
4
5
6
id | hobby
-----------
1 | sleep
2 | coding
3 | soccer
4 | write

자주 조회하는 컬럼을 쪼개는 것도 나쁘지 않음. (혹은 보안 이슈 때문에 쪼개놔야하거나…)
이렇게 해놓으면 조인이나 RDB의 장점을 살리기 힘들거나 더 많은 쿼리를 날려야할 가능성이 있음.
정규화와 비슷해보이는데 정규화가 이미 진행된 테이블에 대해서 진행하는 것임.