PDA

View Full Version : بهترین ساختار دیتابیس برای چت ای جکس با قابلیت پیام آفلاین



moosavimaleki
یک شنبه 16 فروردین 1394, 14:24 عصر
سلام دوستان
:گریه:
با من همدردی کنید :|

من میخوام با زبان php یک چت آی جکس بسازم

هر 2 ثانیه با جی کوئری به poll.php یه درخواست post میفرستم و خرجی رو میگیرم و در صفحه ی چت به کاربر نشون میدم

اما وقتی در poll.php به دیتابیس سر میزنم نمیدونم از چه روشی استفاده کنم که پیام تکراری نگیرم یا پیامی رو از دست ندم!
الان از این ساختار استفاده کردم!

wa_messages table:
message_id
message_date
to_user
from_user
receiving(boolean)
read(boolean)


و در صفحه poll.php این کار ها را میکنم :



UPDATE wa_messages SET receiving=1 WHERE readed = FALSE AND to_user=?



SELECT body,from_user,message_date FROM wa_messages WHERE readed = FALSE AND receiving=1 AND to_user= ? ORDER By Message_date ASC



UPDATE wa_messages SET readed=1 , receiving=0 WHERE receiving=1 AND to_user=?




مشکل چیه !!
مشکل اینه که ممکنه اجرای کد طول بشه و 2 ثانیه بعدی برسه و مجددا این صفحه اجرا بشه
و پیام های تگراری خونده بشه و یا پیامی حذف بشه
من از receiving و read به عنوان یک برچسب استفاده کردم
که وقتی وارد این صفحه میشیم پیام هایی که read نشده رو برچسب receiving بهش بزنیم
و اون هایی که برچسب خورده را دریافت کنیم
و بعد برچسب رو برداریم و برچسب read بهش بزنیم


برچسب read برای اینکه بدونیم تا کجا پیام ها رو به کاربر نشون دادم
برچسب receiving برای اینکه اگه همزمان اجرای کد بیش از 2 ثانیه طول کشد و درخواست ها به دیتابیس همزمان شد پیام هایی که برچسب receiving دارن رو نگیره چون پردازش قبلی درحال گرفتن اون هاست


اما این روش هم جواب نداد و باز اگر بیش از 2 ثانیه بشه مشکب میخوره !! پون بعد از select شدن پیام ها سریعا برچسب نمیخوره


از طرفی کاربران سایت ممکنه 1000 نفر یا بیشتر باشن و برای هر کدوم این poll.php هر دوثانیه اجرا میشه و میخوام تعداد query هایی که به دیتا بیس میره زیاد نباشه تا سرعت بیاد پایین


یه روش دیگه میشناسم که یه جدل بسازم این جوری:
user_id
reciving(بولین)

و در poll.php بیام بگم






if receiving=false{
receiving=true;
select from sql;
receiving=false;
}else{
echo 'error';
}



یک درخواست بدم و برای این یوزر receiving رو بخونم
اگر true بود که از کد خارج بشم
اگر false بود اون رو true کنم (این هم دومین کوئری به دیتا بیس)
پیام ها رو بخونم (سومین کوئری)
receiving رو false کنم (چهارمین کوئری)

4 تا درخواست باید بدم هر 2 ثانیه باید 4 درخواست برای هر یوزر بدم!!!

اما بازم این کد ممکنه خطا داشته باشه

شما راهی به ذهنتون نمیرسه

مثلا با یک کونری هم یه چیزایی Select شه و بعد همون چیزا آپدیت بشه