PDA

View Full Version : بهترین نوع داده برای تعریف کلید اصلی



FM.ALPACHINO
سه شنبه 13 اردیبهشت 1390, 12:35 عصر
سلام دوستان
من همیشه تو جداولی که طراحی می کنم نو ع داده ای رو برای کلید اصلی int می گیریم ، به نظر شما بهترین نوع همینه و دلایل اصلی برای استفاده از این توع چیه؟
با تشکر

حمیدرضاصادقیان
سه شنبه 13 اردیبهشت 1390, 16:33 عصر
سلام.
انتخاب کلید اصلی این نیست که در هرجدول یک فیلد id بذارید بشه کلید اصلی.
ممکنه در یک جا کدملی شخص باشه. ممکنه یک جا شماره تلفن باشه و ....
باید به ساختار جداول نگاه کرد.
الزاما این نیست که حتما هم باید int باشه. بسته به نوع داده ای که برای مامهم هست یونیک باشه کلید رو انتخاب میکنیم و تایپش هم همون تایپ خود فیلد است.

Galawij
چهارشنبه 14 اردیبهشت 1390, 10:19 صبح
سلام
به نظر من کلید اصلی جداول ما بسته به تعداد سطرهای آن جدول می تواند (smallint،intو bigint) باشد.
این نوع تعریف کلید اصلی بعداً در گزارشات برنامه کار رو خیلی راحت تر می کنه.
تعریف کردن کد ملی و یا شماره تلفن به عنوان کلید اصلی ممکنه در دراز مدت و عمر پروژه شما مشکل ساز بشه. مثلاً ممکنه کد ملی های صادر شده از طرف اداره ثبت اسناد عوض بشه و یا اینکه شماره تلفنهای 7 رقمی در آینده تبدیل به 8 رقمی شوند.

حمیدرضاصادقیان
چهارشنبه 14 اردیبهشت 1390, 10:44 صبح
این نوع تعریف کلید اصلی بعداً در گزارشات برنامه کار رو خیلی راحت تر می کنه.

نوع تعریف کلید اصلی ارتباطی با گزارشات نداره.

ماهیت کلید اصلی چیست؟
کلید اصلی برای این در جداول قرار داده میشه :
1- اطلاعات هر ردیف به صورت یونیک باشند.
2- اطلاعات هر ردیف وابسته به کلید اصلی باشند.
3- افزایش سرعت در گزارشات

خوب با این تعاریف این نیست که برای هر جدول ما بیایم یک فیلد Auto Increment قرار بدیم و به عنوان کلید ازش استفاده کنیم.
مثلا در سیستم انبار در قسمت تعریف کالا کد کالای شما دارای کاراکتر هم هست. باید حداقل 16 رقم باشه.و همچنین باید یونیک هم باشه. پس اینجا کد کالای شما که از نوع char یا varchar قرار داده میشه باید کلید شما بشه.



تعریف کردن کد ملی و یا شماره تلفن به عنوان کلید اصلی ممکنه در دراز مدت و عمر پروژه شما مشکل ساز بشه. مثلاً ممکنه کد ملی های صادر شده از طرف اداره ثبت اسناد عوض بشه و یا اینکه شماره تلفنهای 7 رقمی در آینده تبدیل به 8 رقمی شوند.

این رو به صورت یک مثال عرض کردم.
اگر هم نیاز به تغییر باشه شما کار خاصی نیازی نیست انجام بدید. فقط طول فیلد شما تغییر میکنه و ارتباطی به کلید بودن یا نبودنش نداره. اگر کلید نباشه یعنی شما طول فیلد یا نوعش رو عوض نمیکنید؟؟!!

Galawij
چهارشنبه 14 اردیبهشت 1390, 11:13 صبح
نکاتی که باید در نظر گرفته شوند:
1.این کلید اصلی به صورت کلید خارجی در سایر جداول هم استفاده می شه.
2.مقایسه نوع داده int در گزارشات راحت تر از نوع داده nvarchar هست.
3.جلوگیری از انواع خطاهای تعریف کلیدهای یکتا
من دیدم که یک مدل ماشین یکسان در دو شهر مختلف دارای یک شماره پلاک مساوی بودند.

حمیدرضاصادقیان
چهارشنبه 14 اردیبهشت 1390, 13:34 عصر
این کلید اصلی به صورت کلید خارجی در سایر جداول هم استفاده می شه.
خوب این چه تناقضی با نوع داده کلید داره؟؟


مقایسه نوع داده int در گزارشات راحت تر از نوع داده nvarchar هست.
خیر تفاوت محسوسی نداره.


جلوگیری از انواع خطاهای تعریف کلیدهای یکتا

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


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

شاید پلاکها یکی باشند ولی کد ایران 11و22و... به تفکیک استان های مختلف فرق داره.
اگر دو پلاک یکی باشه میدونید در سیستم نیروی انتظامی چه افتضاحی به بار میاد. هربار که یکی رو جریمه می کنند برای دو نفر یا چند نفر جریمه درج میشه.!!

tooraj_azizi_1035
چهارشنبه 21 اردیبهشت 1390, 13:55 عصر
سلام،
در انتخاب نوع داده ای برای کلید اصلی باید ابتدا ببینیم چه صفتی از موجودیتی که قرار است جدول آن را ایجاد کنیم می تواند آن موجودیت را از سایرین تفکیک کند هر کدام از این صفات که هزینه کمتری را تحمیل کند همان را انتخاب می کنیم. ماهیت آن صفت تعیین کننده نوع داده ای کلید اصلی جدول است نه اینکه همیشه کلید اصلی از نوع اعداد صحیح باشد!
مثلاً در مورد اتوموبیل باید پلاک آن را به عنوان کلید در نظر بگیریم چون ما به دنبال اتوموبیلی با پلاکی خاص هستیم. پلاک هم نوع داده ای متنی است نه عددی. ما می توانیم پلاک را به عنوان کلید در نظر نگیریم و خودمان یک ستون عددی اضافه کنیم و آن را کلید اصلی درنظر بگیریم علاوه بر این ستون پلاک را هم اندیس کنیم چون قرار است بر حسب پلاک جستجو کنیم. اما با اضافه کردن فیلد عددی جدید چه اتفاقی می افتد؟ در حالی که ما به دنبال اتوموبیلی با فلان پلاک هسیم و جستجوی ما بر پایه این فیلد است نه آن فیلد عددی!