Amir m
6 سال پیش توسط Amir m مطرح شد
9 پاسخ

کمک در الگو طراحی دیتابیس

سلام.
ما یه وبسایت ارسال پیامک داریم و از دیتابیس Mysql استفاده میکنیم.
یه جدولی داریم به اسم numbers که در اون تمام شماره هامون ثبت میشه به همراه یک hash_key که به عنوان شناسه اون خط هستش.
در کل در حال حاضر 90 هزار شماره برای ارسال پیامک تبلیغاتی داریم (که خب هر روز بیشتر میشه)
ساختار این دیتابیس به این شکله:
db

تقریبا یک هفته شده به یک مشکلی خوردم و هر کاری میکنم ایده حلش به ذهنم نمیاد.
ببینید فرضا مشتری برای کمپین A میاد 500 پیامک سفارش میده. خب من میام با یک Select از دیتابیس 500 خط رو اتنخاب میکنم و باهاشون پیامک میفرستم.
حالا مثلا یه مدت بعد مشتری میاد برای همون کمپین A تعداد 8700 پیامک دیگه سفارش میده.
و به همین ترتیب ممکنه چند ده بار بیاد برای یه کمپین، پیامک تبلیغاتی سفارش بده.

من چطوری میتونم کار کنم که خطوطی که قبلا ازشون تو این کمپین استفاده شده و باهاشون تبلیغات ارسال شده، مجدد استفاده نشن؟
یعنی هر بار مشتری میاد برای یه کمپین مشخص سفارش جدید ثبت میکنه، موقعی که دارم از دیتابیس خط ها رو select میکنم دیگه قبلیا رو انتخاب نکنم!

من فقط یک راه به ذهنم اومد: که بیام هر بار که یه پیامک ارسال میشه یک رکورد در یه جدولی به اسم log ثبتش کنم. و بعدا بیام چک کنم این جدول و خط های استفاده نشده رو تشخیص بدم.
اما مشکل اینجاست که ممکنه مشتری یه سفارش بده و بیاد 50 هزار پیامک سفارش بده یعنی باید 50 هزار رکورد رو به دیتابیس ارسال کنم که ثبت شه!!!!
که عملا ممکن نیست چون ما در روز بیشتر از 3 تا 4 ملیون پیامک میفرستیم.

راه حلی دارید دوستان؟
تقریبا یک هفته هر جا میرم کاغذ قلم دستمه تا بتونم این مشکل رو حل کنم.
حسابی گیر کردم اینجا و مشتری هم منتظره!


ثبت پرسش جدید
Amir m
تخصص : برنامه نویس
@proamirm 6 سال پیش مطرح شد
0

@khanzadimahdi @hesammousavi و سایر دوستان ممنون میشم راهنمایی کنید.


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش آپدیت شد
0

خب شما وقتی سلکت میزنی و برای مشتری 500 شماره انتخاب میکنی یجایی به هرحال باید براش نگهداری که بعدا بتونی اون شماره های رو که گرفته دیگه انتخاب نشن یا متوجه بشیی که این سری شماره برای این مشتریه


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش آپدیت شد
0

تویی همون تیبل شماره هات یک فیلد دیگه بذاری مثلا user و کسانی که از این شماره استفاده کردن رو بصورت ارایه ذخیره کنی و بعدا هروقت خواستی شماره براش سلکت کنی اون فلید user رو چک کنی و اینجوری هم نیازی به تیبل log نداری


Amir m
تخصص : برنامه نویس
@proamirm 6 سال پیش مطرح شد
0

@juza666
ممنون از پاسخت.
این ایده هم اره درسته اما سوالی که پیش میاد. که من اگه بیام آی دی هر خط رو توی یک آرایه در کمپین A وارد کنم، اینطوری یک آرایه شامل مثلا 80 هزار عضو داریم!
این تعداد مشکل ساز نیست؟!
که مثلا سرعت رو کند کنه.
من بهترین راه و سریعترینشون رو میخوام


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش آپدیت شد
0

شما ایدی کاربر رو تویی ارایه و بعد تویی یک فیلد نگه میداری

مثلا شماره 09215831866 => فیلد یوزر [1,2,3]

تویی مثال بالا این شماره برای سه کاربر ذخیره شده

شما بگو 1 میلیون کاربر در یک ارایه، اینجوری شما یکبار واکشی میکنی و بعدش با پیماش در ارایه چک میکنی ایا استفاده شده یا نه

اگر استفاده شده دیگه ایدی به ارایه اضاف نمیکنی


رضا
@rezahosseini 6 سال پیش مطرح شد
0

این روشی که دوست عزیزمون گفتن منطقی و بهینه نیست و البته به نظر من خنده دار :)

کافیه هر بار که کمپین ارسال میشه limit شماره ها رو در یه جدول دیگه ذخیره کنید و در کوئری کمپین های بعدی ازش استفاده کنید
بصورت زیر
select ... order by id asc limit 1, 500

منتها مقدار 1 و 500 باید بر مبنای نیازتون قرار بگیره
مقلا اگر کمپین جدید 470 تا خطه و قبلا از 500 تا خط استفاده شده حالا باید بصورت زیر عمل کرد:
select ... order by id asc limit 500, 470
یعنی 470 تا رکورد بعد از 500مین رکورد و به همین صورت برای کمپین های بعدی

به همین راحتی!


Amir m
تخصص : برنامه نویس
@proamirm 6 سال پیش آپدیت شد
0

@rezahosseini
ممنون از روشتون
اما این روش تون فقط یه مشکل داره نمیدونم قابل رفعه یا خیر.
ببینید اینطوری همش خطوط اول یا اخر در ابتدا مورد استفاده قرار میگیرن و فشار به این خطوط میاد.
امکان رندوم بودن باشه خیلی بهتره
ممنون


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
0

@rezahosseini

متوجه خنده دار بودن حرف م نشدم!
خب روشی که شما عرض کردین با روش خودشون گفتن خب یکیه! فقط یک شرط اینجا شما براش تعریف کردین که مطمنا این شرط هم خودشون میتونستند بذارن! یا من درست متوجه منظورشون نشدم یا شما پست های من رو درست نخوندین، به هرحال موفق باشید ✌


Amir m
تخصص : برنامه نویس
@proamirm 6 سال پیش مطرح شد
0

@juza666
آقا تاپیک بسته بشه بهتره.
هر دو روش رو تست کردم و در نهایت روش شما رو انتخاب کردم با یکم تغییر.
این بار جلوی هر سفارش یک ستون درست کردم به اسم last_used_id که لیست پایتون رو توش ذخیره میکنم و هر بار اونو آپدیت میکنم و با کوئری where not in (list,liiiist) خطوط جدید رو میگیرم.
چون فشار نیومدن خیلی مهمه واسم


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام