PDA

View Full Version : مشکل pagination پا برجاست



leaping
دوشنبه 24 فروردین 1394, 15:59 عصر
سلام دوستان
این مشکل pagination کردن همچنان پا برجاست و من نمیدونم دقیقا چیکار کنم

بیاید یه مثال بزنم براتون که کمی بحث و موضوع بازتر بشه بعد کمکی بکنید.

جدولی با این مشخصات در دیتابیس 1

Database 1

Table user

id username name family group

این جدول هم هست در دیتابیس 2

Database 2

Table Posts

id userid title description family group


حالا من میخوام این جدول رو با pagination نشون بدم و در هر صفحه 20 رکورد رو به نمایش در بیارم اما یک سری استثنائات هم براش تعریف میشه

مثلا پست فلان کاربر برای فلان کاربر دیگه نمایش داده نشه
یا مثلا پست فلان کاربر برای فلان گروه نمیشا داده نشه
پست فلان گروه برای فلان کاربر نشون داده نیشه
یا در انتها پست فلان گروه برای فلان گروه نمایش داده نشه

حالا اگه بخوام استثنئات رو درون حلقه بذارم و از درون حلقه فیلتر کنم که نمیتونه مقدار هر صفحه رو درست تشخیص بده مثلا بر اساس limit 0,20 در صفحه اول 20 رکورد نشون میده و در صفحه دوم هم اگر بشه limit 20,20 اون وقت اگر در صفحه اول چند رکورد درون حلقه حذف شده باشن امکانش هست چند رکورد از صفحه اول در صفحه دووم هم نشون داده بشه
اگرم بخوام برای هر صفحه یکبار کامل دیتابیس رو کش کنم که دیگه واویلا
اگر بخوام با query انجام بدم از اونجایی که دوتا دیتابیس جدا هستن نیمدونم دقیقا چیکار کنم
آیا راهی هست؟

n0o0b_sina
دوشنبه 24 فروردین 1394, 16:06 عصر
سلام دوستان
این مشکل pagination کردن همچنان پا برجاست و من نمیدونم دقیقا چیکار کنم

بیاید یه مثال بزنم براتون که کمی بحث و موضوع بازتر بشه بعد کمکی بکنید.

جدولی با این مشخصات در دیتابیس 1

Database 1

Table user

id username name family group

این جدول هم هست در دیتابیس 2

Database 2

Table Posts

id userid title description family group


حالا من میخوام این جدول رو با pagination نشون بدم و در هر صفحه 20 رکورد رو به نمایش در بیارم اما یک سری استثنائات هم براش تعریف میشه

مثلا پست فلان کاربر برای فلان کاربر دیگه نمایش داده نشه
یا مثلا پست فلان کاربر برای فلان گروه نمیشا داده نشه
پست فلان گروه برای فلان کاربر نشون داده نیشه
یا در انتها پست فلان گروه برای فلان گروه نمایش داده نشه

حالا اگه بخوام استثنئات رو درون حلقه بذارم و از درون حلقه فیلتر کنم که نمیتونه مقدار هر صفحه رو درست تشخیص بده مثلا بر اساس limit 0,20 در صفحه اول 20 رکورد نشون میده و در صفحه دوم هم اگر بشه limit 20,20 اون وقت اگر در صفحه اول چند رکورد درون حلقه حذف شده باشن امکانش هست چند رکورد از صفحه اول در صفحه دووم هم نشون داده بشه
اگرم بخوام برای هر صفحه یکبار کامل دیتابیس رو کش کنم که دیگه واویلا
اگر بخوام با query انجام بدم از اونجایی که دوتا دیتابیس جدا هستن نیمدونم دقیقا چیکار کنم
آیا راهی هست؟
اول آی دی پست هارو بگیرید و اون آی دی هارو فیلتر کنید، سپس با array_slice اونارو به query بدید، limit 0,20 رو هم توی array_slice اعمال کنید. از join هم میشه استفاده کرد. برای شمارش کله تعداد هم میشه آی دی هارو شمرد.
بازم شاید دوستان راه حله بهتری بتونن پیشنهاد بدن

leaping
دوشنبه 24 فروردین 1394, 16:13 عصر
اول آی دی پست هارو بگیرید و اون آی دی هارو فیلتر کنید، سپس با array_slice اونارو به query بدید، limit 0,20 رو هم توی array_slice اعمال کنید. از join هم میشه استفاده کرد. برای شمارش کله تعداد هم میشه آی دی هارو شمرد.
بازم شاید دوستان راه حله بهتری بتونن پیشنهاد بدن
منظورت اینه که در همون query اول این همه رکور رو بشمارم؟ خب این یعنی مرور چند میلیون رکورد که اصلا بهینه نیست وگرنه خودم اینارو میدونم
بعدشم اینکه توی join تا جایی که من میدونم نمیشه دوتا دیتابیس رو وصل کرد بلکه میشه جداول رو باهم ترکیب کرد حالا اگرم میشه دوستان توضیح بدن

Unique
دوشنبه 24 فروردین 1394, 20:56 عصر
قوانین که کی به کی دستری داره یا نداره را کجا تعریف میکنید ؟ دینامیک تعریف میشه ! توی جدولی قرار داره یا یکسری قائده ثابت هست ؟

leaping
دوشنبه 24 فروردین 1394, 21:20 عصر
قوانین که کی به کی دستری داره یا نداره را کجا تعریف میکنید ؟ دینامیک تعریف میشه ! توی جدولی قرار داره یا یکسری قائده ثابت هست ؟
نه خب قطعا داینامیک هست
یک جدول هست که طبق اون این قضیه در هر رکورد برای یک استثنا تعریف میشه مثلا اینطوری
یه قسمت از جدول رو اینطوری فرض کنید
table = excl
id usergroup usertogroup

خب طبق این مثال درون usergroup مقدار 5 قرار داشته باشه
و در usertogroup مقدار 2 قرار داشته باشه
بدین ترتیب گروه 5 دیگه به کلیه اطلاعاتی که مربوط به یوزر شماره 2 هست دسترسی نداره

n0o0b_sina
دوشنبه 24 فروردین 1394, 22:37 عصر
منظورت اینه که در همون query اول این همه رکور رو بشمارم؟ خب این یعنی مرور چند میلیون رکورد که اصلا بهینه نیست وگرنه خودم اینارو میدونم
بعدشم اینکه توی join تا جایی که من میدونم نمیشه دوتا دیتابیس رو وصل کرد بلکه میشه جداول رو باهم ترکیب کرد حالا اگرم میشه دوستان توضیح بدن
بابت بهینه بودنش نظری ندارم ولی توی این روش لازم نیست بین همه حلقه بزنید، بعد که شما با 2 تا query، آی دی هارو گرفتید با array_intersect بین اون آی دی ها تکراری هارو بر میدارید و تموم.
بابت join متوجه نشدم توی 2 تا دیتابیس مختلف قرار دارند اطلاعات

leaping
دوشنبه 24 فروردین 1394, 22:52 عصر
بابت بهینه بودنش نظری ندارم ولی توی این روش لازم نیست بین همه حلقه بزنید، بعد که شما با 2 تا query، آی دی هارو گرفتید با array_intersect بین اون آی دی ها تکراری هارو بر میدارید و تموم.
بابت join متوجه نشدم توی 2 تا دیتابیس مختلف قرار دارند اطلاعات

array_intersect احتیاج نیست چون اگه قرار باشه دوتا کوئری بزنم تو همون کوئری اول خودم میتونم با همون روش قبلی مقدار و تعداد آیدی ها و حذفی ها رو به دست بیارم , زیاد کار سختی نیست
من دارم دنبال راهی میگردم بشه از خود دیتابیس به نتیجه ای رسید که ظاهرا امکانش یا نیست یا من بلد نیستم :D

Unique
سه شنبه 25 فروردین 1394, 14:22 عصر
خب طبق این مثال درون usergroup مقدار 5 قرار داشته باشه
و در usertogroup مقدار 2 قرار داشته باشه
بدین ترتیب گروه 5 دیگه به کلیه اطلاعاتی که مربوط به یوزر شماره 2 هست دسترسی نداره

خوب توی این حالت شما فقط میتونید بگین که چه گروه هایی نمیتونن به پست های یک کاربر خاص دسترسی داشته باشن یعنی شما دارین بر اساس گروه کاربران دسترسی را محدود میکنید نه خود کاربر !‌ یعنی با این جدولی که گفتین نمیشه تعین کرد یک کاربر بخصوص به پست های یک کاربر دیگه دسترسی نداشته باشه ، یا یک کاربر بخصوص به پست های یک گروه خاص دسترسی نداشته باشه ! (قبلا گفته بودین چنین حالت هایی هم ممکنه)

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

وقتی کاربر لاگین میکنه ، شما میتونید گروهش را بدست بیارین. مثلا شماره گروهش ۶ میشه. حالا کافیه بگین همه پست ها را نشون بده مگه پست هایی که مربوط به کاربرانی هست که گروه ۶ امکان دسترسی به اونها را نداره !

یعنی :

select id,title,description from Posts where userid not in (select GROUP_CONCAT(usertogroup SEPARATOR ',') from excl where usergroup = 6)

حالا این query را خیلی راحت میتونی صفحه بندی کنی.

leaping
سه شنبه 25 فروردین 1394, 18:41 عصر
خوب توی این حالت شما فقط میتونید بگین که چه گروه هایی نمیتونن به پست های یک کاربر خاص دسترسی داشته باشن یعنی شما دارین بر اساس گروه کاربران دسترسی را محدود میکنید نه خود کاربر !‌ یعنی با این جدولی که گفتین نمیشه تعین کرد یک کاربر بخصوص به پست های یک کاربر دیگه دسترسی نداشته باشه ، یا یک کاربر بخصوص به پست های یک گروه خاص دسترسی نداشته باشه ! (قبلا گفته بودین چنین حالت هایی هم ممکنه)

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

وقتی کاربر لاگین میکنه ، شما میتونید گروهش را بدست بیارین. مثلا شماره گروهش ۶ میشه. حالا کافیه بگین همه پست ها را نشون بده مگه پست هایی که مربوط به کاربرانی هست که گروه ۶ امکان دسترسی به اونها را نداره !

یعنی :

select id,title,description from Posts where userid not in (select GROUP_CONCAT(usertogroup SEPARATOR ',') from excl where usergroup = 6)

حالا این query را خیلی راحت میتونی صفحه بندی کنی.
نه دوست عزیزدر اون جدول حال کاربر برای گروهش رو توضیح دادم وگرنه چرا بقیه حالتها هم در این استثنا جا دارن
یعنی کاربر برای کاربر
کاربر برای گروه
و ....

Unique
سه شنبه 25 فروردین 1394, 21:38 عصر
نه دوست عزیزدر اون جدول حال کاربر برای گروهش رو توضیح دادم وگرنه چرا بقیه حالتها هم در این استثنا جا دارن
یعنی کاربر برای کاربر
کاربر برای گروه
و ....
جناب leaping اینطوری به جایی نمیرسیم. مشکل اینجاست که شما تمام موارد را کامل توضیح نمیدین تا بشه نظر آخر را داد ! اطلاعاتی که تا ۲ پُست قبل دادین به راحتی با query که نوشتم عملیه. کلا اعتقاد دارم خیلی از این مشکلات به خاطر معماری بد پایگاه و مهندسی نرم افزار اشتباه اتفاق میفته. بهتره بدین کل سیستم را یک نفر آنالیز کنه و معماری درستی برای نرم افزارتون ارآئه بده.

امیدوارم موفق باشین

leaping
سه شنبه 25 فروردین 1394, 23:28 عصر
جناب leaping اینطوری به جایی نمیرسیم. مشکل اینجاست که شما تمام موارد را کامل توضیح نمیدین تا بشه نظر آخر را داد ! اطلاعاتی که تا ۲ پُست قبل دادین به راحتی با query که نوشتم عملیه. کلا اعتقاد دارم خیلی از این مشکلات به خاطر معماری بد پایگاه و مهندسی نرم افزار اشتباه اتفاق میفته. بهتره بدین کل سیستم را یک نفر آنالیز کنه و معماری درستی برای نرم افزارتون ارآئه بده.

امیدوارم موفق باشین

معماری رو خب شما پیشنهاد بدین
من اون قسمت از جدول رو کم نوشتم که مثال زده باشم چطوریه نه اینکه عمدا ناقص بنویسم
الان خود شما دوتا دیتابیس از هم جدا دارین که البته توی دیتابیس اصلی کلیه مباحث مورد به نام کاربری و اختیارت در اون هست و دسترسی ها هم طبق اون جدولی هست که خدمتون عرض کردم
حالا شما به هر ترتیب دیگه که دوس دارین
چطور میتونید کلیه اطلاعات مربوط به یک گروه و یا کاربر رو برای یک گروه و یا کاربر دیگه ممنوع کنید(حالا میتونه شامل چندین گروه و کاربر برای چندین گروه و کاربر دیگه هم باشه)

Unique
چهارشنبه 26 فروردین 1394, 16:10 عصر
ببینین کلا توی سیستم هایی که سطح دسترسی وجود داره بسته به شرایط خیلی کارها ر ا میشه انجام داد.
بیاین اینجوری به قضیه نگاه کنیم :
کلا اول باید دید توی سیستم شما Blacklist بهینه تره و کمتر هست یا Whitelist بهینه تره و کمتر هست ! منظور اینه که بیشتر افراد دسترسی دارن و یکسری دسترسی ها ساقط میشن یا دسترسی ها خیلی محدوده و عده ای هستند که دسترسی های بیشتری دارند.
بعد از اینکه این موضوع روشن شد کافیه بیایم تعین کنیم در مورد یک موضوع خاص (مثلا در مورد شما پست کاربر) کاربر یا گروهش توی این Blacklist یا Whitelist هست یا نه.

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

leaping
چهارشنبه 26 فروردین 1394, 22:56 عصر
ببینین کلا توی سیستم هایی که سطح دسترسی وجود داره بسته به شرایط خیلی کارها ر ا میشه انجام داد.
بیاین اینجوری به قضیه نگاه کنیم :
کلا اول باید دید توی سیستم شما Blacklist بهینه تره و کمتر هست یا Whitelist بهینه تره و کمتر هست ! منظور اینه که بیشتر افراد دسترسی دارن و یکسری دسترسی ها ساقط میشن یا دسترسی ها خیلی محدوده و عده ای هستند که دسترسی های بیشتری دارند.
بعد از اینکه این موضوع روشن شد کافیه بیایم تعین کنیم در مورد یک موضوع خاص (مثلا در مورد شما پست کاربر) کاربر یا گروهش توی این Blacklist یا Whitelist هست یا نه.

منظورم از این مثال این بود که شما کمی باید سیستم را تحلیل کنید و تحلیل خوب داشتن تا دقیقا کل داستان را ندونی امکان پذیر نیست.
بله قطعا بحث black list هست این black list از یک کاربر به کاربر دیگه و از یک گروه به گروه دیگه و ... در یک رابطه چند به چند هستن
خب در اینصورت وقتی دیتابیس جدا هست چطوری میشه این کار رو انجام داد رو چه حسابی باید این کارو رو بکنیم؟

Unique
پنج شنبه 27 فروردین 1394, 01:56 صبح
خب در اینصورت وقتی دیتابیس جدا هست چطوری میشه این کار رو انجام داد رو چه حسابی باید این کارو رو بکنیم؟
متاسفانه بیش از این با این حد از اطلاعات کمکی از دستم بر نمیاد !