ورود

View Full Version : استفاده از کلید خارجی بهتر است یا شرطهای تو درتو؟



mehdi mahbobi
دوشنبه 05 اردیبهشت 1390, 22:27 عصر
سلام دوستان. برای من سوال پیش اومده که اگر بشه هم با 3 یا 4 شرط تو در تو جداول مورد نظر را با هم مرتبط کرد و هم از طریق تعریف کلیدخارجی ، کدام سرعت و کارایی بهتری داره ؟ و اصولا شرایط الویت قرار گرفتن یکی
از این دو آیتم چیه؟

m_omrani
سه شنبه 06 اردیبهشت 1390, 01:46 صبح
صورت سوال شاید خیلی درست نباشه. چون به نظرم کلید خارجی از نرمال سازی و برای ایجاد ارتباط (Relation) به دست میاد. لذا یه چیز دلبخواه نیست که بخوایم بگیم بذاریم یا نذاریم.

سرعت واکشی رکورد هم از وجود/عدم وجود ایندکس مناسب نشات می گیره. اگه ایندکس مناسبی وجود نداشته باشه، SQL Server عمل Table Scan رو انجام می ده که برای جداول با تعداد رکورد زیاد باعث افت کارایی می شه. وجود کلید خارجی هم به معنی داشتن ایندکس نیست. ایندکس رو خودتون باید ایجاد کنید. اما کلیدهای خارجی کلاً کاندیدهای مناسبی برای ایندکس زدن هستند.

mehdi mahbobi
سه شنبه 06 اردیبهشت 1390, 10:54 صبح
خوب ظاهرا" من منظورم و درست بیان نکردم ، برای ایجاد کلید خارجی بین دو جدول ، در مواقعی مجبوریم ستونهایی ایجاد کنیم که وجودشون ضرورتی نداره
ولی از ایجاد شرطهای تو در تو زیاد جلوگیری میکنه ، امیدوارم مثال زیر منظورم و با کنه.

فرض کنید ما سه جدول داریم به نامهای ، (1)مشخصات مشتری، (2)مشخصات حساب ،(3) صورت حساب مالی . یک ارتباط بین جدول 1 و2 از طریق فیلد
CustomerId برقرار کردیم و یک ارتباط هم بین جدول 2و3 از طریق فیلد InvoicId .اما برای جستجوی اطلاعات مربوط به جدول 3 هر مشتری ، ما باید مشخصات
مربوط به مشتری را در جدول 1 چک کنیم و در صورت درست بودن اون مشخصات رکورد مربوطه که در جدول 3 قرار داره نمایش داده بشه ، که هیچ ارتباط مستقیم بین جدول 1 و 3 وجود نداره پس بصورت زیر عمل میکنیم


Select * From (3)Invoice where InvoicId
in ( Select InvoicId from (2)AccountProperties where CustomerID in ( Select CustomerID from (1)CustomerProperties where IDNum = @IDNum and
Name like @Name and Family like @Family))

همونطور که معلومه فیلدهای Name و Family و IDNumمربوط به جدول 1 که در صورت پیدا شدن اونها اطلاعات جدول 3 نمایش داده میشه.

اما اگر یک فیلد به کلید خارجی مثل IdNum در جدول 3 وجود داشت احتیاج به سه خط دستور نبود و بصورت زیر مینوشتیم


Select * From Invoice where IdNum
in ( Select IdNum from CustomerProperties where IDNum = @IDNum and
Name like @Name and Family like @Family))

امیدوارم خوب گفته باشم.

ایندکس گذاری مناسب بطور حتم در سرعت دستیابی به رکوردها تاثیر میذاره اما این شرطهای تو در تو
و محاسبات منطقی ، زمانی که در یک لحظه چند هزار query روی سرور انجام میشه آیا میتونه روی سرعت و کارایی سرور تاثیر گذار باشه؟