View Full Version : نوغ فیلد اصلی
maktab
سه شنبه 29 آذر 1390, 22:35 عصر
سلام
شما فیلد اصلی (کلید) را معمولا چه نوعی معرفی می کنید؟ مثلا برای نظرات یا اخبار.
خیلی ها را دیدم که int معرفی می کنند و توی sql تنظیم می کنند که بصورت صعودی افزایش پیدا کنه (خودکار).
ولی این یه مشکل داره!: فرض کنید یه کاربری (مدیر) هی مطلب ارسال کنه و حذف کنه. اون موقع محدودیت int تمام میشه!! چکار باید کرد؟
jaykob
سه شنبه 29 آذر 1390, 22:59 عصر
سلام
شما بر اساس نیازتون باید انتخاب کنید نوع فیلد رو بازه int به شکل زیر است و 4 بایت رو اشغال می کنه
-2147483648 through 2147483647
و اگر واقعا فکر می کنید اطلاعات زیاد هستند می تونید bigint تعریف کنید که فکر نمی کنم نیاز باشه . این نوع 8 بایت رو اشغال می کنه و بازه آن به شکل زیر است :
-9223372036854775808 through 9223372036854775807
انواع دیگه مثل smallint و tinyint هم بر اساس کاربرد می توانید استفاده کنید
maktab
چهارشنبه 30 آذر 1390, 00:27 صبح
من که تا حالا ندیدم تموم بشه ! :چشمک:
شما موردی رو سراغ داری که تموم شده باشه ؟؟
برای مواردی که عضو میتونه متن (مطلب، خبر یا هر چیز دیگه) را بفرسته ممکنه مشکل به وجود بیاد بخصوص اگر کاربر شیطنت کنه!!
سلام
شما بر اساس نیازتون باید انتخاب کنید نوع فیلد رو بازه int به شکل زیر است و 4 بایت رو اشغال می کنه
-2147483648 through 2147483647
و اگر واقعا فکر می کنید اطلاعات زیاد هستند می تونید bigint تعریف کنید که فکر نمی کنم نیاز باشه . این نوع 8 بایت رو اشغال می کنه و بازه آن به شکل زیر است :
-9223372036854775808 through 9223372036854775807
انواع دیگه مثل smallint و tinyint هم بر اساس کاربرد می توانید استفاده کنید
من محدودیت را میدونم و بدلیل اینکه مشکل پیش نیاد همیشه تویه برنامه ویندوزی کلید را int نمیزارم!! همیشه از string استفاده میکنم. (هر وقت نیاز هست فیلد من محاسباتی باشه از int استفاده می کنم).
اشکالی که پیش میاد:
فرض کنید کلید را bigint بزاریم و Identity اون رو yes بکنیم بعد یه عضو بیاد هی مطالب بنویسه و حذف کنه!!
حساب کنید فیلد برابر 5 باشه وقتی اضافه میشه برابر 6 میشه و... 7، 8، 9، 10 و...
حالا اگر 6 تا 10 را پاک کنه عدد بعدی از 11 شروع میشه پس جدول ما 5 تا فیلد پر شده درصورتی که شمارنده 11 است.
این مشکل بخاطر همان Identity بودنشه! چطور میشه برطرفش کرد یعنی وقتی یکی حذف بشه ترتیب هم درست بشه
fakhravari
چهارشنبه 30 آذر 1390, 01:08 صبح
با سلام
میتونید جدول این طوری 0 کنید
use DatabaseName
go
truncate table TableName
maktab
چهارشنبه 30 آذر 1390, 01:10 صبح
با سلام
میتونید جدول این طوری 0 کنید
use DatabaseName
go
truncate table TableName
صفر!!!! صفر برای چی!!؟
برای حالتی گفتم که تویه جدول اطلاعات وجود داشته باشه
fakhravari
چهارشنبه 30 آذر 1390, 01:14 صبح
اره اون که شما میگید درسته اما این برای زمانی به کار میره که ما میخواهیم برای مثال شماره فاکتور داشته باشیم.
اون کاری که شما میخواهید برای جایی خوبه که از ما کد نخوان
maktab
چهارشنبه 30 آذر 1390, 01:29 صبح
اره اون که شما میگید درسته اما این برای زمانی به کار میره که ما میخواهیم برای مثال شماره فاکتور داشته باشیم.
اون کاری که شما میخواهید برای جایی خوبه که از ما کد نخوان
به نظرت اصلا نیاز هست int معرفی بشه!!؟ همان طور که گفتم من همیشه string معرفی می کنم. (برای ویندوزی. برای تحت وب نمیدونم)
مثلا برای جدول لینکها:
- شماره لینک
- عنوان لینک
- آدرس لینک
- توضیحات
معمولا خیلیا میان یه شماره لینک میزارن و بعنوان int و کلید اصلی معرفیش می کنند و امکان داره اون مشکلی که من گفتم پیش بیاد!
ولی به نظر من نیازی به گذاشتن شماره لینک نیست! خب همان آدرس لینک میشه کلید اصلی! اینکارا برای برنامه های تحت ویندوز به مشکل زیادی بر نمیخوریم ولی برای تحت وب چون سرعت جستجو خیلی ملاک هست و... نمیدونم اینطوری کاربرد داره یا نه؟
البته این مثال بود. برای تمام جداول در نظر بگیرید.
چه کار باید کرد؟ به نظر من نمیشه روی int حساب باز کرد.
fakhravari
چهارشنبه 30 آذر 1390, 01:35 صبح
کلا بیشتر محاسبات حالا در .net از تابع string استفاده میشود خوب این کاری که شما میگید باید برسی شود چون به صرفه نیست
maktab
چهارشنبه 30 آذر 1390, 02:05 صبح
من همیشه این اصل رو رعایت میکنم که قرار نیست کلید اصلی int باشه. کلید اصلی باید فیلدی باشه که قابل تکرار نباشه. مثلا آدرس لینک در جدول لینکها، ایمیل نظر دهنده و زمان ارسال نظر در جدول نظرات و...
فقط سوال اصلی من اینه: اگر نوع کلید اصلی string باشه به نسبت int چقدر هزینه بره (از نظر جستجو)
حمیدرضاصادقیان
چهارشنبه 30 آذر 1390, 07:54 صبح
سلام.
شما میتونید نوع رو Int در نظر بگیرید ولی از نوع Identity نذارید تا بتونید خودتون مقدار رو مشخص کنید. با این روش هرچند بار کاربر ردیف هارو حذف کنه شما مجبورید آخرین شماره رو پیدا کرده و یکی به اون اضافه کنید و درج کنید.
به جز این مورد مقایسه عددی نسبت به رشته ای سریعتر صورت میگیره.
همچنین مقدار بایت کمتری نیز اشغال خواهد کرد.
پس در نتیجه در Page ها فضای کمتری اشغال میکنه و سرعت خواندن آن بیشتره.
Saman Hashemi
چهارشنبه 30 آذر 1390, 07:55 صبح
خیلی بیشتر، اگر اشتباه نکنم Sql تو حالت رشته برای اینکه تکراری نباشه میاد مقایسه میکنه حالا شما فرض کن لینکت 200 حرف داره و مرتب باید با لینکهای دیگه مقایسه بشه تا به این نتیجه برسه که تکراری نیست اما در حالت int به فرض اینکه با همه مقایسه کنه که فکر نکنم هر کلید یکبار مقایسه میشه...!
حالا یه کلید حذف بشه چه مشکلی پیش میاد؟نهایتا کسی این لینک میزنه اگر درست مدیریت شده باشه یه صفحه ارور میاد یافت نشد همون کاری که خیلی شرکت میکنند مثل خود مایکروسافت که الان برای لینک های قدیمیش همچین کاری میکنه...!
اگر به کتابهای اصول طراحی بانک یه نگاهی بندازید فکر نکنم هیچ کتابی string به عنوان کلید پیشنهاد بده دلیلشم هزینه زیادی که برای بدست آوردن ،تکراری بودن کلید، میشود...!
baktash.n81@gmail.com
چهارشنبه 30 آذر 1390, 08:02 صبح
سلام
در مورد اینکه محدوده int تموم بشه نمی دونم چی بگم ... چون واقعا اتفاق نمی افته اگر خیلی Transaction داری bigint که دوستمون گفت روش خوبیه ...
اما در خصوص اینکه کلید اصلی int باشه و Identity باشه یکی از مزیتها اینه که سرعت Insert خیلی زیاد می شه ... اگر از این فیلد جای دیگه به عنوان کلید خارجی استفاده بشه برای Join خیلی سریعتر عمل می کنه ...
و ... و .... و......
اگه جدول شما به 2 میلیون رکورد برسه اونوقت فرق کلید Int و String رو متوجه می شید ... امتحان کن ... از Execution Plan استفاده کن ...
اما جواب سئوالت من همیشه از Int و Identity استفاده می کنم خیلی از نرم افزار هایی هم که دیدم که میشده رو طراحیشون حساب کرد همین کاو می کنن ...
این Id در واقع کلید توکار نرم افزار هست یعنی کاربر هیچوقت مستقیم با این اعداد کار نمی کنه ... مثلا شماره نامه ای که تو یه دبیرخونه ثبت میشه یه فیلد دیگست که من شمارندشو جای دیگه نگه می دارم و خودم کنترلش می کنم ... اگر هم Identity ها حذف بشن و به ترتیب نباشن زیاد برام مهم نیست ... اگر هم بخوام تعداد رکورد ها رو بدست بیارم از count استفاده می کنم کاری با آخرین Id ندارم ...
maktab
چهارشنبه 30 آذر 1390, 11:20 صبح
سلام.
شما میتونید نوع رو Int در نظر بگیرید ولی از نوع Identity نذارید تا بتونید خودتون مقدار رو مشخص کنید. با این روش هرچند بار کاربر ردیف هارو حذف کنه شما مجبورید آخرین شماره رو پیدا کرده و یکی به اون اضافه کنید و درج کنید.
سلام
فرض کنید 1000 تا ردیف داشته باشیم به ترتیب از 1 تا 1000. حالا کاربر ردیف 50 را پاک کنه بعدش 51 بعدش 100 برای روشی که میگید باید چکار کرد؟
اگر جوری که من متوجه شدم سرعت پایین تر میاد چون هر بار حذف میشه باید خیلی از فیلد ها تغییر کنند.
maktab
چهارشنبه 30 آذر 1390, 11:29 صبح
حالا یه کلید حذف بشه چه مشکلی پیش میاد؟
در مورد اینکه محدوده int تموم بشه نمی دونم چی بگم ...
بحث من سر یکی دو تا حذف کردن نیست!!
مشکل من وقتی پیش میاد که یکی بخواد در سایت اختلال ایجاد کنه (با استفاده از همین محدودیت int).
مثلا:
فرض کنید یه قسمت در سایت باشه که بازدیدکننده بتونه نظر ارسال و مدیریت کنه (حذف و...). حالا بیاد با هر کاری (دستی، ربات و...) بفرسته و حذف کنه... چه مشکلی پیش میاد؟ البته این یه مثال بود همین مشکل برای مطالب و... هم میتونه پیش بیاد.
مشکل فوق برای وقتی هست که بصورت Identity معرفی بشه.
حمیدرضاصادقیان
چهارشنبه 30 آذر 1390, 11:49 صبح
این مشکلی که گفتید برای همون مثالی که زدید در حالت غیرIdentity هم بوجود میاد. در اصل اگر فکر میکنید بیشتر از 2 میلیارد ممکنه رکورد داشته باشه میتونید از Bigint استفاده کنید.
maktab
چهارشنبه 30 آذر 1390, 12:07 عصر
خب احتمالا باید فکر دیگری برای جلوگیری از این خرابکاری ها بکنم! چون من اطلاعات خیلی زیادی ندارم که نیازی بیش از محدودیت int داشته باشه.
یه سوال دیگه :لبخند:: به نظر شما بهتره کلید اصلی را Identity معرفی کنیم یا نه؟ برای یه سایت خبری. (جدول هایی مثل: مطالب - اخبار و...)
البته به غیر از برخی جداول که کلید اصلیشون معلومه (مثل جدول کاربران: نام کاربری).
راستی در sql امکانی هست که به غیر از معرفی کردن یک فیلد بعنوان کلید اصلی اون رو منحصر به فرد کنیم (داده تکراری نگیره)
------------
تازه برخی از مطالب مشابه موجود در انجمن را خوندم خیلی ها گفتند که نیاز نیست برای هر جدول یه شماره گذاشت (id)!! بهتره همان فیلد منحصر به فرد را کلید قرار بدیم.
مثلا برای کار من:
جدول لینک ها: آدرس لینک
جدول کاربران: نام کاربری
جدول موضوعات: عنوان موضوع
و...
موندم چه کنم!!! :گیج:
دوستانی که مقایسه کردن لطفا کمک کنند! در حالت اول (استفاده از id برای هر جدول): میشه گفت سرعت بالا میره ولی حجم اطلاعات هم افزایش پیدا میکنه که شاید سرعت را بیاره پایین! در حالت دوم: ممکنه در جستجو و... به دلیل نوع کلید اصلی سرعت پایین بیاد.
maktab
چهارشنبه 30 آذر 1390, 12:25 عصر
یکی از این تاپیک ها که دیشب داشتم میخوندم:
http://barnamenevis.org/showthread.php?285496-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D9%86%D9%88%D8%B9-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%DA%A9%D9%84%DB%8C%D8%AF-%D8%A7%D8%B5%D9%84%DB%8C
مدیر جان (حمیدرضاصادقیان (http://barnamenevis.org/member.php?4504-%D8%AD%D9%85%DB%8C%D8%AF%D8%B1%D8%B6%D8%A7%D8%B5%D 8%A7%D8%AF%D9%82%DB%8C%D8%A7%D9%86)) شما بخوبی اونجا توضیح دادید. ولی با توجه به دلایلی که دوستان در این تاپیک گفتن من نمیدون کدام به صرفه تر است!! معمولا میشه گفت اکثر جدول ها فیلد منحصر به فرد دارند (برخی یک فیلد برخی مجموع چند فیلد) ولی باز خیلی ها میان و از یه شماره int استفاده می کنند.
مثلا حتی برای یه جدول مطلب میشه چنین کلیدی داشت: (نام کاربری فرستنده + تاریخ ارسال (تاریخ و زمان دقیق ))
baktash.n81@gmail.com
چهارشنبه 30 آذر 1390, 17:20 عصر
راستی در sql امکانی هست که به غیر از معرفی کردن یک فیلد بعنوان کلید اصلی اون رو منحصر به فرد کنیم (داده تکراری نگیره)
اگه SQL 2008 دارید ... در حالت Design رو نام فیلد راست کلیک کنید ... Indexes/keys رو انتخاب کنید یک Index اضافه کنید و ISUnique را در حالت Yes قرار بدید.
البته Sql های ورژن های قبلی هم این امکان رو داره ولی ممکنه یکم اسم منوهاش متفاوت باشه درست یادم نیست ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.