حکایت شیخ و مریدان : انتخاب GUID برای کلید اصلی
روزی شیخ در سایهی درختی در انتهای دهاتشان نشسته بود و از آرامش و صدای کلاغان لذت میبرد که ناگهان مریدی بر وی نازل گشت و به صورت آتش به اختیار وی را تکان های نامردانهای داد و گفت:یا شیخ.مسئلتون ؟
شیخ که هنوز در ریکاوری از آن حرکت عجیب مرید بود گفت:
-مسئلتون و درد، مردک نمی بینی در حال لذت بردنم؟؟؟ حال بگو ببینم چه شده؟
مرید گفت : ای شیخ آیا استفاده از GUID برای کلید اصلی(Primary Key) جایز است؟؟؟
شیخ گفت : خیر!بدان و آگاه باش ای بشر که این کار جز درد و بدبختی برای DB ندارد!!
مرید که سخت قفل کرده بود گفت: واااااااااات؟؟؟برای چه؟؟؟
شیخ گفت : زمانی که شما جدول را میسازی عموما دو مسئله وجود دارد که معمولا با هم گرفته میشوند یکی کلید اصلی (Primary Key) و دیگری Clusterd Index!
مرید که قیافهاش به میزان کافی گیج شده بودن را نشان میداد، استثنا هیچ نگفت و شیخ ادامه داد:
بله!وقتی میای میگی این ستون Id مرا Primary Key بکن بانک اطلاعاتی به صورت پیش فرض یک Clustered Index نیز برای آن میسازد!خب این Primary Key را که همه میدانیم یعنی چه!تکراری نباشد!NULL نباشد!و از این حرفها، اما بحث اصلی روی Clustered Index می باشد!تاحالا فکر کردی که این Clustered Index چه میکنه؟؟؟اصلا فرقش با Non-Clustered Index چیه؟؟؟چرا فقط یکی ازش میسازن؟؟؟و دیگه نمیشه ازش ساخت!(توی جدول هاااا)
مرید گفت:خیر شیخ!اصلا تاکنون نفکریده بودم! شما که غریبه نیستی اصلا نمیدونستم اینا جدان!
شیخ ادامه داد: زمانی که Clustered Index میسازیم، جدول ما به صورت خودکار و زمان ورود داده بر اساس این Clustered Index مرتب میشود!یعنی اگر شما Clustered Index را یک ستون نرمال عددی در نظر بگیری اگر ابتدا ID 3 را وارد کنی و بعد ID 2 را وارد کنی، ردیف دومی که اضافه بشه میره قبل ردیف اول میشینه!(که حالا این خودش چجوری این کار میکنه بسته به دیتابیس روش کارش متفاوته که خارج از حوصله این روضه هایی هستش که میخونم!)حالا اگه شما بیای این ستون رو Identity قرار بدی عالی میشه یعنی دیگه هزینه جابه جایی هم نمیدی!و پیج های داده هات مرتب هستن(یکم توی پست IO در این خصوص رفتم روی منبر!)حالا چه فایده داره!وقتی میگی من فلان داده رو میخوام، دیتابیس ما باهوشه و بلده چجوری سریع بره سراغش(رجوع شود به ساختمان داده بخش B-Tree ( اگه از GUID استفاده کنی عملا گند زدی به این مرتب سازی!چون تصادفی هستش دیتابیس دردسر زیادی داره که مرتب سازی کنه! آره اینجوریاس!
مرید گفت : یا شیخ!ملتفت فرمودی!اما شرایطی هستش که نمیشه Identity استفاده کرد مثلا Id یک جدول بسته به تراکنش جداول دیگه هستش و بسیار هم دردسر ساز.امکان داره در دو تراکنش ایزوله ما یکهو دوتا Id یکسان تولید کنیم!و هزاران خطاهای ارزنده دیگر!حال چه کنیم؟؟؟
شیخ گفت:بدان و آگاه باش که میتوانی از Sequential Table ها استفاده کنید خب!
مرید گفت : شیخ جواب نمیدهد به مولا!!
شیخ گفت :ای بابا تو هم گیری هاااااا!دو تا ستون تعریف کن یکی رو عددی بزار Clustered Index را روی آن و دیگری را GUID کن Primary Key را روی آن!هرچه باشد از اینکه هردو یکی باشد بهتر است!
مرید که کف کرده بود، خشتک درید و به سر بر کوه های آلپ نهاد!
مطلبی دیگر از این انتشارات
ACID چیست؟
مطلبی دیگر از این انتشارات
داستان Stored Procedure و گوربه
مطلبی دیگر از این انتشارات
حکایت شیخ و مریدان : Bloom Filter