PDA

View Full Version : كمك براي Relation در Table



shayesteh_bh
شنبه 02 آذر 1387, 15:08 عصر
با سلام;
فرض كنيد يك جدول master دارم كه دو جدول Child دارد به اين صورت كه ID جدول Master در Detail ها آمده. از طرف ديگر يكي از جداول Child , جدول Entity دانشگاهها است و ديگري ID جدول دانشگاه را دارد و نام آن را بصورت كمبو باكس (در UI ) نمايش مي دهد. بنابراين Child ها نيز خود حالت Materو Detail دارند.
آيا برقراريmaster-Detail Relation بين دو جدول Child درست است؟

Elham_gh
شنبه 02 آذر 1387, 15:41 عصر
در مواردي بله. اما در مورد سئوال خاص شما شك دارم. لطفا نام جداولتون رو كامل بگيد تا بشه پاسخ صحيح داد

shayesteh_bh
شنبه 02 آذر 1387, 16:05 عصر
ببينيد من يك جدول master دارم بنام جدول مدلها كه Model_Nameو Model_ID را دارد.يك جدول Detail دارم كه Model_Id را دارد .اين جدول رتبه يا Rank است يعني علاوه بر Rank_ID, Model_ID و Rank_Name را نيز دارد. اطلاعات اين جدول در لايه UI توسط گريد Data Entriy مي شود. حال صحبت از جدول سومي است بنام امتياز دهي يا Score. اطلاعات اين جدول نيز از طريق گريد ديگري وارد مي شود. اين جدول Score_Id را دارد به عنوان PK. همچنين Model_ID را دارد چون Detail جدول مدلها است. Rank_Id را دارد كه در يكي از ستونهاي گريد توسط كمبو باكس انتخاب مي شود. من بين جداول Score و Rank كه هر دو حالت Detail براي جدول Model هستند Relation نگذاشته ام . اما از طرفي اگر ركوردي در جدول Rank پاك شد در صورتيكه ركورد معادلي با همان Rank_Id در جدول Score موجود بود نبايد اجازه حذف بدهد.
سوال : آيا در اين حالت من مي بايست بين جداول Rank و Score ارتباط Master-Detail برقرار كنم؟
آيا اين رابطه از نظر منطقي اشتباه نيست ؟

Elham_gh
یک شنبه 03 آذر 1387, 08:15 صبح
راستش چون مفهوم model و rank و score رو در مسئله شما نمي دونم ، از لحاظ مفهومي نمي تونم كمكي كنم. منطقا درست نيست.
اما اگر بنا به هر دليلي خواستيد اين كارو بكنيد بايد يك constraint هم بذاريد كه زماني كه داريد اطلاعات جدول Score،فيلد Rank_IDپر مي كنيد،Model_ID معادل آن Rank_ID در جدول Rank ،برابر Model_ID همين جدول Score باشد.
پيشنهاد من اينه كه از اول جداولتونو نرمال كنيد. و اگر در تحليلتون از Object Oriented استفاده كرديد يك Class Diagram درست كمكتون مي كنه.

shayesteh_bh
یک شنبه 03 آذر 1387, 10:41 صبح
پس اين طور كه من متوجه شدم در جدول Score كه قرار است Child جدول Rank بشود كافيست پس از برقراري Relation يك Constraint تعريف كنم كه همان Model-ID است .
سوال 1 : آيا فقط همين جدول Score نياز به Constraint دارد يا جدول Rank نيز نياز دارد؟
سوال 2 : من Search كردم اما درست متوجه نشدم Syntax اين كار چطوريه. ميشه بهم بگيد؟
من دياگرام جداولم رو براتون مي فرستم.
25732

Elham_gh
دوشنبه 04 آذر 1387, 08:24 صبح
جواب سئوال اولتون:بله فقط همان جدول Score
جواب سئوال دومتون: اگر قرار بود Constraint روي يك جدول باشد تو Property هاي جدول Tab ي به اسم Constraint است كه تونجا مي ذاشتيد. اما مورد شما فرق مي كنه.Constraint شما نمي تونه جايي Save بشه. شما بايد با برنامه نويسي زمان ايجاد ركورد يا اصلاح آن،اين كنترل رو انجام بديد

shayesteh_bh
دوشنبه 04 آذر 1387, 09:16 صبح
ok پس من تو store Procedure مربوط به Insert و Update ركورد در جدول Score مي نويسم :


Alter Table Score
ADD Constraint Model_Id Foreign Key
REFERENCES Rank Model_Id


آيا اين كار صحيح است؟ آيا همين كافيست؟
ميشه توضيح بديد چرا تو اين مورد نياز به save كردن constraint نيست ؟
ممنون از كمكتون

Elham_gh
دوشنبه 04 آذر 1387, 09:25 صبح
خير.
من گفتم شما نمي تونيد Constraint اضافه كنيد. بله اين Constraint رو بايد دستي كنترل كنيد.يعني موقع Insert و Update بايد چك كنيد كه حتما Score.Model_ID=Rank.Model_Id

shayesteh_bh
دوشنبه 04 آذر 1387, 11:10 صبح
ببينيد Store Procedure مربوط به Insert من به صورت زير است.ميشه بگيد كجاش و چطوري اين Checking رو انجام بدم؟


BEGIN
SET NOCOUNT ON;

INSERT INTO [AHP_Score_Bucket]
(AHP_Model_Id,Rank_Id,Min_Score,Max_Score)
VALUES(@AHP_Model_Id,@Rank_Id,@Min_Score,@Max_Scor e)

set @Id = Scope_Identity()
return @Id

END


(ممنون از كمكتون)

shayesteh_bh
دوشنبه 04 آذر 1387, 15:06 عصر
فكر مي كنم جواب رو پيدا كردم. بايد Trigger بنويسم. فقط به نظر شما نياز نيست موقع Delete از جدول Rank كه حالت master داره هم اين موضوع رو چك كنم.(اينكه اگر در جدول Score ركورد متناظر داره جلوگيري كنه از Delete)?

Elham_gh
سه شنبه 05 آذر 1387, 08:10 صبح
از Trigger تا جاييكه ممكنه استفاده نكنيد چون سرعت عملياتتون رو كم و در صورت داشتن كاربران زياد باعث ايجاد Dead Process ها مي شه.تو همون Stored Procedure تون اين كنتل رو انجام بدين.
در ضمن جدول Rank ، Master محسوب نمي شه.
(يك نكته- اين سئوال روندش داره به يه تالار ديگه مربوط مي شه:))