PDA

View Full Version : حرفه ای: سوالی در مورد استفاده از VIEW در MYSQL



kabootar_y
جمعه 10 مهر 1394, 22:31 عصر
با سلام خدمت دوستان حرفه ای
من تا حالا با VIEW در MYSQL کار نکردم یعنی حقیقتش حتی دقیقا نمی دونم چی کار میکنه ولی از اونجا که فهمیدم که سرعت اجرای کوئری ها میشه قصد دارم استفاده کنم. حالا در این مورد چند سوال از حرفه ای های php دارم.
1- آیا استفاده از view امنیت رو کاهش میده یا افزایش؟ یا اصلا تاثیری بر امنیت نداره؟

2- آیا در سیستم های بزرگ (منظور من از بزرگ حجم زیاد اطلاعات در دیتابیس هست) بیشتر مورد استفاده قرار میگیره یا سیستم های کوچک و کم حجم؟

3- آیا هر بار که میخواهیم صفحه را لود کنیم باید view که باید ازش استفاده بشه رو update کنیم؟ یا اگر در جدولی که ازش view ساختیم تغییراتی ایجاد بشه نیازی به Update نیست و در خروجی اطلاعات جدید نمایش داده میشوند؟

4- آیا ممکنه به دلیلی که نمی دونم این view در دسترس نباشه (درصورتی که اگز در همون حالت از خود جدول واقعی خروجی میگرفتم با خطا مواجه نمی شد)؟

5- آخرین سوالم در مورد طرز استفاده صحیح از این ویژگی MYSQL هست. من دو تا روشی که به ذهنم رسیده رو میگم لطف کنید بگید کدوم بهتره و اگز راه بهتری هست هم لطف کنید راهنمایی بفرمایید

روش اول من:







// ساختن VIEW از کل جدول products

"CREATE OR REPLACE VIEW vw_products AS SELECT * FROM products"



// خروجی گرفتن ستون keywords از تمام محصولاتی که در دسته های فعال قرار دارند


"SELECT p.meta_keywords
FROM vw_products p
INNER JOIN ".$pref."category_controller cc ON cc.product_id = p.id
INNER JOIN ".$pref."categories c ON c.id = cc.category_id
WHERE p.status = 1 AND c.status = 1
GROUP BY p.id"


// خروجی گرفتن از ستون های title, price, id که در دسته های فعال قرار دارند



"SELECT p.title,p.price, p.id
FROM vw_products p
INNER JOIN ".$pref."category_controller cc ON cc.product_id = p.id
INNER JOIN ".$pref."categories c ON c.id = cc.category_id
WHERE p.status = 1 AND c.status = 1
GROUP BY p.id"





روش دوم من:







// ساختن VIEW اول از ستون meta_keywords جدول products که در دسته های فعال قرار دارند


"CREATE OR REPLACE VIEW vw_meta_keywords AS
SELECT p.meta_keywords
FROM vw_products p
INNER JOIN ".$pref."category_controller cc ON cc.product_id = p.id
INNER JOIN ".$pref."categories c ON c.id = cc.category_id
WHERE p.status = 1 AND c.status = 1
GROUP BY p.id"


// ساختن VIEW دوم از ستون های title, price, id از جدول products که در دسته های فعال قرار دارند



"CREATE OR REPLACE VIEW vw_title_price_id AS
SELECT p.title,p.price, p.id
FROM vw_products p
INNER JOIN ".$pref."category_controller cc ON cc.product_id = p.id
INNER JOIN ".$pref."categories c ON c.id = cc.category_id
WHERE p.status = 1 AND c.status = 1
GROUP BY p.id"




// خروجی گرفتن برای از ستون meta_keywords بدون شرط جدید (طبق شرط هایی که در ساخت VIEW مطرح شد)


"SELECT * FROM vw_meta_keywords"


// خروجی گرفتن از ستون های title, price, id بدون شرط جدید(طبق شرط های که در ساخت VIEW مطرح شد)

"SELECT * FROM vw_title_price_id"

kabootar_y
شنبه 11 مهر 1394, 11:50 صبح
یکی جواب بده خواهشن.

rezaonline.net
شنبه 11 مهر 1394, 13:48 عصر
شما درک مناسبی از ویو ها ندارید
پیشنهاد میکنم مطالعه بیشتری داشته باشید

ویو ها به زبان عامیانه جداول مجازی هستن که روی جداول حقیقی ساخته میشن
به طور مثال فرض کنید یک جدول دارید به اسم USER
و یک جدول دارید به اسم محصول PRODUCT

که به ازای هر کاربر یک محصول قرار میگیره
حالا بخواید محصولات و اطلاعات کاربرا رو با هم بخونید باید یک join بزنید روی این دو جدول

حالا اگر زیاد از این استفاده کنید به جاش میتونید یک ویو بسازید به اسم مثلا USERPRODUCT که شامل جوین دو جدول قبلی میشه
و از این پس به جای استفاده از جوین قبلی مستقیما از جدول جدید بخونید (که دقیقا مثل این میمونه از دو جدول قبلی خوندید)

ویو یعنی این

یه سرچ بزنی اطلاعات بیشتری هست
بگرد

H:Shojaei
شنبه 11 مهر 1394, 14:38 عصر
با سلام خدمت دوستان حرفه ای
من تا حالا با VIEW در MYSQL کار نکردم یعنی حقیقتش حتی دقیقا نمی دونم چی کار میکنه ولی از اونجا که فهمیدم که سرعت اجرای کوئری ها میشه قصد دارم استفاده کنم. حالا در این مورد چند سوال از حرفه ای های php دارم.
1- آیا استفاده از view امنیت رو کاهش میده یا افزایش؟ یا اصلا تاثیری بر امنیت نداره؟

2- آیا در سیستم های بزرگ (منظور من از بزرگ حجم زیاد اطلاعات در دیتابیس هست) بیشتر مورد استفاده قرار میگیره یا سیستم های کوچک و کم حجم؟

3- آیا هر بار که میخواهیم صفحه را لود کنیم باید view که باید ازش استفاده بشه رو update کنیم؟ یا اگر در جدولی که ازش view ساختیم تغییراتی ایجاد بشه نیازی به Update نیست و در خروجی اطلاعات جدید نمایش داده میشوند؟

4- آیا ممکنه به دلیلی که نمی دونم این view در دسترس نباشه (درصورتی که اگز در همون حالت از خود جدول واقعی خروجی میگرفتم با خطا مواجه نمی شد)؟

5- آخرین سوالم در مورد طرز استفاده صحیح از این ویژگی MYSQL هست. من دو تا روشی که به ذهنم رسیده رو میگم لطف کنید بگید کدوم بهتره و اگز راه بهتری هست هم لطف کنید راهنمایی بفرمایید

آقا رضا توضیح خوبی دادن واسه این که این سوالها هم بی جواب نمونه:

1- امنیت ربطی به ویو ها نداره ویو کلا داخلیه پارامتر به صورت مستقیم نمیشه بهش داد (ولی با تعریف تابع میشه در صورتی که مقدار بازگشتی تابع پارامتر مورد نظر باشه) که در این مورد هم امنیت مثل قبل باید لحاظ بشه...
2- باز هم ربطی به اندازه پروژه نداره ویو جایی کاربرد داره که شما از یک کوئری به تعداد مکرر در مکان های مختلف توی پروژه بخواید استفاده کنید...
3- من تا حالا همچین چیزی نشنیدم الآن هم تحقیق کردم چیزی پیدا نکردم...
4- خیر view که ساخته بشه واسه یک بار همیشه هست مثل موارد دیگه کارشو میکنه
5- طرز خواصی نداره کلا به شکل create view یا create or replace view 'viewName' as ... که به جای ... یک select با تمام ویژگی های یک select معمولی میشه نوشت...
کلا ویو چیز خواصی نیست ویو یک کوئری هست که ذخیره شده و هر بار که نام ویو رو تو یک کوئری داخل پروژه بیاریم کوئری که واس ویو نام برده تعریف شده اجرا میشه و بازگردونده میشه... همین...

kabootar_y
شنبه 11 مهر 1394, 19:44 عصر
ویو ها به زبان عامیانه جداول مجازی هستن که روی جداول حقیقی ساخته میشن
به طور مثال فرض کنید یک جدول دارید به اسم USER
و یک جدول دارید به اسم محصول PRODUCT

که به ازای هر کاربر یک محصول قرار میگیره
حالا بخواید محصولات و اطلاعات کاربرا رو با هم بخونید باید یک join بزنید روی این دو جدول

حالا اگر زیاد از این استفاده کنید به جاش میتونید یک ویو بسازید به اسم مثلا USERPRODUCT که شامل جوین دو جدول قبلی میشه
و از این پس به جای استفاده از جوین قبلی مستقیما از جدول جدید بخونید (که دقیقا مثل این میمونه از دو جدول قبلی خوندید)

ویو یعنی این


ابن که شما فرمودید یعنی همون روش دومی که گفتم دیگه. درسته؟