طراحی چیزی شبیه Mention در اینستاگرام

با سلام .
فرض کنید کاربری بنام آ یه مطلب ایجاد میکنه . کاربری بنام ب میاد داخل مطلبی که کاربر آ نوشته نظر خودشو مینویسه و نام کاربری چند نفر دیگه رو هم تگ میکنه تا اونها هم مطلع شده و بخونند . مثال ساده اش همون تگ کردن یا منشن کردن تو اینستاگرامه که وقتی تو کامنتی یا … نام کاربری یه نفر رو مینویسی از چیزی که نوشتی خبردار میشه . داخل همین سایتم هست مثلا @shahryarjb دوست عزیز الان از این نوشته خبردار میشه .
خب حالا سوالی که دارم اینه طراحی دیتابیس این شکلی هست و بهینه ترین راهش چیه ؟

تقریبا خودم همچین چیزی تو ذهنم دارم :‌

User id,name
Post id,text,user_id
Reply id,text,post_id,user_id
Mention id,reply_id,user_mention,user_mentioned

Post:

User(A) : برای برنامه نویسی از کجا شروع کنم ؟

Reply:

User(B) : از این دوستان بپرس
Mentioned : User(B,C,D,A)

فقط مشکلی که دارم اینه وقتی میخوام مثلا یک پست رو با همه پاسخ هاش نشون بدم میخوام در هر پاسخی چه تعداد کاربر هم که تگ شدن نشون بدم که نمیتونم .

برای مدل سازی subscription میتونی فعلا یک جوینت بذاری بین یوزر و پست و‌ یک ‌جدول notifications هم داشته باشی، فکر نمیکنم تا چند میلیون کاربر fan-out بتونه مشکل ساز باشه

2 Likes

توماج عزیز با تشکر و احترام متوجه نشدم اگر ممکن باشه کمی بیشتر توضیح بدید واقعا داره پیرم میکنه . خودم یه همچین چیزی رو داشتم الان تست میکردم بنظرتون خوب و بهینه هست ؟

SELECT replies.body as b,replies.id as reply_id,u.name as reply_owner,users.name as mentioned_user,users.id as mentioned_id,u.id as owner_id,posts.title as t
FROM replies
JOIN users u ON u.id = replies.user_id
JOIN posts ON posts.id = 1
LEFT JOIN mentions ON mentions.reply_id = replies.id
LEFT JOIN users ON users.id = mentions.mentioned_id

با توجه به اینکه در همه reply ها قصد دارم نام تک تک کاربرانی که تگ شدند نشون داده بشه اینطوری شده وگرنه لازم نبود انقدر بشه

سیکوئل شما رو نخوندم اما بنظر یک سری جوین‌ساده‌میاد که احتمالا درست باشه و احتمالا تا وقتی تعداد یوزر ها و پست ها کم هست این روش جواب میده، اما گاهی لازمه که از روش های‌کش‌ کردن‌ هم‌استفاده کنیم.
وقتی در مورد بهینه سازی حرف میزنیم چیزی که مهمه اینه که بدونیم load parameter هامون چی هستند و fan out به‌ چه صورت در سیستم ما اتفاق میوفته.

1 Like

اگر ممکن باشه در این مورد کتابی منبعی در اختیار بزارید ممنون میشم بخصوص مفهوم fan out که نتونستم چیزی پیدا کنم

ساده ترین کتابی که در این مورد دیدم designing data-intensive applications بوده

این کتاب رو قبلا به پیشنهاد جناب سمیر و سم دی وی آر خوندم . اگر کتاب دیگه ای هم مد نظر داشته باشید ممنون میشم معرفی کنید . مشکل من اینه کسایی که تگ میشن رو هم نشون بدم و کاربر بتونه با کلیک روی عکسشون یا نام کاربریشون وارد پروفایلشون بشه و اگر این مورد نبود کاری نداشت

نمیدونم دقیقا در چه موردی سوال داری

در اینستاگرام دیدید که زیر یک پست یک شخص کامنت مینویسه ؟‌ یک شخص دیگه داخل کامنت اون شخص دوباره ریپلای میکنه و چند تا از دوستانشو تگ میکنه . من اینو میخوام

اگر کاربرانت کم هستند بهترین کار کش کردن هست می تونی به تمام تگ شده های داخل یک پست مثلا ناتفیکیشن بدی که داخل ردیس ذخیرش کنی اگر بعد از مدتی پاک بشه یا بعد از یک تعدادی دراپ بشه که بهترین گزینه هست به نظرم .

یا یک جدول کلا جدا درست کنی برای ناتیفیکیشن هات که یک تایپ داشته باشه و یک پست آیدی و یک یوزر آیدی یا …

من فکر می کنم تو دنبال چیزی هست که مثلا به ۱۰ سال دیگه فکر کنه در صورتی که الان می تونی کارتو انجام بدی و تا دو سه سال آینده هم مشکلی نداشته باشی.

اینا بدردت نمی خوره؟

1 Like