PDA

View Full Version : سوال: الگوریتیمی جهت تعیین اولویت رکوردها در سیستم خبری



پدرخوانده
جمعه 27 مرداد 1391, 01:23 صبح
در سیستم سامانه های خبری قابلیتی است بصورت تعیین اولویت که به عنوان پارامتری جهت ایندکس استفاده می شود بدین صورت که مشخص می کند که این رکورد (خبر) در چندمین اولویت (سطر) قرار بگیرید
شاید در نگاه اول ساده بوده و دوستان پاسخ دهند که خوب عدد 1 تا ... می گذاریم (یا اصطلاحا یک فیلد auto incorment انتخاب می کنیم) ولی نکته مربوطه آن است که در این سورت معکوس می باشد یعنی بدین صورت که هر خبر جدیدی که قرار داده می شود خود ترتیب اولویت 1 را دارد و بالطبع رکوردهای قبلی (اخبار قبلی) اولویت های بعدی می شوند (یعنی اولویتشان یک شماره تغییر می کند)
به عنوان راه اول مقدماتی سورت را بر اساس تاریخ و ساعت خبر قراردادم
ولیکن راه حل مناسبی نبود چرا که زمانی که می خواهیم یک خبر قدیمی را مثلا در ردیف اولویت 5 قرار دهیم باید تاریخ و ساعت خبر 4و 6 را ببینیم و آنگاه تغییر تاریخ و ساعت را اعمال کنیم
یکی از دوستان همان روش فیلد auto incroment را پیشنهاد داده ولیکن به هنگام نمایش و در دستور select به هنگام تعیین فیلد order by از desc (معکوس) استفاده کنیم
خوب شاید در نگاه اول مشکلی نداشته باشد ولیکن به هنگامی که تصمیم به تغییر یک خبر با تعیین اولویت مربوطه را خواستاریم
اولا در حالتی که به عنوان این فیلد (ترتیب) کلید اصلی انتخاب شده امکان ورود عدد تکراری وجود ندارد در پاسخ بگوییم حال نیازی به انتخاب اتوماتیک توسط mysql نیست و خودمان این عمل (انتخاب آخرین عدد برای هر رکورد) را انجام دهیم که تازه مشکلات و دردسرهای شبکه ای آن را نیز رفع کنیم (در محیط شبکه همزمان ممکن است صدها نفر رکورد جدید انتخاب کرده و عدد جدید استفاده کنند)
که وقتی مثلا عدد 5 را برای آن رکورد انتخاب می کنیم (باید آخرین عدد محاسبه شود و 5 عدد از آن کسر شود)
ثانیا اولویت دومی جهت سورت وجود ندارد و مشخص نیست که این خبر در ردیف 5 ام بایستد

خلاصه آنکه روش های مختلفی را دوستان پیشنهاد داده اند انجام دادم ولیکن هیچ کدام مثمر ثمر نبود

عزیزانی اگر راه حلی به ذهنتان خطور کرد ممنون میشوم پیشنهاد بدهند؟
---
نکته: البته این روش الان در اکثریت نرم افزارهای سامانه های خبری همچون ایران سامانه، هایپرمدیا و... انجام می شود و شاید نکته خاصی هم نداشته باشد ولی به هر حال بنده تاکنون نتوانستم آن را بدست بیاورم

Reza1607
جمعه 27 مرداد 1391, 07:58 صبح
شما مي تونيد از روش تركيبي استفاده كنيد به اين صورت كه يه فيلد براي اولويت قرار ميدين كه مقدار پيشفرض اش 0 هست زماني كه بخواي يه خبر قديمي تو رده هاي بالا قرار بگيره مقدار اين فيلد رو زياد كنيد ودر هنگام select‏ عمليات سورت رو براساس فيلدهاي تاريخ و اولويت انجام بدين به اين صورت

Select * from news order by olaviat desc,date desc

پدرخوانده
دوشنبه 30 مرداد 1391, 23:08 عصر
با تشکر از پاسخ شما ولیکن این روش پاسخگو نیست
چرا که آن موقع تمامی موارد که قبلا (مثلا تصور بفرمایید در یک سیستم خبری شاید در طول ماه دهها بار این اتفاق بیافتد) خبری با تغییر اولویت بالا آمده و حالا با ثبت خبرهای جدید باید به ترتیب پایین برود ولیکن از آنجایی که اخبار پس از آن آمده اند و تاریخ جدیدتری دارند ولیکن به علت نداشتن اولویت بالای (صدر) اخبار نمی آیند
لازم به ذکر است که درتوضیح شما وقتی کلی خبر با اولویت مثلا 5 داریم بدون توجه به برتری سایر اخبار (که شماره اولویتی ندارند) بعد از این خبر می ایستند می ایستند (حالا آنکه اینچنین نیست و تاریخ در اخبار جدید باعث افزایش اولویت آنها باید باشد)
در کل موضوع به این سادگی نیست (باید با موضوع درگیری باشید که بهتر متوجه داستان بشوید)
عزیزان که با این موضوع (تغییر ترتیب در سامانه های خبری) آشنایت دارند ممنون خواهم شد راهنمایی کنند؟

Unique
سه شنبه 31 مرداد 1391, 10:53 صبح
اول اینکه زمانی که شما از order by استفاده میکنید ترتیب ها با اولویت هستند پس نمیتونید هم از یک فیلد اولویت و هم از تاریخ استفاده کنید چون ترتیب مورد نظر را نمیده ! پس یا باید فیلد اولویت داشته باشین یا تاریخ !
تاریخ بحثش منتفی هست چون نمیشه بیایم تاریخ ها را تغییر بدیم تا جای رکورد ها تغییر کنه توی order by و فقط میمونه فیلد اولویت ! بهترین فیلد هم برای این کار همون ID خود جدول هست اما نباید از autoincrement استفاده کنید ! شما باید این ID را خودتون با فواصل 5 یا 10 یا هر چیزی دوست دارین تولید کنین ! برای این کار باید در زمان ثبت رکورد از LOCK TABLES استفاده کنین و جلوی write و read بقیه را بگیرین ! حالا شماره ID را با احتساب 5+ یا 10+ حساب میکنین و خبر را ایجاد میکنید ! حالا اگه قرار شد خبر یا خبر هایی منتقل بشن ما ID خالی داریم که جاها را عوض کنیم ! ترتیب هم بر اساس همون order by desc انجام میشه !

m-i-l-s-o-n
سه شنبه 31 مرداد 1391, 11:39 صبح
حتی می تونین از یه متغیر float یا double برای اولویت استفاده کنین و عمل عوض کردن جای خبر ها رو دیگه دستی انجام ندین برنامه نویسی شده باشه
مثلا اگه قرار باشه رکوردی بره بین رکورد هایی که فیلد اولویتشون 5 و 6 . بین 5 و 6 میانگین گرفته میشه و عدد 5.5 توی فیلد اولویت رکورد نوشته میشه

mtchabok
سه شنبه 31 مرداد 1391, 20:36 عصر
سلام
یه راه حل خیلی ساده دارم واستون و اونم اینه که از دو فیلد تاریخ استفاده کنید .
- یکی برای ثبت زمان ایجاد خبر .
- و دیگری برای ثبت زمان نمایش خبر .
که برای نمایش خبرها میتونید از فیلد زمان نمایش استفاده کنید . برای اولویت بندی هم با تغییر تاریخ نمایش میتونید الویت رو تغییر بدید .

Unique
چهارشنبه 01 شهریور 1391, 02:08 صبح
که برای نمایش خبرها میتونید از فیلد زمان نمایش استفاده کنید . برای اولویت بندی هم با تغییر تاریخ نمایش میتونید الویت رو تغییر بدید .
وقتی میشه از همون فیلد ID استفاده کرده اصلا نیازی به تعریف یک فیلد جدید و حجیم کردن جدول نیست !