• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
استفاده یا عدم استفاده از join
#1
سلام

میخوام نظرتون رو بدونم که آیا توی درخواست گرفتن یه سری اطلاعات از پایگاه داده و چند جدول بهتره از جوین استفاده بشه یا نه.

مثلا میخوام توی یه سیستم خبری در نمایش لیست اخبار هم اطلاعات شاخه رو بگیرم هم اطلاعات خبر ها رو . و ترکیب اینها رو با هم نمایش بدم

کاری که من کردم به یه کوئری اطلاعات شاخه ها رو گرفتم ( به طور معمول ۱۰ ۱۵ تا شاخه است و حجم تیبل هم زیر ۱۰۰ کیلوبایت ) به یه کوری دیگه اطلاعات خبر ها رو گرفتم بعد توی پی اچ پی این ها رو به هم ترکیب کردم.

به نظرتون این روش بهتره یا اینکه برم جدول ها رو با هم جوین کنم؟

به صورت کلی میخوام بدونم برای گرفتن اطلاعات از چند تا جدول ( مثلا تگ و خبر و ... ) بهتره همه رو با هم جوین کنم یا اینکه چند تا کوئری پشت سر هم بزنیم ؟

خودم فکر میکنم چند تا کوئری بهتر از جوین جواب میده و فشار کمتری به سرور میاره.

ممنون میشم راهنمایی کنید.
  پاسخ
تشکر شده توسط :
#2
نقل قول:میخوام نظرتون رو بدونم که آیا توی درخواست گرفتن یه سری اطلاعات از پایگاه داده و چند جدول بهتره از جوین استفاده بشه یا نه.

روش استانداردش هم استفاده از جوین هست.
جوین ها این توانایی رو به ما میدن تا بتونیم اطلاعات مورد نظر خودمون رو از چند جدول بگیریم.

نقل قول:خودم فکر میکنم چند تا کوئری بهتر از جوین جواب میده و فشار کمتری به سرور میاره.

خیلی وقت پیش رو یه سی ام اس خبری کار میکردم، سایت در ساعاتی که ترافیک بالایی داشت هنگ میکرد. یکی از دلایلش هم این بود که برای هر بخش یک کوئری اجرا میشد در صورتی که میتونست با استفاده از جوین تعداد کوئری ها و در نتیجه فشار سرور رو کاهش بده.

یکی از موارد بهینه سازی در دیتابیس همین استفاده از جوین هاست.
هر چیزی که در جستن آنی آنی...
غایب
  پاسخ
تشکر شده توسط : hamid_80386 voltan
#3
توی سایت داشتم سرچ میکردم این تاپیک رو دیدم : http://forum.iranphp.org/Thread-%DA%86%D...B%8C%D8%AF

حالا جوین بکنیم یا نکنیم؟
  پاسخ
تشکر شده توسط :
#4
نقل قول:توی سایت داشتم سرچ میکردم این تاپیک رو دیدم : http://forum.iranphp.org/Thread-%DA%86%D...B%8C%D8%AF

حالا جوین بکنیم یا نکنیم؟

من مقاله اصلی که وحید در این مورد توضیح داده بود رو پیدا نکردم.

اما بهتره به این تاپیک هم یه سری بزنید(بی ربط به این موضوع نیست)

نقل قول:شما اگر جوین استفاده نمی کنید پس حتما سه تا کوئری میفرستید تا بتونید نتیجه رو دریافت کنید و این بدتر از حالت join هست.
بهتره از یه‌benchmark کنین

امثالش زیاده. بیشتر جستجو کنید.
هر چیزی که در جستن آنی آنی...
غایب
  پاسخ
تشکر شده توسط :
#5
شما اگر بتونید جوین هاتون رو جدا بکنید بهتره. شکست جوین ها یکی از روشهای بهینه سازی هست. البته این به شرطی هست که مثلا اگر سه جدول قرار هست توی نتیجه شرکت کنن فقط ۳ کوئری (یا یک مقدار بیشت مثلا ۵ تا) اگر بیشتر بشه شکست جوین یه کار اشتباه هست.
دلیلش هم
۱- باعث میشه که سیستم بهتر بتونه کش کنه
۲- مدت زمان lock رو کاهش میده
  پاسخ
تشکر شده توسط : undefined voltan
#6
من الان این اطلاعات رو برای یه سری ماژول برای یک سی ام اس میخوام ( اخبار - گالری - بنر - تماس - صفحات - اسلاید ) توی همه این سیستم ها جاهایی نیازه یه مجموعه اطلاعات گرفته بشه . از ۲ یا نهایتا ۳ جدول و من توی همه به جای جوین از یه تعداد کوئری پشت سر هم استفاده کردم. و به تعداد جدول ها یعنی جایی که دو تا جدول داشت با دو تا کوئری اطلاعات رو گرفتم و یه آرایه از اطلاعات ترکیب شده ساختم

با توضیحات شما فکر کنم مناسب باشه
  پاسخ
تشکر شده توسط :
#7
نقل قول:مثلا میخوام توی یه سیستم خبری در نمایش لیست اخبار هم اطلاعات شاخه رو بگیرم هم اطلاعات خبر ها رو . و ترکیب اینها رو با هم نمایش بدم
من یه سیستم وبلاگ همین کارو کردم .
به نظرمن شما نیاز نیست جوین کنید .

قطعاً قسمتی از سایت نیاز به نمایش تمام موضوعات هست ، پس تموم موضوعات رو واکشی میکنید یکبار .

از همون میتونید استفاده کنید .

حالا من نمیدونم شما چه جوری موضوعات رو قرار دادید (منظورم استفاده از یک جدول جداگانه یا صرفاً یک فیلد موضوع در همان جدول مطالب) تا ساده تر بگم .

اما یه مسئله ای که شاید به سوالتون ربط نداشته باشه اما بهتره بدونید !
شما میتونین فقط یکبار واکشی اطلاعات دسته ها رو در طول مثلاً 24 ساعت داشته باشین .
اطلاعات موضوع بندی ، و جداولشون چیزی نیستن که روزانه بروزرسانی بشن و معمولاً هفته ها و ماهها بدون تغییرن !
شما میتونی این چنین اطلاعاتی رو کش کنی .

اگر از یک فریم ورک استفاده میکنی ، قطعاً کش داره و ازش استفاده کن .
اگرم استفاده نمیکنی حداقل از یک کلاس دیتابیس استفاده کن که قابلیت کش کردن اطلاعات رو داشته باشه .
مثلاً ezSQL
http://justinvincent.com/ezsql
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط :
#8
راستش من دارم روی چند تا ماژول برای یک سی ام اس که بر اساس زند فریم ورک نوشته شده کار میکنم.

در ماژول اخباری که دارم روش کار میکنم اول در نظر داشتم چهار جدول داشته باشم. یکی برای اطلاعات کلی خبر - یکی برای متن خبر به همراه احتمالا متا و کیبورد - یکی برای شاخه ها - یکی هم برای ارتباط شاخه به مطلب

هدف کلی از توسعه این ماژول داشتن ماژولی برای ساخت و دسته بندی مطالب و صفخات داینامیک حالا میخواد یه سیستم خبری باشه یا مثلا نمایش یه سری محصول یا دسته بندی مطالب یه شرکت و موئسسه.

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

به صورت کلی این سی ام اس یه سری ماژول خواهد داشت مثل اخبار و گالری و لینک دانلود و ... و بخشی از ماژول ها مطمئنا شاخه بندی دارن و با توجه به نسخه های قبلی سی ام اس و ماژول هایی که براش نوشته شده تقریبا تمام شاخه بندی ها ساختار مشابه داره

فعلا برای هر ماژول یه سیستم شاخه بندی نوشتم که تفاوت های کوچیکی با هم دارن ولی شاید نوشتن یه ماژول تک با امکانات لازم و استفاده از اون برای شاخه بندی و دسته بندی کلی مطالب در تمام سایت مفید تر باشه . اینطوری میشه هم مطالب رو بر اساس شاخه تقصیم ( مثلا همه اخبار - لینک ها - ویدیو ها و عکس ها از همه ماژول ها در مورد یک موضوع ) کرد و هم ماژول / شاخه ( در ماژول اخبار تمام خبر ها در مورد یک موضوع )

فعلا توسعه دهنده های اصلی دارن سیستم رو سویچ میکنن به زند ۲ و تا وقتی کلیت سیستم آماده نشه ( احتمالا تا یک ماه آینده ) نمیشه در مورد این مسائل تصمیم گرفت.
  پاسخ
تشکر شده توسط :
#9
خب ببین با این توضیحاتی که دادی هر نوشته ، مطلب ، خبر و یا هر محتوایی صرفاً میتونه فقط در یک موضوع باشه (مسئله قرار گیری در چندین موضوع منتفیه!)

خب این که خیلی راحته شما توی اون فیلد محتوا ، که مربوط به موضوع هست ، فقط شناسه موضوع رو درج کنید .
لازمه بگم یه جدول دیگه برای موضوعات نیاز دارید که شما 4 فیلد cat_id , cat_name , cat_uri , cat_title میشه .

تمام محتویات این جدول باید قبل از محتوا لود بشه و کش بشه در صورت لزوم .

حال در یک محتوا شما شناسه 5 رو برای موضوع دارید میتونید با یک آرایه ساده که از قبل ساختید نام و لینک موضوع رو نشون بدید در اون مطلب .
کد:
$cat_id_to_link[5]
و بقیه هم همینطور.

فکر کنم مشکلتون حل شد .
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط :
#10
من همین کار رو انجام داده بودم . یه نسخه تست یکم قدیمی تر رو میتونید اینجا ببینید : http://www.webx.ir
در انتهای صفحه میتونید کوئری هایی که زده شده رو ببینید
جدول ها هم به این شکله :

کد:
CREATE TABLE `{story}` (
  `id` int(10) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `subtitle` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `topic` int(10) NOT NULL,
  `type` varchar(25) NOT NULL default 'story',
  `short` text NOT NULL,
  `text` text NOT NULL,
  `keywords` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `important` tinyint(1) NOT NULL,
  `default` tinyint(1) NOT NULL,
  `status` tinyint(1) NOT NULL,
  `inlist` tinyint(1) NOT NULL,
  `create` int (10) NOT NULL,
  `update` int (10) NOT NULL,
  `publish` int (10) NOT NULL,
  `expire` int (10) NOT NULL,
  `author` int(10) NOT NULL,
  `link` varchar(255) NOT NULL,
  `source` varchar(255) NOT NULL,
  `order` int(10) NOT NULL,
  `hits` int(10) NOT NULL,
  `image` varchar(255) NOT NULL,
  `imagedesc` varchar(255) NOT NULL,
  `path` varchar(255) NOT NULL,
  `comments` int(10) unsigned NOT NULL,
  `allow_comments` tinyint(1) NOT NULL default '1',
  PRIMARY KEY (`id`),
  KEY `idxstoriestopic` (`topic`),
  KEY `title` (`title`),
  KEY `create` (`create`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `{topic}` (
  `id` int (10) unsigned NOT NULL  auto_increment,
  `pid` int (5) unsigned NOT NULL ,
  `title` varchar (255)   NOT NULL ,
  `alias` varchar(255) NOT NULL,
  `text` text   NOT NULL ,
  `image` varchar (255)   NOT NULL ,
  `path` varchar(255) NOT NULL,
  `keywords` varchar (255)   NOT NULL ,
  `description` varchar (255)   NOT NULL ,
  `order` int (5)   NOT NULL ,
  `showtype` varchar (64)   NOT NULL ,
  `perpage` tinyint (3)   NOT NULL ,
  `columns` tinyint (3)   NOT NULL ,
  `author` int (10)   NOT NULL,
  `create` int(10) NOT NULL,
  `publish` int (10) NOT NULL,
  `update` int(10) NOT NULL,
  `expire` int(10) NOT NULL,
  `status` tinyint (1)   NOT NULL,
  `showtopic` tinyint (1)   NOT NULL default '1',
  `showauthor` tinyint (1)   NOT NULL default '1',
  `showdate` tinyint (1)   NOT NULL default '1',
  `showpdf` tinyint (1)   NOT NULL default '1',
  `showprint` tinyint (1)   NOT NULL default '1',
  `showmail` tinyint (1)   NOT NULL default '1',
  `shownav` tinyint (1)   NOT NULL default '1',
  `showhits` tinyint (1)   NOT NULL default '1',
  `showcoms` tinyint (1)   NOT NULL default '1',
  `homepage` varchar(25) NOT NULL,
  `inlist` tinyint (1)   NOT NULL default '1',
  `inblock` tinyint (1)   NOT NULL default '1',
  PRIMARY KEY (`id`),
  KEY `title` (`title`),
  KEY `create` (`create`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

برای تگ یه ماژول جدا بعدا استفاده میشه. ( همینطور نظر و احتمالا مدیا ) برای متا کی بورد و متا دسکرپشن هم ترجیح دادم موقع ارسال محتوا ساخته بشن و در دیتابیس ذخیره بشن و موقع نمایش از اونها استفاده بشه
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان