ستون کلید اصلی در دیتابیس از نوع int بهتر است یا Guid
به نظرتون برای تعریف کلید اصلی (primary key) بهتره نوع داده ای از نوع int باشه یا Guid ؟
همچنین در مورد ایندکس گذاری این فیلد و سرعت چه معایب یا مزایایی برای هر کدوم از این 2 نوع Data Type وجود داره ؟
پاسخ هوش مصنوعی
انتخاب بین نوع داده ای int و Guid برای کلید اصلی در دیتابیس بسته به نیازهای خاص پروژه شما متفاوت است. در زیر مزایا و معایب هر یک بررسی می شود:
مزایای استفاده از int:
- اندازه کوچک تر:
intمعمولاً 4 بایت حجم دارد، در حالی کهGuidمعمولاً 16 بایت است. این موضوع می تواند بهینه سازی های عملکردی خوبی به همراه داشته باشد. - سرعت بیشتر: مقایسه های عددی معمولاً سریع تر از مقایسه های رشته ای است که در
Guidباید انجام شود. - شفافیت:
intبه راحتی قابل خواندن و مدیریت است و در داده های چندگانه، توالی آن راحت تر قابل پیگیری است.
معایب استفاده از int:
- محدودیت: در صورتی که تعداد رکوردها از حدود
2,147,483,647بیشتر شود، دیگر نمی توانید ازintاستفاده کنید. این در موردGuidصدق نمی کند.
مزایای استفاده از Guid:
- یونیگ بودن:
Guidتضمین می کند که مقادیر به صورت جهانی یکتا هستند، که در سیستم های توزیع شده مفید است. - اجتناب از تصادم: در صورت استفاده در محیط های توزیع شده، احتمال وقوع تصادم کمتر است.
معایب استفاده از Guid:
- حجم بزرگ تر: همان طور که اشاره شد،
Guidحجم بالاتری دارد و می تواند به اندازه ی پایگاه داده آسیب بزند. - سرعت همچنان پایین تر: مقایسه و ایندکس گذاری بر روی
Guidبه دلیل اندازه ی بزرگتر و نوع داده ای آن، ممکن است کندتر باشد.
در نهایت، انتخاب بین int و Guid بستگی به نیازهای خاص برنامه، سایز دیتابیس و عملکرد مورد انتظار دارد. اگر نیاز به مقادیر یکتا و توزیع شده دارید، Guid مناسب است. اما اگر به عملکرد و کارایی در یک سیستم متمرکز اهمیت می دهید، int می تواند گزینه بهتری باشد.
تا جایی که بنده تجربه کردم 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 بود میشد تا حدی این چالش را از بین برد. اما سوال من این هستش که در نهایت برای برنامه های تحت وب چه روشی بهتره؟
تشکر
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- مشکل تاریخ شمسی در سی شارپ
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF