# پایگاه‌های داده > SQL Server > T-SQL > تحلیل و طراحی بانک اطلاعات >  تشریح نرمال سازی سطح 2NF , 3NF

## engmmrj

سلام
لطفا سطح نرمال سازی سطح 2NF و 3NF رو به همراه مثال برای من تشریح کنید .
بطور معمول باید تا چه سطحی رعایت کرد ؟
استفاده از سطوح نرمال سازی چه مزایایی داره به جر افزونگی ؟

----------


## محمد سلیم آبادی

سلام



> لطفا سطح نرمال سازی سطح 2NF و 3NF رو به همراه مثال برای من تشریح کنید .


به مطالب مربوط به نرمالسازی مراجعه کنید (اینجا)




> بطور معمول باید تا چه سطحی رعایت کرد ؟


تا سطح سه




> استفاده از سطوح نرمال سازی چه مزایایی داره به جر افزونگی ؟


به جز کاهش افزونگی داده ها باعث نظم بخشیدن در بروزرسانی  (حذف/درج/ویرایش) داده ها می شود.
در مطالبی که بهش اشاره کردم که بر گرفته از کتاب آقای C.J. Date هست به این موارد اشاره شده است.

----------


## Kubuntu

امیدوارم بتونه کمکت کنه
لینک بزرگ عکس
http://upload7.ir/images/17784215087505114388.jpg

----------


## engmmrj

> سلام
> 
> به مطالب مربوط به نرمالسازی مراجعه کنید (اینجا)
> 
> 
> تا سطح سه
> 
> 
> به جز کاهش افزونگی داده ها باعث نظم بخشیدن در بروزرسانی  (حذف/درج/ویرایش) داده ها می شود.
> در مطالبی که بهش اشاره کردم که بر گرفته از کتاب آقای C.J. Date هست به این موارد اشاره شده است.


 من هرچی سطح 2NF رو میخونم چیزی متوجه نمیشه !  ، میشه به زبان ساده توضیح بدید ؟

----------


## محمد سلیم آبادی

قبل از اینکه مطلب رو بخونید لازمه بگم که بصورت متناوب از واژه خصیصه به جای ستون و از ستون به جای خصیصه
استفاده شده هر دوی آنها به یک معنا هستند.
شما فرض کنید میخواهیم تعلق یک شیء به یک فرد را تعیین کنیم. مثلا علی دارای یک کامپیوتر است. خب نیاز به
سه جدول داریم جدول اول برای لیست کردن تمام اشیاء مورد نظر، جدول بعدی برای لیست کردن تمام افراد مورد نظر
جدول سوم برای تعیین تعلق یک شی به یک فرد. 
در جدول اشیاء به هر شی یک کد منحصربفرد انتساب میدهیم و در کنار آن خصایص و ویژگی های آن شی را نیز درج میکنیم
در جدول افراد نیز یک کد منحصربفرد به هر فرد انتساب میدهیم (این کد میتونه یک خصیصه طبیعی مثل شماره ملی فرد باشه)
در جدول متعلقات از کدهای اشیاء و افراد استفاده میشه. ترکیب این دو ستون کلید اولیه هست. چرا که تنها یکبار
نیاز هست که تعلق یک شی به یک فرد را تعیین کنیم. یه ستون دیگه اضافه میکنیم تا تعیین کنیم که کی این تعلق
صورت گرفته است. طبیعی است که ستون سوم که تاریخ تعلق را مشخص کرده وابستگی تابعی داره به کلید اولیه
جدول که از ترکیب دو ستون تشکیل شده (هر دو ستون کلید خارجی هستند و به جدول اشیاء و جدول افراد ارجاع
داده شدند)

*نکته اساسی:* حالا اگر ما نام شی یا نام فرد را در جدول تعلق قرار بدیم این جدول دیگه از فرم دوم نرمال خارج میشه 
چون خصیصه ای اضافه شده که وابستگی نداره به کلید اولیه جدول. مثلا در مورد نام فرد این ستون وابستگی
داره به کد فرد و در مورد نام شیء این ستون وابستگی داره به کد شی که ستون کد شیء یک جزئی از کلید اولیه
محسوب میشه. نه کل کلید اولیه.
خب من در مطلبی که بهش اشاره کردم به بینظمی ها و ناهنجاری هایی که در این حالت صورت میگیره اشاراتی داشتم

ابتدا دو جدول اشیاء و افراد را ایجاد میکنیم:
create table Objs 
(
    obj_id tinyint not null primary key,
    obj_name varchar(25) not null,
    ...
)

create table People
(
    person_id char(10) not null primary key,
    person_name varchar(25) not null,
    ...
)

سپس نظر شما را به این جدول جلب میکنم. این جدول از سه ستون تشکیل شده. دو ستون که کلید خارجی هستند و ترکیب آنها نیز کلید اولیه را تشکیل می دهند. ستون سوم هم وابستگی تابعی داره به کلید اولیه (که ترکیب دو ستونی است هر خود کلید خارجی هستند)

create table Depens
(
    person_id char(10) not null
        references People,
    obj_id tinyint not null
        references Objs,
    depens_date date,
    primary key (person_id, obj_id)
)

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

----------


## engmmrj

> قبل از اینکه مطلب رو بخونید لازمه بگم که بصورت متناوب از واژه خصیصه به جای ستون و از ستون به جای خصیصه
> استفاده شده هر دوی آنها به یک معنا هستند.
> شما فرض کنید میخواهیم تعلق یک شیء به یک فرد را تعیین کنیم. مثلا علی دارای یک کامپیوتر است. خب نیاز به
> سه جدول داریم جدول اول برای لیست کردن تمام اشیاء مورد نظر، جدول بعدی برای لیست کردن تمام افراد مورد نظر
> جدول سوم برای تعیین تعلق یک شی به یک فرد. 
> در جدول اشیاء به هر شی یک کد منحصربفرد انتساب میدهیم و در کنار آن خصایص و ویژگی های آن شی را نیز درج میکنیم
> در جدول افراد نیز یک کد منحصربفرد به هر فرد انتساب میدهیم (این کد میتونه یک خصیصه طبیعی مثل شماره ملی فرد باشه)
> در جدول متعلقات از کدهای اشیاء و افراد استفاده میشه. ترکیب این دو ستون کلید اولیه هست. چرا که تنها یکبار
> نیاز هست که تعلق یک شی به یک فرد را تعیین کنیم. یه ستون دیگه اضافه میکنیم تا تعیین کنیم که کی این تعلق
> ...


 از پاسخ خویتون ممنونم .
من با توجه به توضیحات شما جداول زیر رو طراحی کردم ، آیا جداول رو درست طراحی کردم ؟

جدول User

 1-iduser
  2-username


جدول Kala

 1-idkala
  2-namekala


جدول Forosh

 1-idforosh
  2-idkala
  3-iduser

----------


## محمد سلیم آبادی

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

----------


## engmmrj

> جدول فروش چندان مفهوم نیست.
> قصد دارین چه اطلاعاتی رو در جدول فروش ثبت کنید؟ مثلا اینکه کاربر x کالای x را به مشتری فروخته است فقط همین؟ در این وضعیت آیا قید یکتا ترکیبی روی ستون های کدکالا و کدکاربر قرار دادین؟
> نمیخواهین جدول فروش خصایص دیگه ای چون تعداد کالا فروخته شده، کد مشتری، تاریخ فروش و غیره ثبت بشه؟


 میخواستم فقط برای اینکه بفهم بلدم Table درست طراحی کنم یا نه این Table رو طراحی کردم که شما ببینی درست است یا نه ، آیا الان نرمال است Table ها ؟

----------


## محمد سلیم آبادی

اگر ترکیب دو ستون 2و 3 در جدول فروش یکتا بشه بله نرمال هست.

----------


## engmmrj

> اگر ترکیب دو ستون 2و 3 در جدول فروش یکتا بشه بله نرمال هست.


بله یکتا هست  :تشویق:  . واقعا دستتون درد نکنه .
حالا چیکار کنم از سطح 2NF که الان هست بره سطح 3NF ؟

----------


## محمد سلیم آبادی

اصطلاح "نرمال" زمانی بکار میره که جداول در فرم سوم نرمال بسر میبرند. 
پس همانطوری که قبلا اشاره کردم جداولتان نرمال اند یعنی 3ND هم هستند.

----------

