dbArchitecture

posts์™€ tags ํ•ฉ์ณ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

Eloquent์ด์šฉ

  1. $post->with('tags')->get()

  2. $post->get()->load('tags)

๋‘ ์ฟผ๋ฆฌ ๋ชจ๋‘ post๋ฅผ select ํ›„ post_tag์™€ tags๋ฅผ joinํ•˜์—ฌ ์ปฌ๋ ‰์…˜์œผ๋กœ ์กฐํšŒํ•œ๋‹ค.

์ฟผ๋ฆฌ๋นŒ๋” ์ž‘์„ฑ

select posts.*, GROUP_CONCAT(t.title separator ', ') as tag_title
from posts
left join post_tag pt on posts.id = pt.post_id
left join tags t on pt.tag_id = t.id
group by  posts.id;

group_concatํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ posts๋‚ด์— tag์ •๋ณด๋ฅผ string์œผ๋กœ ์น˜ํ™˜ํ•˜์—ฌ ๊ฐ€์ ธ์˜จ ํ›„ responseํ•˜๊ธฐ ์ „์— ์กฐ๊ธˆ ๋ฐ์ดํ„ฐ๋ฅผ ์†๋ณด๋Š” ๋ฐฉ๋ฒ•

users likes tags ํ•ฉ์ณ ์กฐํšŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

Eloquent์ด์šฉ

  1. $user->with(['likes','likes.tags'])->get() user select / users-likes-posts joinํ•˜์—ฌ select / posts-post_tag-tags joinํ•˜์—ฌ select ์ด 3๋ฒˆ์˜ ์ฟผ๋ฆฌ ๋ฐœ์ƒ

์ฟผ๋ฆฌ ๋นŒ๋” ์ž‘์„ฑ

select posts.*, GROUP_CONCAT(t.title separator ', ') as tag_title
from posts
inner join post_tag pt on posts.id = pt.post_id
inner join tags t on pt.tag_id = t.id
where posts.id in (
    select p.id
    from users u
    left join likes l on u.id = l.user_id
    left join posts p on p.id = l.post_id
)
group by  posts.id;

5๋ฒˆ์˜ join์„ ํ†ตํ•ด ํ•œ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ์ˆ˜ํ–‰

=> ํ˜„์žฌ๋Š” Eloquent๋กœ ์ˆ˜ํ–‰์„ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŽ์ดํƒ€ ์ฟผ๋ฆฌ์†๋„๊ฐ€ ๋Š๋ ค์ง„๋‹ค๋ฉด ์—ญ์ •๊ทœํ™”๋ฅผ ๊ณ ๋ คํ•ด๋ณด๊ฑฐ๋‚˜ db์ข…๋ฅ˜๋ฅผ ๊ณ ๋ คํ•ด๋ณด์ž.

๊ณ ๋ฏผํ•ด๋ณผ ์ 

  1. ํ•œ๊ฐœ์˜ DB์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ์ฟผ๋ฆฌ ํ˜ธ์ถœ๋กœ ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์ƒค๋”ฉ์„ ํ†ตํ•ด ๋‚˜๋ˆ„์–ด ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  2. posts์™€ tags์ •๋ณด๋ฅผ ์—ญ์ •๊ทœํ™”๋กœ ํ…Œ์ด๋ธ”์„ ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•

    ํ˜„์žฌ FTS์˜ index์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ๋•Œ posts์™€ tags๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  posts์ €์žฅํ• ๋•Œ ์ข…์†์ ์œผ๋กœ tags๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

    -> ๋งŒ์•ฝ์— tags๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด ์ด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ณผ์ •์€ tags index์—์„œ tag id๋ฅผ ์ฐพ์•„๋‚ด๊ฒŒ ๋˜๊ณ  ์ด id๋ฅผ ์ด์šฉํ•ด posts๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋ ํ…๋ฐ ์ด posts์—๋Š” ๋˜ tags๋“ค์˜ ์ •๋ณด๋“ค์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ tags๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    ๊ทธ๋ž˜์„œ posts์™€ tags๋ฅผ ํ•œ index์— ๊ฐ™์ด ์ง‘์–ด๋„ฃ๊ณ  ๊ฒ€์ƒ‰์—”์ง„์—์„œ key๊ฐ’์„ ์ด์šฉํ•ด tag์™€ ๋ฌธ๊ตฌ๋‚ด์šฉ(content)๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ FTS์—๋„ tags๋ฅผ posts์™€ ๊ฐ™์ด ์ €์žฅํ•˜๊ณ  ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๊ตณ์ด ํ…Œ์ด๋ธ”์„ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ  ํ•œ๊ฐœ์˜ ์ปฌ๋Ÿผ๋‚ด์— string์œผ๋กœ ํ‘œํ˜„ํ•ด๋„ ๋˜‘๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด ์•ž์—์„œ ๋งํ–ˆ๋˜ post-tag๊ฐ„์˜ joinํ•˜๋Š” ๋ฌธ์ œ์˜ ํ•œ depth๊ฐ€ ์‚ฌ๋ผ์ ธ ์œ„์˜ ๊ณ ๋ฏผ๋„ ํ•ด๊ฒฐ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

    posts๋‚ด์— tag๋ฅผ jsonํƒ€์ž…์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋˜ likes๋‚ด์— posts๋“ค์˜ ์ •๋ณด๋ฅผ jsonํƒ€์ž…์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•!

    posts ์‚ญ์ œ๊ฐ™์€ ๊ฒฝ์šฐ posts, tags, post_tag ์™€ likes ๊นŒ์ง€ ์ด 4๊ฐœ์˜ ํ…Œ์ด๋ธ”์— ์‚ญ์ œ์ฟผ๋ฆฌ๊ฐ€ ๋‚ ๋ผ๊ฐ„๋‹ค. posts์™€ tags๋งŒ ํ•œ๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ ํ•ฉ์น˜๋Š” ์—ญ์ •๊ทœํ™”๋ฅผ ํ–ˆ์„๋•Œ๋Š” likes์™€ posts ๋‘๊ฐœ์˜ ์‚ญ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , likes๋‚ด์— post์˜ ๋‚ด์šฉ์„ ์ค‘๋ณต์‹œ์ผœ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋‘๊ฐœ์˜ ์‚ญ์ œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    tags์—์„œ tag๋กœ ์กฐํšŒํ•˜๊ฒŒ ๋˜๋ฉด posts์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  ํ•ด๋‹น posts๋“ค์˜ ํฌํ•จ๋œ tags๋“ค์„ ๋˜ ์กฐํšŒํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ => ๋ฐ˜์ •๊ทœํ™” ๊ฒฐ์ • => ์žƒ๋Š” ๊ฒƒ : likes ๊ฐ™์€๊ฒฝ์šฐ update๊ฐ€ ํ•œ๋ฒˆ๋” ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated