دسته بندی ها
02:43 1398/08/20

ستون کلید اصلی در دیتابیس از نوع int بهتر است یا Guid

مشخصات سوال کننده :
کاربر : hamdola     امتیاز کاربر : 121     رتبه کاربر : 12
دسته بندی : سی شارپ Vb.Net PHP Android

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 6706
پاسخ دهنده : pedram_khan 02:47 1398/08/20

تا جایی که بنده تجربه کردم int برای برنامه نویسی راحت تره و دردسر کمتری داره، اما Guid یک سری جاهای خاص بهتره. مثلا بهترین مزیتی که برای من داشت یونیک بودن تو کل پروژه بود.
توی یک پروژه ای نیاز داشتم چیزی شبیه به shortcut درست کنم برای تمام مدلها، اگر از نوع عددی استفاده میشد duplicate داشتم چون شماره یک توی مطالب هم بود توی دسته ها محصولات پیامها و..  بود اما Guid کاملا یکتا بود.

حالا از نظر منطق خوب عددی با معنی تره، وقتی آی دی 1 داری میدونی شماره ش یک هست رکورد اوله و...  ولی Guid باشه مشخص نیست این چیزاش

اما من با منطق اینکه اگر داده هام طی یک ماه به بالای هزارتا ممکنه برسه مثل جدول کاربران رو از نوع guid میزارم یا مثل محصولات و جاهایی مثل رول ها عددی میزارم.
هرچند خیلی کم پیش میاد همون ظرفیت عددی هم پر بشه اما برای چند آینده خیلی مهمه این موضوع رعایت کنید اگر به هر دلیلی پروژه رکورداش زیاد بشه به مشکل میخورید

از طرفی به یکی بگی کد محصول یا کد کاربریت 100 یا 200 قشنگ نیست و یه چیز دیگم هست حدثش خیلی سخته

به این پاسخ امتیاز بدهید    2
امتیاز: 277 رتبه: 6
پاسخ دهنده : fateme 09:05 1398/08/20

سه نوع کلید میتونید داشته باشید. 

کلیدهای طبیعی (مثل کد ملی ، شماره دانشجویی و ...) 
کلیدهایی که توسط دیتابیس تولید میشن 
کلیدهایی که با GUID تولید می کنید. 

بهترین حالت GUID هست چون برای تولید شدن نیاز به دیتابیس نداره. جدا از دیتابیس هم قابل تسته و به صورت جهانی گارانتی شده که یکتا هست دلیل دیگه ی اهمیت GUID اینه که قبل از اینکه رکورد در دیتابیس ذخیره بشه کلیدش مشخصه و میتونید کلید رو به جداول دیگه که ممکنه بهش نیاز داشته باشن اطلاع بدید. در میکروسرویس ها و سیستمها غیر متمرکز (distributed) ممکنه اطلاعات به صورت موقت در کش ذخیره بشه و بعدا به دیتابیس اصلی منتقل بشه و نمیشه روی کلید تولید شده در سمت دیتابیس حساب کرد. الگوریتمهایی مثل HiLo هم وجود داره که کلید رو در دیتابیس تولید میکنه ولی نیاز به ذخیره سازی نداره...

به این پاسخ امتیاز بدهید    1
امتیاز: 1617 رتبه: 2
پاسخ دهنده : mghb 03:54 1398/08/23

سلام صددرصد Guid

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

دوما اگر فقط به احراز هویت صفحات خودتان اکتفا و از لحاظ امنیتی به صفحات خودتان رسیدگی نکنید رکورد شما برای هر جدولی که باشد در خطر خواهد بود برای مثال فرض کنید سیستمی را طراحی کردید که کاربران عادی در آن ثبت نام میکنند و هر کدام با یوزر و پسورد خودشان وارد شده اند ... حالا اگر متدها را آشنا باشند در آدرس بار مرورگر هر کاربر به راحتی میتواند به جز اطلاعات خودش به اطلاعات دیگران دسترسی داشته باشد و آن را ویرایش و حدف نماید ... البته این دو کاربر فقطط می توانند به اطلاعات صفحات یوزر دسترسی داشته باشند و نه صفحات ادمین اینحاست که guid تا حدوی به شما کمک می کند که از این گونه حملات جلوگیری کنید برای مثال اگر کاربر اول در آدرس بار: www.smtc.ir/dekete?ID=1 را داشته باشد کاربردوم با همین آدرس می تواند به آدرس آن دسترسی داشته باشد مگر اینکه در کنترلر آن را چک کنید که آیا این آیدی که درخواست شده مربوط به کاربر جاری است یا خیر... ولی اگر GUID استفاده شود به خاطر اینکه رشته ی آن پیچیده ساخته میشود امنیت بیشتری نسبت به int یا long دارد... امیدوارم متوجه منظور این جواب شده باشید

با تشکر

ویرایش شده در پنج شنبه 23 آبان 1398 ساعت 03:55:48
به این پاسخ امتیاز بدهید    ‎−1
امتیاز: 27 رتبه: 26
1 نظر
taqech : معمولا امنیت رو از راه های دیگری مثل هش کردن آی دی، بررسی توکن و سشن و تطابق شناسه کاربر با شناسه وارد شده و ... تامین می کنند و تنها به آنچه در نوار آدرس وارد شده اکتفا نمی کنند مگر این که برنامه نویس خیلی ناشی و مبتدی باشه

امتیاز کاربر : 10   رتبه کاربر : 70   تاریخ ثبت : 09:55 1401/01/05
پاسخ دهنده : miladhelmi 13:05 1398/09/07

سلام به همگی

بستگی به نوع و حجم پروژه داره معمولا برای پروژه هایی که تعداد رکورد ها از کل حجم int و یا حتی bigint بیشتر باشه از GUID استفاده میشه.
مثلا رکورد های پبام یک سیستم پیامرسان مثل تلگرام  رو در نظر بگیرید، میلیاردها پیام داخلش هست که همیشه در حال اضافه شدن هست و نمیشه توی int یا حتی bigint جا داد.
در این حالت میان از GUID استفاده می کنن با سرور های خیلی قدرتمند چون یکی از معایبش کند شدن واکشی دیتا هست و به پردازش سریع نیاز داره چون نوع داده مثلا int عددی هست و به صورت پشت سر هم ایندکس میشه اما GUID اصلا این طور نیست و سیستم باید تک تک رکورد ها رو بررسی کنه تا برسه به رکورد مورد نظر شما ... البته یه سری راه ها هست که GUID رو هم ایندکس می کنن از طریق تاریخ و ... کنترل میشه که باز هم مثل داده عددی ایندکس نمیشه.

در مورد موضوعی که دوستمون mghb گفتن اصلا اینطور نیست، شما باید امنیت پروژه رو توی کد فراهم کنی اینکه یه کاربر بیاد یه ID دیگه رو وارد کنه و وارد یه حساب کاربری دیگه بشه یعنی امنیت پروژه تون صفره چرا؟ چون باید بعد از اینکه کاربر لاگین میکنه اطلاعاتش رو توی کوکی به صورت Encrypt ذخیره کنین و وقتی میخواد ID دیگه ای رو از طریق URL بزنه شما اون مقدار کوکی رو با اطلاعات کاربر جاری (البته در پاسخشون اشاره به این موضوع هم کردن) مقایسه می کنی و اگر برابر نبود باید به صفحه لاگین هدایت بشه. پس اگر برای این مورد می خواید GUID استفاده کنید خیلی اصولی نیست ...

در اکثر موارد همون int و در موارد بزرگتر bigint پاسخگوی کار شما هست و نیازی به GUID نیست.

نوع داده int تعداد 2,147,483,647 * 2 رکورد رو پوشش میده

نوع داده bigint تعداد 9,223,372,036,854,775,808 * 2 رکورد رو پوشش میده

آیا کل رکوردهای پروژه شما از این موارد بیشتره ؟ اگر بیشتر بود قطعا باید از GUID استفاده کنید 

برای اطلاعات بیشتر باید به مباحث SQL Server رجوع کنید که کاملا براتون روشن بشه.

به این پاسخ امتیاز بدهید    2
امتیاز: 25 رتبه: 28
پاسخ دهنده : mmbguide 10:35 1401/11/28

سلام خدمت دوستان

 

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

برنامه من تعداد جداول بسیار زیادی داره و نگرانی من تنها اطلاعات کاربر نیست بلکه یک جدول محصول که باید قیمت براش ثبت بشه دارای یک ID هستش که برای کاربر در مروگر ارسال میشه. کاربر میتونه در زمان ارسال اطلاعات مقدار ID را از 10 به 15 تغییر بده و اگر شماره ID = 15 در بانک وجود داشته باشه عملا تغییرات در ردیف دیگه اعمال میشه.

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

در مورد روش کاری که گفتم، اگر تمام کلیدها GUID بود میشد تا حدی این چالش را از بین برد. اما سوال من این هستش که در نهایت برای برنامه های تحت وب چه روشی بهتره؟

 

تشکر

 

به این پاسخ امتیاز بدهید    0
امتیاز: 0 رتبه: 7018
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود