تالار گفتمان nCIS.ir

نسخه‌ی کامل: نوع داده فیلد ها در mysql یا phpmyadmin
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
با سلام و احترام
درون انجمن جستجویی هم انجام دادم اما نتیجه ای نگرفتم چون سوالم مبهم و جوابی مبهم دارد. اینجا ذکر می کنم دوستان و جناب مهندس شهرکی استاد عزیزم محبت نمایند حقیر را راهنمایی کنند.
در رابطه با تنظیمات نوع داده برای فیلد هایی که درون جداول دیتابیس تولید می کنیم ابهاماتی همیشه داشته ام که نیاز به راهنمایی دارم .
فرض کنید قصد دارید دیتابیسی تولید کنید با جداول و فیلد های زیر


users
-------------
user_id
user_login
user_password

-------------
courses
-------------
course_id
course_name
-------------
user_courses
-------------
user_course_id
user_course_singup_date
-------------
files
-------------
file_id
orginal_file_name
fake_file_name
course_id
course_part_file
orginal_file_created_date
fake_file_crated_date 
expire_time_for_fake_file_name


اولین عبارت بین هر ---------- نام جدول و عبارت بعدی فیلد های آن جدول می باشد فرض مثال جدول کاربران سه فیلد داریم با نام های
user_id
user_login
user_password

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


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

همانطور که میدانید هر ییت کوچک‌ترین واحد حافظه ‌است که فقط دو مقدار صفر (۰) یا یک (۱) را می‌توان در آن ذخیره کرد.
و هر 8 بیت برار هست با یک بایت
هر کاراکتر 1 بایت از حافظه رایانه ما یا رایانه سروری که برنامه ما در آن اجرا شده را اشغال می کند که اگر حافظه رم رایانه ما یا سرور 1024 مگابایت باشد یعنی مقدار فوق العاده زیاد هنوز آزاد و در دسترس و قابل بهره برداری و استفاده می باشد.

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

بیشتر که خواسته باشم بپرسم یا درواقع باعث توضیحات بیشتر شوم برای اینکه این مطلب به عنوان یک منبع مفید برای انتخاب نوع داده در طراحی دیتابیس باشد :

در بعضی از اسکریپت ها و برنامه ها مشاهده می شود که از نوعی داده برای فیلد خاصی استفاده شده و مقدار آن را براربر با 255 قرار داده اند آیا این 255 یعنی 255 کاراکتر امکان درج در این فیلد وجود دارد ؟

و اگر این طور می باشد وقتی که کاربر مقداری را درج می کند که کمتر از 255 کاراکتر می باشد و ما در تنظیمات مقدار آن فیلد از عدد 255 استفاده کرده باشیم مقدار فضای اشغال شده به واسطه تنظیمی که ما انجام دادیم ولو اینکه کاربر 10 کاراکتر وارد کرده باشد باز هم به اندازه 255 کاراکتر فضا را اشغال خواهد کرد و این مقدار را از حافظه رم دستگاه استفاده خواهد کرد ؟

یعنی 255 بایت از حافظه اشغال شده در صورتی که کاربر ما به اندازه 10 بایت نیاز داشته و به اندازه همون 10 بایت مصرف کرده و اگر ما این روال را رعایت نکنیم باعث می شود که میزان فشار به منابع سرور در برنامه های بزرگتر بیشتر شده و این مسئله نیازمند هزینه های بیشتری خواهد شد که توجیه اقتصادی ندارد.


در رابطه با فیلد user_login و user_password مشاهده می شود افرادی این فیلد ها را برابر با نوع varchar  یا text قرار میدهند فرضا ما قصد داریم کاربر ما عددی برای عضویت نام کاربری که وارد می کند دارای کاراکتر های حروف بزرگ و کوچک لاتین عدد و آندرلاین بوده و نهایت 8 عبارت یا کاراکتر بیشتر نباشد :
اگر در انتخاب نوع داده از varchar استفاده شود برای اینکه قصد داریم بیشتر از 8 کاراکتر درون دیتابیس استفاده نشود مقدار این فیلد به چه شکلی باید تنظیم شود
اگر نوع  فیلد را text قرار دادیم مقدار باید به چه شکلی تنظیم شود چون قصد ما دریافت فقط 8 کاراکتر از کاربر به عنوان نام کاربری وی می باشد ؟
اگر نوع فیلد به صورت char قرار گرفت مقدار به چه شکلی تنظیم می شود ؟



فرضا نوع داده برای فیلد نام کاربری char قرار گرفت و مقدار آن 8 به این شکل چه مقدار از حافظه رم اشغال می شود ؟
فرضا نوع داده برای فیلد نام کاربری varchar قرار گرفت و مقدار آن 8 به این شکل چه مقدار از حافظه رم اشغال می شود ؟ 
فرضا نوع داده برای فیلد نام کاربری text قرار گرفت و مقدار آن 8 به این شکل چه مقدار از حافظه رم اشغال می شود ؟

تفاوت نوع داده باینری با char و varchar در چیست؟
اگر خواسته باشیم برای فیلد رمز عبور از نوع باینری استفاده کنیم به جای استفاده از char یا varchar چه تاثیری دارد ؟

در رابطه با تاریخ چه نوع داده ای باید انتخاب شود ؟ فکر کنید مطلبی را توسط برنامه ای که نوشته ایم درج می کنیم قصد داریم تاریخ فقط تاریخ را در لحضه درج برنامه در فیلدی درون دیتابیس ذخیره کنیم و بعد درون نوشته های وب سایتمان آن تاریخ را نمایش دهیم اینجا از چه نوع داده ای باید استفاده شود؟
آیا در نوع داده ای که به تاریخ ارتباط دارد باید مقدار Length درج شود ؟ 

اگر قصد داشته باشیم هم ساعت و هم تاریخ درون فیلد درج شود چه نوعی کاربرد دارد ؟ و آیا باید Length  درج شود ؟


اگر فیلد ID یک جدول نوعش INT باشد و مقدارش فرضا 11 یعنی طول این فیلد تا 11 کاراکتر یا در واقع 11 عدد مجاز می باشد درسته یعنی این مقدار میتواند داخل فیلد درج شود: 99999999999
اگر BiGINT باشد و عبارت 11 درون طول قرار بگیرد به چه شکل خواهد بود ؟ چه تعداد کاراکتر درون این فیلد قابلیت ذخیره سازی دارد ؟


در مورد فیلد password چون قرار هست 32 کاراکتر درون فیلد درج شود آن هم صرفا این 32 کاراکتر ، کاراکتر هایی می باشد که توسط تابع md5 تولید شده نوع جدول char با طول 32 باشد مشکل ساز خواهد بود ؟ اگر خیر چرا افراد از varchar  با طول های متفاوت استفاده می کنند یا از انواع دیگر داده.


درون phpmyadmin برای نمونه جدولی درست کردم و برای آن جدول یک فیلد با نام ID ایجاد کردم نوع داده INT و با طول 10 بعد از تولید فیلد رفتم برای درج اولین مقدار داخل این فیلد زمانی که عبارت عددی 99999999999 را وارد کردم که ببینم این تعداد کاراکتر را میگیرد یعنی 11 کاراکتر چه خطایی میگیرم خطایی مبنی بر پیام زیر را دریافت کردم
 Please enter a value less than or equal to 2147483647 حال مسئله ای که وجود دارد این می باشد که اگر ما تا 10 کاراکتر توانایی درج مقدار درون این فیلد را داریم و نوع این فیلد عددی می باشد و فقط عدد دریافت خواهد کرد این درخواستی که کرده دقیقا چه مفهومی دارد ؟ Please enter a value less than or equal to 2147483647 درک این مسئله برای من سخت می باشد.

برای نمونه این فیلد را مورد اصلاح قرار داده و طول ID را برابر با 1 و حتی0  قرار دادم که خودش اتوماتیک به11 تبدیلش کرد !!!!!!!  و نوع آن را برابر با INT قرار دادم این آزمایش را درون phpmyadmin انجام میدادم پس از ذخیره اقدام به درج مقدار جدیدی کردم و مقدار وارد شده عددی 10 رقمی بود مگر این جا این 10 رقم به منزله 10 کاراکتر محسوب نمی شود چرا بدون هیچ مشکلی رقم به این طولانی 2147483647 بدون مشکل درج شد.
اگر واقعا هیچ فرقی بین وارد کردن 1 یا 10 یا 100 نیست چرا باید مثل دیتابیس سایر برنامه ها که معمولا برای فیلد ID از نوع int و طول 11 استفاده می کنند ما نیز از 11 استفاده کنیم برای طول این فیلد ؟؟؟؟؟






درون دیتابیس مدیریت محتوای وردپرس  جدولی وجود دارد با نام users که فیلد های این جدول و ساختار کلی فیلد های این جدول به شکل زیر می باشد

users
==============
Name                 Type          Collation            Attributes Null Default

ID                   bigint(20)                         UNSIGNED   No   None
user_login           varchar(60)   utf8mb4_unicode_ci              No
user_pass            varchar(255)  utf8mb4_unicode_ci              No
user_nicename        varchar(50)   utf8mb4_unicode_ci              No
user_email           varchar(100)  utf8mb4_unicode_ci              No
user_url             varchar(100)  utf8mb4_unicode_ci              No
user_registered      datetime                                      No   0000-00-00 00:00:00
user_activation_key  varchar(255)  utf8mb4_unicode_ci              No
user_status          int(11)                                       No   0
display_name         varchar(250) utf8mb4_unicode_ci               No

با توجه به اینکه برای id از نوع bigint و طول 20 استفاده شده دلیل استفاده از این نوع داده و این طول چیست ؟
برای سایر فیلد ها به غیر از user_registered و user_status از varchar استفاده کرده است و با طول های متفاوت که به عنوان نمونه اگر عبارت زیر

varchar(255) که برای user_pass در نظر گرفته شده به معنای درج 255 کاراکتر درون این فیلد باشد در صورتی که کاربر ما نهایت 10 کاراکتر بیشتر وارد نخواهد کرد یا نهایت بیشتر از 20 کاراکتر وارد نخواهد کرد چرا باید 255 کاراکتر در نظر گرفته شود ؟
اگر این مقدار در نظر گرفته شود و این عبارت 255 به منزله قبول 255 کاراکتر برای این فیلد باشد و کاربر فقط 10 کاراکتر استفاده کرده باشد 245 کاراکتری که استفاده نکرده آیا باعث اشغال فضا و فشار مضاعف به سرور نخواهد شد ؟

در رابطه با user_status از نوع int  با طول 11 استفاده شده که باز هم اگر 11 به منزله 11 کاراکتر قابل استفاده در این فیلد باشد باتوجه به اینکه
user_status – در نسخه های قبل وردپرس ۳.۰ برای مشخص کردن یک کاربر به عنوان اسپمر استفاده می شد و یا عدد 0 و یا 1 خواهد بود که 0 به منزله اسپمر نبودن و 1 به منزله اسپمر بودن بود چرا باید از طول 11 و نوع int استفاده شود ؟ باز هم اگر 11 به منزله تعداد کاراکتر مجاز باشد چرا باید برای یک مقدار تک کاراکتری 0 وشاید  1 -  11 تنظیم شود که باعث شویم 10 بایت بیشتر از مقدار رم سرور را استفاده کنیم ؟


کاربرد UNSIGNED    در بخش اتریبیوت چیست ؟

در فیلد user_registered از نوع datetime استفاده شده این نوع به چه شکلی عمل می کند ؟




در پایان همه صحبت هایی که کردم و هی تکرار کردم مقدار رم سرور منظورم این می باشد که فرضا همین user_status که یک عبارت تک کاراکتری بیشتر نیست وقتی 11 درج می شود حالا چه از فضای هارد استفاده کند برای ذخیره داده ها و چه از فضای رم استفاده کند برای ارائه پاسخ به کوئری های اجرا شده آیا به این شکل مقدار دهی به طول فیلد ها باعث نمی شود مصرف منابع بیشتر شود ؟ و در صورتی که منابع نا کافی باشد فشار بیشتری در برنامه های بزرگی مثل وردپرس به سرور وارد شود ؟

تمام سوالاتی که مطرح شد و حساسیتی که بنده روی این مسئله دارم رفع نواقصی که به علت نداشتن تجربه داریم در زمان طراحی دیتابیس آیا باعث بهبود سرعت اجرای کوئری ها  و بازدهی بهتر و افزایش سرعت سایت نخواهد شد ؟



با تشکر از لطف بی کران بنیان گذار  Ncis.ir  جناب مهندس محمد مصطفی شهرکی مدرس دوره های حرفه ای پی اچ پی   PHP Professional Tutor
نقل قول:اولین عبارت بین هر ---------- نام جدول و عبارت بعدی فیلد های آن جدول می باشد فرض مثال جدول کاربران سه فیلد داریم با نام های
کد:
user_id
user_login
user_password

حالا سوال اینجاست که برای فیلد اول از چه نوع داده ای با چه اندازه ای باید استفاده شود برای فیلد دوم که قرار هست کاراکتر های عددی آندرلاین و عبارات حروفی بزرگ و کوچک لاتین بگیرد از چه نوعی باید استفاده شود برای این فیلد از مقدار صحبتی نمی کنم که در خطوط پایین توضیح بیشتری میدهم.
به ترتیب
int(11)
varchar(40)
varchar(60)

نقل قول:در بعضی از اسکریپت ها و برنامه ها مشاهده می شود که از نوعی داده برای فیلد خاصی استفاده شده و مقدار آن را براربر با 255 قرار داده اند آیا این 255 یعنی 255 کاراکتر امکان درج در این فیلد وجود دارد ؟

و اگر این طور می باشد وقتی که کاربر مقداری را درج می کند که کمتر از 255 کاراکتر می باشد و ما در تنظیمات مقدار آن فیلد از عدد 255 استفاده کرده باشیم مقدار فضای اشغال شده به واسطه تنظیمی که ما انجام دادیم ولو اینکه کاربر 10 کاراکتر وارد کرده باشد باز هم به اندازه 255 کاراکتر فضا را اشغال خواهد کرد و این مقدار را از حافظه رم دستگاه استفاده خواهد کرد ؟

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

نقل قول:در رابطه با تاریخ چه نوع داده ای باید انتخاب شود ؟
فیلد نوع datetime
با تشکر از دوست عزیزم که جواب دادید به این تاپیک حقیر نظرتون رو جلب می کنم به بروزرسانی که روی تیکت صورت گرفت باتشکر از شما