110 likes | 321 Views
Database پايگاه داده ها. Shahriar Pirnia http://www.pirnia.net. مفهوم رابطه نرمال : رابطه اي است که در آن تمام مقادير تمام صفات خاصه اتوميک باشد . مثال : رابطه BEFORE يک رابطه از درجه 2 است . ميدان PQTY يک ميدان مرکب است که از دو ميدان P# و QTY تشکيل شده است .
E N D
Databaseپايگاه داده ها Shahriar Pirnia http://www.pirnia.net
مفهوم رابطه نرمال : رابطه اي است که در آن تمام مقادير تمام صفات خاصه اتوميک باشد . مثال : رابطه BEFORE يک رابطه از درجه 2 است . ميدان PQTY يک ميدان مرکب است که از دو ميدان P# و QTY تشکيل شده است . يکي از ميدانها ، مقاديرش رابطه است . از لحاظ رياضي اين يک Nested Relation است . گاهي به آن (Not Normal Relation) ميگويند . Codd ميگويد رابطه ها در مدل رابطه اي تعريف شده توسط ايشان بايد نرمال باشند . یک تاپل
AFTER اين يک رابطه نرمال (طبيعي) است . يک تاپل دليل اينکه چرا رابطه ها بايد نرمال باشند (چرا مقادير خاصه بايد اتوميک باشند . ) DATE با تاکيد گفته است که : دليل اصلي نرمال بودن رابطه ها در مدل رابطه اي ، تامين سادگي)(Simplicity است . 1 – سادگي ظاهري 2 – سادگي انجام عمليات در Database . 3 – ساده تر شدن احکام DSL مخصوصا DML .
مثال : I1درج کن : <S4 , P1 , 60> I2 : درج کن <S2 ,P3 , 50> انجام I1: در هر دو پايگاه BEFORE و AFTER به سادگي قابل انجام است . INSERT INTO BEFORE TUPLE<S4,P1,60> INSERT INTO AFTER TUPLE<S4,P1,60> اما اجراي درخواست I2 : در AFTER به سادگي انجام پذير است ولي در BEFORE نه . INSERT INTO AFTER TUPLE<S2,P3,50> اما نمي توان نوشت INSERT INTO BEFORE TUPLE<S2,P3,50> زيرا قبلا تاپلي با S# = S2 در اين جدول وجود دارد اين Tuple اي از جدول BEFORE نيست . بايد اپراتور ديگري بجز INSERT در زبان وجود داشته باشد که مقداري را به يک مجموعه اضافه کند
. مثلا : ADD TO PQTYSET VALUE <P3,50> WHERE S# = ‘S2’; يعني يک اپراتوري براي INSERT هنگامي که Tuple مقدار عادي دارد لازم داریم و يک اپراتوري به نام ADD يا APPEND براي حالتي که Tuple مقدار عادي ندارد . اين براي سيستم Overhead ايجاد مي کند و سادگي زبانی را از بين مي برد. کليد در مدل رابطه اي : با اصطلاح عام کليد کانديد (Candidate Key) مطرح است . تعريف : هر زير مجموعه از مجموعه عنوان رابطه به صورت Ai Aj … Ak که داراي دوخاصيت زير باشد کليد کانديد است : 1 – يکتايي مقدار Uniqueness)( داشته باشد در طول حيات رابطه : يعني در هيچ دو Tuple اي از رابطه اين ترکيب مقدار يکسان نداشته باشد . 2 – کاهش ناپذيري Irreducibility يا Minimality (ايجاز يا کهينگي) داشته باشد . يعني اگر هر يک از اجزاي تشکيل دهنده اين ترکيب را ازش بگيريم خاصيت يکتايي مقدار آن از بين برود . نام رابطه کليد کاندید S S# P p# SP (S#,P#)
Super key Candidate Key
نکته : هر زير مجموعه اي از مجموعهHeading که يکتايي مقدار داشته باشد به آن Supper Key مي گويند(خاصيت دوم برقرار باشد يا نباشد) (يعني درون خود حد اقل يک کليد کانديد دارد ) اما Codd ،Supper Key را به عنوان يک مفهوم اساسي در مدل رابطه اي مطرح نمي کند . آيا وجود حد اقل يک کليد کانديد در رابطه محرز است ؟ بله . هر رابطه کليد کانديد دارد . زيرا در بدترين حالت خود مجموعه عنوان مي تواند کليد کانديد باشد ، زيرا مجموعه Body ،Tuple تکراري نمي تواند داشته باشد (S#,P#, DATE) پس اضافه کردن ستون نمي تواند همينطوري انجام شود . يک ستون اضافه گرديد و کليد کانديد کاملا تغيير کرد . مثال : SPd (S# , P# , Qty , Date) S1 p1 100 d1 S2 p1 100 d2 S1 P1 200 d3 به رابطه ای که مجموعه عنوانش کلید کاندیدش باشد رابطه تمام کليد All-Key مي گويند . (سيستم مطلوبي نيست زيرا حداقل Overhead ايجاد Index زياد مي شود . ) کليد كانديد Identifier( شناسه ) تشخيص Tuple ها است و هرچه کليد كانديد طولاني تر باشد براي يافتن Tuple بايد مسير پيچيده تري را رفت
Primary Key : کليد کانديدي است که طراح انتخاب مي کند بنابر ملاحظات محيطي (يعني يکي از کليد هاي کانديد ) مثلا : رابطه S داراي کليدهاي کانديد S# و SNAME است ، اما طراح ممکن است S# را به عنوان کليد اصلي در نظر بگيرد . آن کليد کانديدي که توسط آن Access بيشتري به Dataصورت مي گيرد(query هاي بيشتري با استفاده از آن نوشته مي شود) به عنوان کليد اصلي مطرح مي شود که بستگی به نظر طراح دارد . کليد اصلي :شناسه تاپل است در رابطه ، امکان آدرس دهي به تاپل در رابطه است در محيط انتزاعي (الزاما صرف معرفي کليد اصلي ايجاب نمي کند حتما سيستم روي کليد اصلي Index بزند بلکه بايد درخواست کنيد .)اگر Tuple Level Operation بخواهيد داشته باشيد حتما بايد کليد اصلي داشته باشيد . *کليد اصلي حتما در تعريف رابطه بايد قيد شود . يعني جزئي از شماي اصلي پايگاه است . CREATE RELATION S (S# DOMAIN SNUM . CITY DOMAIN CITY) PRIMARY KEY S#; در سيستمهاي رابطه اي فعلي : CREATE TABLE S (S# CHAR (6) . . SNAME . . . . CITY . . . ) PRIMARY KEY S# ;
(کليد خارجي) : تعريف :Ai در R2 کليد خارجي است اگر در رابطه اي مثلا R1 کليد كانديد باشد . (R1 و R2 لزوما مجزا نيستند ) مي توان گفت Ai در R2 کليد خارجي است اگر از يک ميدان اصلي مقدار بگيرد .(يك نتيجه اين است كه هر کليد اصلي کليد خارجي هم هست .) مثال : صفت خاصه S# در SP کليد خارجي است زیراS# در S کليد اصلی است. مثال : P# در SP کليد خارجي است زيرا P# در P کليد اصلي است . Foreign Key نکات : در تعریف کلید خارجی R1 و R2 لزوما مجزا نیستند مثال : EMP ( EMP# , EMPNAME ,…. , EMPMGR#) E1 , En1 , …… ,E13 E2 , En2 , ……,E27 E3 , En3 , ….. ,E13 کارمند کارمند مدیر است یا تحت مدیریت مدیر است
EMP# کليد اصلي است .#EMGR در همين رابطه کليد خارجي است . نکته : يک رابطه 1:N يکسويه توسط کليد خارجي پياده سازي مي شود . نکته : لزومي ندارد کليد خارجي يک رابطه جزئي از کليد اصلي رابطه باشد . هرچند در SP چنين است . SP ( S# , P# , Qty) کليد اصلي در مدلينگ ارتباط1:N (يک به n) دوسويه از کليد خارجي استفاده مي شود و رابطه اي براي بيان ارتباط آن دو موجوديت طراحي مي شود که کليد اصلي اش تشکيل شده از کليدهاي اصلي دو رابطه است . کلید خارجی کلید خارجی
نکته : فايده کليد خارجي چيست ؟ امکاني است براي نشان دادن ارتباط بين موجوديتها . مثل اينکه در رابطه SP از طريق کليد خارجي S# و P# ارتباط دو موجوديت S و P را نشان مي دهيم . و نيز امکان ارجاع به موجوديتهاست . به عنوان مثال وجود S1 در رابطه SP ارجاعي است به نمونه موجوديت S1 در رابطه S . آيا تنها امکان نشان دادن ارتباط بين موجوديتها کليد خارجي است ؟ خير . در حالت کلي وجود هر صفت خاصه مشترک در مجموعه عنوان دو رابطه نشاندهنده نوعي ارتباط بين دو نوع موجوديتي است که آن دو رابطه نمايشگر آنها هستند . مثال : S(S#,SNAME,STATUS,CITY) P(P#,…………………..,CITY) CITY در دو رابطه نوعي ارتباط را نشان مي دهد مثلا "در يک شهر بودن" "در يک شهر نبودن" و CITY در هيچيک از دو رابطه کليد خارجي نيست . زيرا هيچ جا کليد اصلي نيست . براي نمايش ارتباط بين دو موجوديت : دو راه داريم : 1 – استفاده از مفهوم کليد خارجي 2- استفاده از يک صفت خاصه مشترک کليد خارجي بيانگر يک ارتباط محوري و اساسي مي باشد اما صفت خاصه مشترک چنين نيست . مثال : S(S#,SNAME, . . . ,CITY) P(P#,……………..,CITY) J(J#,JNAME,CITY) SPJ(S#,P#,J#, . . . ,CITY) CITY بيانگر نوعي ارتباط است ولي J# و P# و S# بيانگر يک ارتباط محوري و اساسي مي باشد .