به نظرتون برای تعریف کلید اصلی (primary key) بهتره نوع داده ای از نوع int باشه یا Guid ؟
همچنین در مورد ایندکس گذاری این فیلد و سرعت چه معایب یا مزایایی برای هر کدوم از این 2 نوع Data Type وجود داره ؟
تا جایی که بنده تجربه کردم int برای برنامه نویسی راحت تره و دردسر کمتری داره، اما Guid یک سری جاهای خاص بهتره. مثلا بهترین مزیتی که برای من داشت یونیک بودن تو کل پروژه بود.
توی یک پروژه ای نیاز داشتم چیزی شبیه به shortcut درست کنم برای تمام مدلها، اگر از نوع عددی استفاده میشد duplicate داشتم چون شماره یک توی مطالب هم بود توی دسته ها محصولات پیامها و.. بود اما Guid کاملا یکتا بود.
حالا از نظر منطق خوب عددی با معنی تره، وقتی آی دی 1 داری میدونی شماره ش یک هست رکورد اوله و... ولی Guid باشه مشخص نیست این چیزاش
اما من با منطق اینکه اگر داده هام طی یک ماه به بالای هزارتا ممکنه برسه مثل جدول کاربران رو از نوع guid میزارم یا مثل محصولات و جاهایی مثل رول ها عددی میزارم.
هرچند خیلی کم پیش میاد همون ظرفیت عددی هم پر بشه اما برای چند آینده خیلی مهمه این موضوع رعایت کنید اگر به هر دلیلی پروژه رکورداش زیاد بشه به مشکل میخورید
از طرفی به یکی بگی کد محصول یا کد کاربریت 100 یا 200 قشنگ نیست و یه چیز دیگم هست حدثش خیلی سخته
سه نوع کلید میتونید داشته باشید.
کلیدهای طبیعی (مثل کد ملی ، شماره دانشجویی و ...)
کلیدهایی که توسط دیتابیس تولید میشن
کلیدهایی که با GUID تولید می کنید.
بهترین حالت GUID هست چون برای تولید شدن نیاز به دیتابیس نداره. جدا از دیتابیس هم قابل تسته و به صورت جهانی گارانتی شده که یکتا هست دلیل دیگه ی اهمیت GUID اینه که قبل از اینکه رکورد در دیتابیس ذخیره بشه کلیدش مشخصه و میتونید کلید رو به جداول دیگه که ممکنه بهش نیاز داشته باشن اطلاع بدید. در میکروسرویس ها و سیستمها غیر متمرکز (distributed) ممکنه اطلاعات به صورت موقت در کش ذخیره بشه و بعدا به دیتابیس اصلی منتقل بشه و نمیشه روی کلید تولید شده در سمت دیتابیس حساب کرد. الگوریتمهایی مثل HiLo هم وجود داره که کلید رو در دیتابیس تولید میکنه ولی نیاز به ذخیره سازی نداره...
سلام صددرصد Guid
اولا به خاطر امنیت صفحات و رکوردها
دوما اگر فقط به احراز هویت صفحات خودتان اکتفا و از لحاظ امنیتی به صفحات خودتان رسیدگی نکنید رکورد شما برای هر جدولی که باشد در خطر خواهد بود برای مثال فرض کنید سیستمی را طراحی کردید که کاربران عادی در آن ثبت نام میکنند و هر کدام با یوزر و پسورد خودشان وارد شده اند ... حالا اگر متدها را آشنا باشند در آدرس بار مرورگر هر کاربر به راحتی میتواند به جز اطلاعات خودش به اطلاعات دیگران دسترسی داشته باشد و آن را ویرایش و حدف نماید ... البته این دو کاربر فقطط می توانند به اطلاعات صفحات یوزر دسترسی داشته باشند و نه صفحات ادمین اینحاست که guid تا حدوی به شما کمک می کند که از این گونه حملات جلوگیری کنید برای مثال اگر کاربر اول در آدرس بار: www.smtc.ir/dekete?ID=1 را داشته باشد کاربردوم با همین آدرس می تواند به آدرس آن دسترسی داشته باشد مگر اینکه در کنترلر آن را چک کنید که آیا این آیدی که درخواست شده مربوط به کاربر جاری است یا خیر... ولی اگر GUID استفاده شود به خاطر اینکه رشته ی آن پیچیده ساخته میشود امنیت بیشتری نسبت به int یا long دارد... امیدوارم متوجه منظور این جواب شده باشید
با تشکر
سلام به همگی
بستگی به نوع و حجم پروژه داره معمولا برای پروژه هایی که تعداد رکورد ها از کل حجم 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 رجوع کنید که کاملا براتون روشن بشه.
سلام خدمت دوستان
درخصوص مواردی که عنوان کردید من هم ابهاماتی دارم. اگر راهنمایی بفرمایید ممنون میشم.
برنامه من تعداد جداول بسیار زیادی داره و نگرانی من تنها اطلاعات کاربر نیست بلکه یک جدول محصول که باید قیمت براش ثبت بشه دارای یک ID هستش که برای کاربر در مروگر ارسال میشه. کاربر میتونه در زمان ارسال اطلاعات مقدار ID را از 10 به 15 تغییر بده و اگر شماره ID = 15 در بانک وجود داشته باشه عملا تغییرات در ردیف دیگه اعمال میشه.
در یک پروژه من در زمان ارسال مقادیر ID که از نوع Int بودند، اعداد رو به یک مقدار رمزشده تبدیل می کردم و در انتها هم مقدار ID و هم مقدار رمزشده را برای مرورگر ارسال می کردم و در زمان دریافت اطلاعات، مقدار رمزشده را از رمز خارج می کردم و با مقدار ID دریافت شده مقایسه می کردم و اگر همسان بودند که ادامه برنامه اجرا می شد و در غیر اینصورت برای کاربر پیغام خطا صادر میشد.
در مورد روش کاری که گفتم، اگر تمام کلیدها GUID بود میشد تا حدی این چالش را از بین برد. اما سوال من این هستش که در نهایت برای برنامه های تحت وب چه روشی بهتره؟
تشکر
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1156
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
594
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
346
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
307
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4262
- پاسخ :
1
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
653
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3169
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3250
- پاسخ :
1
|
تاریخ :
1403/04/12
- ساعت :
07:27:00 PM
- بازدید :
655
- پاسخ :
0
|
تاریخ :
1403/01/29
- ساعت :
08:08:00 AM
- بازدید :
684
- پاسخ :
4
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
49
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
88
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1346
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1156
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
594
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|