PDA

View Full Version : حرفه ای: تعریف صحیح دیتابیس



xoogle.ir
چهارشنبه 10 شهریور 1389, 23:08 عصر
سلام دوستان و اساتید عزیز
میخام دیتابیس سیستمی رو تعریف کنم که اگر خدا بخاد در آینده ممکنه دهها میلیون رکورد داشته باشه.
تا اونجایی که من میدونم برای اینکه دیتابیس درست تعریف شده باشه باید حتی الامکان سعی کنیم که اطلاعات کوچک بشه و کمتر از فیلدهای varchar و text و کلا فیلدهایی که طول متغیر دارن استفاده بشه.
حالا من در همین رابطه چند سوال دارم که ممنون میشم اساتید راهنماییم کنن :
1- فرض کنید که فیلدی داریم برای جنسیت کاربر برای تعریف کردن این فیلد 3 راه منطقی داریم :
a- یک فیلد با محتوی enum درست کنیم که 2 مقدار male و female رو بگیره.
b- یک فیلد char یک کاراکتری ایجاد کنیم که m یا f بگیره.
c- یک فیلد char یک کاراکتری ایجاد کنیم که 0 و 1 بگیره.
استفاده از کدوم یکی از این روش ها بهینه تر است ؟

2- فیلدی برای ذخیره زمان به صورت برچسب زمان داریم برای تعریف کردن این فیلد هم 2 راه منطقی داریم :
a- یک فیلد با نوع int ده کاراکتری ایجاد کنیم.
b- یک فیلد از نوع char ده کاراکتری ایجاد کنیم.
با توجه به اینکه گفته شده حتی الامکان از فیلدهای با طول ثابت استفاده بشه استفاده از کدوم فیلد برای ذخیره تاریخ مناسب تر است (با فرض اینکه عدد تاریخ ما همیشه 10 رقمی است)

3- در جایی خوندم که encoding utf-8 سرعت دیتابیس رو کمی کاهش میده خب با توجه به اینکه من encoding پیش فرض دیتابیس رو موقع ساخت دیتابیس روی utf8_unicode_ci تنظیم میکنم به طور خودکار encoding تمام فیلدهای varchar و char و text و ... در دیتابیس یونیکد میشه حتی فیلدهایی که یک مقدار لاتین یا یک عدد رو نگه داری میکنن. میخاستم بدونم که تغییر دادن encoding این فیلدها تاثیری در بهبود سرعت دیتابیس داره و اگر داره روی چه انکودینگی باید تنظیم بشه ؟

4- فرض کنید فیلدی داریم مثل آدرس یا شماره تلفن که وارد کردنش اختیاری هست یعنی میتونه خالی باشه. برای این فیلدها اگر مقدار پیش فرضشون رو NULL بذاریم بهتر هست یا مقدار بهشون ندیم ؟ یعنی کدوم مورد کمک میکنه تا دیتابیس کوچکتر باشه.

خیلی متشکرم

sama01
چهارشنبه 10 شهریور 1389, 23:35 عصر
1.
اصولا وقتی از enum استفاده می‌کنید دو حالت 0 و 1 دارید. یعنی به اندازه‌ی یک بیت فضا اشغال می‌شه. پس استفاده از این روش منطقی‌تر خواهد بود.

2.
من همیشه از timestamp استفاده می‌کنم. زمان را هم به صورت timestamp ذخیره می‌کنم. در آینده راحت‌تر خواهید بود.

3.
اطلاع دقیقی ندارم. ولی تنظیم دستی encoding فیلدها اصولا باید موثر باشه.

پ.ن:
بخش 2 اصلاح شد.

xoogle.ir
چهارشنبه 10 شهریور 1389, 23:38 عصر
2.
من همیشه از dateTime استفاده می‌کنم. زمان را هم به صورت timestamp ذخیره می‌کنم. در آینده راحت‌تر خواهید بود.

خب صحبت من هم سر timestamp هست دیگه برعکس شما من هیچ وقت از dateTime استفاده نمیکنم

xoogle.ir
پنج شنبه 11 شهریور 1389, 10:37 صبح
ما ز دوستان چشم یاری داریم :لبخندساده:

bestirani2
پنج شنبه 11 شهریور 1389, 11:18 صبح
1. enum از همه بهتر هست
2. از نوع int
3. حروف یونیکد برای select کردن دردسر ساز هستند، هر جا لاتین هست به صراحت latin1 رو انتخاب کنید

shahriyar3
پنج شنبه 11 شهریور 1389, 14:57 عصر
معمولا يك هاستينگ خوب براي ديتابيس يك سرور موازي به هاست شما اختصاص ميدهند
تا چند ده ميليون ركورد پردازش شما دچار مشكل نخواهد شد .
به نظر من اگر قوانين نرمال سازي را بدرستي پياده كنيد بسيار بهتر است

خالي گذاشتن(=null) مقدار فيلد ها بشدت سرعت كوئري گرفتن را افزايش ميدهد!!

sama01
پنج شنبه 11 شهریور 1389, 16:52 عصر
برام این سوال پیش آمد که چرا تاریخ را به صورت Int ذخیره کنیم؟
در وب چرخی زدم و این رو پیدا کردم. حتما ببینید.


MySQL DATETIME vs TIMESTAMP vs INT performance
and benchmarking with MyISAM (http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/)


این هم یکی از نتایج مقایسه:


http://gpshumano.blogs.dri.pt/files/2009/07/mysql_dt_innodb.jpg

xoogle.ir
جمعه 12 شهریور 1389, 00:07 صبح
معمولا يك هاستينگ خوب براي ديتابيس يك سرور موازي به هاست شما اختصاص ميدهند
تا چند ده ميليون ركورد پردازش شما دچار مشكل نخواهد شد .
به نظر من اگر قوانين نرمال سازي را بدرستي پياده كنيد بسيار بهتر است


خب منم دنبال اینم که اول این قوانین رو درست بشناسم بعد بتونم درست پیاده سازیشون کنم.

یه توضیحی هم در مورد این هاست موازی میدید ؟
من هدفم اینه که سرعت کوئری گرفتن بالاتر بره با استفاده از هاست یا سرور موازی ، سرعت کاهش پیدا نمیکنه ؟؟

امیـرحسین
جمعه 12 شهریور 1389, 20:38 عصر
1. فرقی نداره. من باشم (1)TINYINT میذارم.
2. من (10)INT رو ترجیح میدم چون میشه روش عملیات ریاضی و مقایسه ای انجام داد.
3. مقادیر UTF-8 دوبار encode میشند و حجمشون دو برابره. فقط برای جاهایی که لازمه ازشون استفاده کنید.
4. فرق NULL با خالی در استفاده اتون هست. NULL یعنی "مقداردهی نشده" و خالی یعنی "بدون مقدار مقداردهی شده". در کدها اگر چنین چیزی برامون اهمیت داشته باشیم باید از NULL استفاده کنیم. همچنین برای فیلدهای عددی و ثابت هم از NULL به عنوان خالی استفاده میشه.

shahriyar3
جمعه 12 شهریور 1389, 21:30 عصر
خب منم دنبال اینم که اول این قوانین رو درست بشناسم بعد بتونم درست پیاده سازیشون کنم.

یه توضیحی هم در مورد این هاست موازی میدید ؟
من هدفم اینه که سرعت کوئری گرفتن بالاتر بره با استفاده از هاست یا سرور موازی ، سرعت کاهش پیدا نمیکنه ؟؟
هاستينگ براي سايتها يك سرور براي فضا و يكي سرور جدا براي ديتابيس اختصاص ميدهد اينكار از فشار بر روي cpu ميكاهد و سرعت و امنيت را افزايش ميدهد.

مشخصه كه سرعت بشدت افزايش پيدا ميكنه!

xoogle.ir
جمعه 12 شهریور 1389, 22:54 عصر
هاستينگ براي سايتها يك سرور براي فضا و يكي سرور جدا براي ديتابيس اختصاص ميدهد اينكار از فشار بر روي cpu ميكاهد و سرعت و امنيت را افزايش ميدهد.

مشخصه كه سرعت بشدت افزايش پيدا ميكنه!
یعنی دیتابیس روی یک سرور دیگه ساخته میشه ؟
این کار سرعت اتصال به دیتابیس رو افزایش نمیده ؟

shahriyar3
جمعه 12 شهریور 1389, 23:27 عصر
یعنی دیتابیس روی یک سرور دیگه ساخته میشه ؟
این کار سرعت اتصال به دیتابیس رو افزایش نمیده ؟

اونجوري كه شما فكر ميكني نيست سرور ها به هم trust دارن
در واقع يه تبادل اطلاعات در داخل شبكه بين دو سرور انجام ميشه