PDA

View Full Version : علت ضرورت استفاده از Relation بين جداول و نيز اشکال در Cascade کردن update از دو جدول همتراز به جدو



armm1388
شنبه 07 اردیبهشت 1392, 12:23 عصر
با سلام
ديتابيسي داريم شامل چهار جدول (سه جدول مستر و يک جدول ديتيل حاوي اطلاعات روزانه)

جدول مستر a داراي دو فيلد است:
a_code (Primary Key)
a_name

جدول مستر b1 داراي سه فيلد است:
a_code (Primary Key)
b1_code (Primary Key)
b1_name

جدول مستر b2 نيز شبيه جدول b1 مي باشد (در يک رده قرار دارند) و داراي سه فيلد است:
a_code (Primary Key)
b2_code (Primary Key)
b2_name

جدول ديتيل C داراي پنج فيلد است:
a_code (Primary Key)
b1_code (Primary Key)
b2_code (Primary Key)
C_code (Primary Key)
C_name

a_code در جدول a کليد اصلي و در جداول b1 و b2 کليد خارجي است و b1_code و b2_code در جداول خودشان بخشي از کليد اصلي و در جدول C کليد خارجي اند . حال بين اين جداول Relation برقرار مي کنيم ، بطوريکه جدول C هم به b1 و هم به b2 مرتبط شود و جداول b1 و b2 هر کدام جداگانه به a مرتبط شوند .
از نگاه ديگر : جدول ديتيل C زير مجموعه جداول مستر b1 و b2 بوده و جداول مستر b1 و b2 زير مجموعه جدول مستر a مي باشند. (يعني سطح اول جدول a – سطح دوم جداول b1 و b2 - سطح سوم جدول C باشد)

براي Update فيلدها ، بايد امکان Cascade را برقرار کرد.
سوال اول :
نکته اي که وجود دارد اين است که جدول C که به دو جدول b1 و b2 مرتبط است تنها در يکي از Relation ها امکان Cascade را براي Update مي دهد . و در ديگري error مي دهد.
Error:

'b2' table saved successfully
'c' table
- Unable to create Relationship 'FK_c_b2'.
Introducing FOREIGN KEY constraint 'FK_c_b2' on table 'c' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

سوال دوم :
فيلدهاي کد که کليد اصلي هستند (همانند a_code) از ديد کاربر مخفي است و با اضافه شدن فيلد جديد خودبخود فيلد a_code با افزايش يک واحد براي رکورد جديد توليد مي شود. هنگامي هم که نياز به ويرايش محتويات فيلد a_name داشته باشيم فيلد a_code نياز به تغيير نخواهد داشت . پس ديگر هيچ لزومي به Cascade کردن Update به جداول زيرين نداريم . حتينيازيبه برقراري Relation هم نداريم . پس اگر ساختار بانک ما به اين نحو باشد که لزومي به Relationو Cascade نداشته باشد آيا طراحي بانک ما اصولي است؟

سوال سوم :
در اين جدول ها فيلد کد را در کنار فيلد نام اضافه کرده ايم و آنرا کليد تعريف کرده ايم . با توجه به اينکه فيلد نام به تنهايي منظور ما را برآورده مي سازد و مي تواند خودش کليد هم باشد، آيا افزودن فيلد مازادي بنام کد ،خلاف استاندارد نرمال سازي نيست؟
با تشکر فراوان

rasoul_par
شنبه 07 اردیبهشت 1392, 17:52 عصر
توی جدول C مقدار a_code از کدوم جدول میاد، a یا b1 یا b2؟ فکر میکنم برای اینکه دلیل رو بفهمیم به این مورد احتیاج داریم.
کلید اصلی به معنی مشخصه اون رکورده، مثل کد ملی که نشون دهنده مشخصه هر فرده، اینکه شما یک فیلد به صورت Auto_increment داری برای کلید اصلی از نظر طراحی دیتابیس صحیح نیست مگر برای بعضی شرایط خاص که در اون صورت بش surrogate key گفته میشه اگه اشتباه نکنم. اینکه بین جداول مختلف چه رابطه ای داشته باشیم یا اصلا رابطه داشته باشیم باز هم به طراحی دیتابیس بر میگده. مثلا اگر دانشجو داشته باشیم و درس در صورتی که نخوایم برای کلاس برنامه ریزی کنیم احتیاجی به رابطه نداره در غیر این صورت خب چرا.