آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

قوائد naming و طراحی بانک اطلاعات بر اساس uncocoder convention

uncocoder  10 سال پیش  10 سال پیش
+32 0

استاندارد های زیادی برای naming وجود دارد، اما ما استاندارد خود را ترجیح می دهیم، چرا که در پروژه های بسیار بزرگ، تست شده و بهترین حالت نامگذاری در نظر گرفته شده است. از طرفی لزوماً convention ایجاد شده توسط یک شرکت بزرگ مثل google یا oracle مورد تأیید نیست، چون در عمل نشان داده خوب کار نمی کند.

 

اطلاعات زیر در مورد MySQL تدوین گردیده است.

نام گذاری Database

  • نام آن خیلی ساده می شود username_databasename مثل uncocoder_sample که username را خود hosting از پیش اضافه کرده.
  • Collation دیتابیس باید utf8_general_ci باشد.
  • نام Database خود را به گونه ای قرار دهید که با کلیدواژه های MySQL تداخل نداشته باشد. کلیه کلید واژه های MySQL

 

نام گذاری Table ها

  • می شود حداکثر چهار حرف اختصاصی و مشخص کننده پروژه + نام table مورد نظر، مثل wk_content برای بانک اطلاعات محتوای سرویس wiki و یا news_author برای بانک اطلاعات ترجمه کنندگان اخبار در سرویس خبر.
  • از اضافه کردن s در انتهای نام بانک خودداری می کنیم یعنی نمی نویسیم news_authors ( مترجمان ) بلکه می نویسیم news_author ( مترجم )
  • از اضافه کردن هر گونه ادامه برای Table ها مثل tbl_ و ... خودداری می کنیم.
  • Table ها از Collation دیتابیس که utf8_general_ci است استفاده می کنند.
  • نام Table های خود را به گونه ای قرار دهید که با کلیدواژه های MySQL تداخل نداشته باشد. کلیه کلید واژه های MySQL

 

نام گذاری Field ها

  • فیلد اول که primary id هست را با نام pid درج می کنیم و مسلماً auto increment
  • از درج نام اختصاصی دیتابیس در ابتدای فیلد خودداری می شود و نمی نویسیم: author_firstname بلکه می نویسیم firstname . این موضوع هیچ مشکلی در join کردن ایجاد نخواهد کرد.
  • چنانچه قصد جداکردن کلمات را داشتیم از _ استفاده نمی کنیم و lowerCamelCase را رعایت می کنیم. بطور مثال isBanned یا firstName
  • هیچ چیز را خلاصه نمی نویسیم. مثلاً نمی نویسیم desc بجای description.
  • همه فیلدها غیر از pid ، باید اجازه داشته باشند null باشند.
  • برای نوشته های محدود ( مثل تیتر خبر ) varchar انتخاب می شود و برای نوشته های نامحدود ( مثل محتوای یک خبر ) از فرمت text استفاده می شود.
  • برای تاریخ ها از فرمت timestamp استفاده می شود.
  • برای عبارات boolean مثل 0, 1 از تایپ boolean استفاده نمی شود و از int استفاده می شود.
  • فرمت های int نسبت به اندازه مورد نیاز انتخاب می شوند. مثلاً برای تعداد vote تایپ SMALLINT کفایت می کند.
  • جهت کسب اطلاعات بیشتر در خصوص تایپ ها لینک مفید است.
  • چنانچه قبلاً دیتابیسی با ساختاری غیر از ساختار فوق ایجاد شده باشد، دیگر آنرا تغییر نمی دهیم چون ممکن است باعث شکستن کد شود ولی برای ساختار های جدید از قوانین فوق استفاده می کنیم.
  • نام Field های خود را به گونه ای قرار دهید که با کلیدواژه های MySQL تداخل نداشته باشد. کلیه کلید واژه های MySQL
+3 0
شاید باورتون نشه اما دیشب داشتم فکر میکردم امروز برم دنبال naming convebtions برای sql ، php و html و... بگردم. استاد خوب فکرمو خوندید ها D: (10 سال پیش)
0 0
من فبلا برای فیلد ها از fld_name ابتدای نام استفاده می کردم اما دیدم کار رو کمی زشت می کنه اما الان همچنان tbl_name رو به کار می برم، اما حس می کنم کمی مبتدیانه است (10 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
Mehdi_Dowlatshah  10 سال پیش
+2 0

استاد چندتا سوال:
- چرا باید همه فیلدها allow nulls باشند؟ فیلدهایی که اجباراٌ باید پر شوند رو چرا باید allow nulls کنیم؟

- لزوما نباید جداول دارای فیلدی مثله pid و از نوع is identity یا auto incerement باشند،غیر از اینه؟ فرضا اگه از مثال معروف سیستم دانشجویی استفاده کنیم واسه جدول Student آیا بهتر نیست به جای اضافه کردن فیلدی به نام pid از همون شماره دانشجویی به عنوان کلید اصلی استفاده کرد؟ اضافه کردن این فیلد باعث افزونگی نمیشه؟

- در نامگذاری جداول، اضافه کردن پیشوندها خیلی مواقع در خوانایی کد تاثیرگذار خواهد بود مثلا tblAuthor و یا tbl_author و اگه این جدول فرضا یک view هم داشته باشه با عنوان viwAuthor و یا viw_author موجب ایجاد تمایز با table  آن خواهد شد و خوانایی بیشتر. اشتباه میکنم؟

- و یا چرا باید به جای استفاده از data type ای چون boolean از int استفاده کرد؟

0 0
در مورد قسمت 2 سوالتون: 1.فرض کنید قوانین ایجاد شماره دانشجویی عوض شود ، یا حتی این فیلد به صورت دستی پر شود و یا به هر علتی بعداز مدتی مجبور به تغییر شوید. در نهایت شما مجبور به update سراسری تمام جداولی که از این فیلد به عنوان کلید خارجی استفاده می کنند می شوید. یا مثلا شما سایتی طراحی کرده اید و کاربر بعداز مدتی می خواهد user name خود را تغییر دهد. امکانی که در برخی از سایت ها به علت اینکه user name به عنوان کلید اصلی انتخاب می شود وجود ندارد. 2. در مایکروسافت SQL کلید اصلی در حالت پیشفرض به صورت cluster index در سیستم ذخیره شده (اگر اشتباه نکنم در MySQL 5.0 شما چه Primary Key داشته باشید و یا نداشته باشید، Cluster Index توسط InnoDB برای شما ساخته خواهد شد ) و جدول به صورت فیزیکی براساس آن مرتب می شود. برای اینکه این index گذاری دچار کمترین تغییرات باشد، بهترین حالت انتخاب ID به صورت sequential یا پیوسته (1,2,3,...)هست. حال فرض کنید user name های مختلفی در سایت ایجاد می شود و این هزینه index گذاری را بالا خواهد برد. زیرا DB engine مجبور است هر رکورد را دقیقا در محل درست خود قرار بدهد. 3. در ضمن افرونگی همیشه بد نیست. نتیجه: بهتر است شما یک Primary key انتخاب کنید که شما را با این مشکلات مواجه نکند ! (10 سال پیش)
0 0
شماره 1 فیلد ها باید سمت کد چک بشن و سمت sql ثبت بشن، قوانین سمت کدنویسی هستند (10 سال پیش)
پاسخ به سوال 
uncocoder  10 سال پیش
+7 0

سئوالاتی که دوست عزیز در پاسخ بالا مطرح کردند، سئوالات خوبی است و البته نظر آقای حمیدرضا نیز کاملاً مناسب، اما با ویرایشی دیگر و کاملتر:

1- محل تولید منابع باگ تا جای ممکن باید محدود و کنترل شده باشد. اگر در جدولی در دیتابیس، مقادیر غیر null درج شوند، گاهاً بدون اینکه برنامه نویس چیزی را در کد نوشته باشد، مقدار پیش فرض جایگزین می شود و باعث گیج شدن. از طرفی در این شرایط اگر ساختار دیتابیس عوض شود و مقدار پیش فرض null شود ممکن است کدهای سرور کاملاً غلط کار کنند و اصطلاحاً کد بشکند. پس ما تنها محل ورود اطلاعات را کد قرار می دهیم و هر چیزی که وارد نشد، null محسوب شود. این تنها یک حسن بود و محاسن زیاد دیگری هم دارد.

2- باز هم برای محدود کردن منابع باگ، قرار دادن یک فیلد pid همیشه مفید تر از قرار ندادنش هست. سرباره ای هم نداره. به این ترتیب روی سایر فیلدها میشه مانور داد و نگران این نبود که unique بودن هر جدول بر اساس یک فیلد نامشخص ( بطور عموم ) مهیا می شود.

3- در برنامه نویسی مدرن، چیزهایی به اسم View دیگر کاربردی ندارند و هر چه باشد ( بهتر است باشد ) تنها دیتابیس خام است. View هم بصورت Realtime توسط Query توسط کدهای سرور ساخته و استفاده خواهند شد. سابق بر این Query های آماده یک Stored Procedure یا View محسوب می شدند ( مثلاً در Access ) که راهکار مناسبی نیست و باز هم منابع تولید باگ بیشتر خواهد شد و سردرگمی تیم توسعه در مواردی که در کد نیست اما کار می کند!

4- در عمل داده Boolean یک int هست و این استاندارد بانک هایی نظیر SQLite نیز می باشد. پس رعایت تایپ های ساده مفید است. از طرفی گاهاً پیش می آید که می فهمید محتوای یک فیلد صرفاً 0 و یا 1 نیست و مثلاً می تواند خنثی یا -1 نیز باشد. در این شرایط مجبور خواهید شد از تایپ Boolean به تایپ int تغییر Structure بدهید.


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .