• 0
Adel_N

لماذا يتم إنشاء علاقات بين الجداول؟

سؤال

السلام عليكم ورحمة الله

أنا زميل لكم من قسم VB.Net ولا أكتب في هذا القسم عادة، وهذه أول مشاركة لي هنا وهي عبارة عن استفسار.

قد سبق لي أن صممت برامج إدارية بسيطة تعتمد قواعد البيانات. حيث أنشأ دائماً علاقات بين الجداول. هذه بعض الأمثلة:

1191688348_01.jpg

1191688400_02.jpg

ولكي أوضح اسفساري تخيل:

1- لدينا جدول للعملاء اسمه Customer في حقول وأهم حقل CustomerID وهو Primary Key في هذا الجدول.

2- لدينا جدول للطلبات اسمه Order فيه حقول وأهم حقلين هما OrderID وهو Primary Key في هذا الجدول و CustomerID وهو Foreign Key في هذا الجدول.

3- كالعادة ننشأ علاقة رأس بأطراف بين الجدولين عبر الحقل CustomerID.

نأتي للتطبيق في VB.Net:

حينما أريد أن أختار طلبات العميل 10001 فإني أكتب جملة SQL وأرسلها إلى DataAdapeter والجملة هي:

SELECT * FROM Order WHERE CustomerID=10001

وإذا أردت أن أعرض معلومات العميل 10001 علي كتابة جملة أخرى هي:

SELECT * FROM Customer WHERE CustomerID=10001

وهاتان الجملتان تعملان حتى في ظل عدم وجود علاقة بين الجدولين.

السؤال: متى أستشعر عملياً فائدة العلاقات والسبب من إنشائها؟

ما أعرفه إلى الآن أنها تساعدني في التأكد من ترابط الإدخالات في أكثر من جدول (في المثال السابق: لا يتم إدخال طلب لعميل في ظل عدم وجود سجل له في جدول العملاء). هذه الميزة لا أقلل من شأنها ولكني بشكل أو بآخر أستخدم VB.Net للتحقق من وجود السجل المتبوع قبل إنشاء سجل تابع. ولهذا فهي تكاد تكون غير محسوبة.

الميزة التي تجعلني أنشأ علاقات أن التغيير بالحذف أو التعديل على سجل متبوع يحذف أو يعدل جميع السجلات التابعة. وهذا ما يجعلني أنشأ علاقات.

هل هناك فوائد ملموسة للعلاقات بين الجدوال غير:

1- التأكد من ترابط الإدخالات.

2- عكس التغييرات التي تحدث للسجل المتبوع على جميع السجلات التابعة.

ملحوظة: أنني أستخدم VB.Net كـ Interface و لا أستخدم Access. كما أن ما سبق يبرر إنشاء العلاقات ولكني أستفسر عن مزيد من الفوائد للعلاقات.

أخوكم.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

11 إجابة على هذا السؤال .

  • 0

السلام عليكم ورحمة الله وبركاته

أهلا بك أخي الكريم في قسم الأكسس وكل عام وانت بخير

أخي الفاضل .. حقيقة سؤالك هذا يحتاج لو أسهبنا لمجلد كامل للإجابة عنه .. ولكن سأختصر

وأكتب ما أعلمه عن هذا الموضوع الذي يخص صلب قواعد البيانات .. فعلى بركة الله نبدأ

اذا كان الجداول ننعتها بـ العمود الفقري لفاعدة البيانات فإن العلاقات يمكن أن تنعت بشريان وأواردة

قواعد البيانات بدون مبالغة إذ أنه من خلال الربط بعلاقات بين الجدول سيكون لديك المعطيات التالية :

1- عدم تكرار البيانات في أكثر من جدول

2- وضع البيانات في وحدات متجانسة ( جداول ) مهما صغرت

3- سهولة ومرونه في التحديث للبيانات ( إضافة أو حذف )

4- الحصول على البيانات من جدول واحد أو أكثر بكل يسر وسهوله وأنت ذكرت في مثالك الخاص بالاستعلام

أنك حصلت على النتائج بيسر وسهولة بدون علاقة ( هذا لأنك تعاملت مع جدول واحد ) لكن كيف لو أحتجت لبيانات من أكثر من جدولين

أو ثلاثة - حتما ستحتاج للعلاقة كمثال على ذلك ماذا لو أحتجت لمعرفة العملاء اللذين اشتروا منك صنف كذا ( مثل طابعة ليزر ) العملاء

في جدول والاصناف في جدول من المؤكد أنك ستحتاج علاقة بين جدول العملاء وجدول الاصناف لتمكنك من ذلك ( وهذا هو أهم شيء )

من ناحية عدم التكرار - هذا مفيد جدا جدا ( تخيل أن لديك جدول العملاء وبه حقل الجنسية ) جنسية العميل

هل من المنطقي أن تجعل حقل الجنسية ضمن جدول العملاء وكل ما أدخلت معلومات عميل تدخل جنسيته .. لو أن لديك 2000 عميل

نصفهم سعوديون مثلا هل من المعقول أن تكرر حقل الجنسية في جدول واحد 1000 مره ؟!!!!!!!!!! طبعا الجواب لا .. اذا الحل أن أعمل

جدول للجنسيات وأربطه بعلاقة مع جدول العملاء ويكون الادخال جاهز لدينا بدون تكرار .

ايضا مفيدة في تحديث البيانات .. يكفي أن تحذف عميل واحد ليتم حذف جميع مايتعلق به من معلومات أخرى .. لو لم تك العلاقة موجوده

أنت مضطر لحذف الحقول حقلا حقلا مما يربكك وقد يستغرق منك الكثير من الوقت وربما نسيت حقول ما مما يتسبب في وجود أخطأ ستولد مشاكل

أخرى ستظهر لك تباعا عند البحث أو في المجاميع أو الارصدة أو غيرها

أذا بعد كل ماتقدم أريد أن أقول أنه من الضروري ربط الجداول لأن التصميم الجيد لقاعدة البيانات يتطلب منك أن تنشىء

جداول صغيره يشتمل كلاً منها على بيانات ذات طبيعة واحدة ومن المنطقي القيام بريطها

هذا شرح بسيط ومركز حول فؤائد العلاقات .. ولعل الإخوة لديهم الكثير في ذات الموضوع

قم بزيارة هذا الرابط للإستزادة - موضوع ذا صلة

.. والسلام

أخوكم / EKSEER

تم تعديل بواسطه ekseer
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وعليكم السلام ورحمة الله وبكاته.

ألف شكر لك أخي إكسير على هذا التفاعل ومن الواضح أنك تحب أن تنفع الناس بعلمك فجزاك الله الجنة على ذلك.

نحن هنا لتناقش أخي وأتمنى أن لا أزعجك. يؤسفني أخي الغالي أن أقول لك أن أغلب الأهداف الرئيسية التي ذكرتَها يمكن تحقيقها دون إنشاء أي علاقة، لأنها تتحقق بمجرد التصميم الجيد للجداول. أوضح لك ما فهمته:

عدم تكرار البيانات في أكثر من جدول

نأخذ مثالك على الجنسيات لأنه مثال جيد:

من ناحية عدم التكرار - هذا مفيد جدا جدا ( تخيل أن لديك جدول العملاء وبه حقل الجنسية ) جنسية العميل

هل من المنطقي أن تجعل حقل الجنسية ضمن جدول العملاء وكل ما أدخلت معلومات عميل تدخل جنسيته .. لو أن لديك 2000 عميل

نصفهم سعوديون مثلا هل من المعقول أن تكرر حقل الجنسية في جدول واحد 1000 مره ؟!!!!!!!!!! طبعا الجواب لا .. اذا الحل أن أعمل

جدول للجنسيات وأربطه بعلاقة مع جدول العملاء ويكون الادخال جاهز لدينا بدون تكرار .

عملياً: أنا لن أدخل الجنسيات في جدول العملاء ولكني سأنشأ جدول اسمه Nationalities به الحقل NatID مثلاً وأضع نفس الحقل في جدول العملاء. وعند إدخال عميل أدخل رقم جنسيته 01 مثلاً. ألم يقضي إنشاء الجدول لوحده على مخاطر تكرار البيانات؟

سهولة ومرونه في التحديث للبيانات ( إضافة أو حذف )

إيجابية لا يمكن إغفالها.

الحصول على البيانات من جدول واحد أو أكثر

هذه لم أفهمها لأنني أواجه صعوية جداً في بعض أتواع الاستعلامات ولا أفهم نتائجها. ولكني أعتقد أنها إيجابية أشكرك على ذكرها وهي إضافة مهمة على الموضوع بالنسبة لأني ضعيف في هذا الجانب. وفي مثالك الجميل:

كمثال على ذلك ماذا لو أحتجت لمعرفة العملاء اللذين اشتروا منك صنف كذا ( مثل طابعة ليزر ) العملاء

في جدول والاصناف في جدول من المؤكد أنك ستحتاج علاقة بين جدول العملاء وجدول الاصناف لتمكنك من ذلك ( وهذا هو أهم شيء )

ما قمت به بعد أن فكرت في مثالك هو أن عملت قاعدة بيانات:

1- جدول العملاء Customer به حقل CustomerID و CustomerName.

2- جدول للطلبات Orders وبه OrderID و CustomerID و ItemID (على اعتبار لأن كل طلب يحتوي صنف واحد فقط!)

3- جدول الأصناف Item وبه ItemID.

4- لم أقم بإنشاء أي علاقة.

سأحاول الآن أن أكتب جملة SQL لمعرفة جميع التفاصيل حول العملاء الذين اشتروا الصنف 1001

وسأرجع هنا لاحقاً لأتحدث إليك في حالة نجاحي أو إخفاقي.

أذا بعد كل ماتقدم أريد أن أقول أنه من الضروري ربط الجداول لأن التصميم الجيد لقاعدة البيانات يتطلب منك أن تنشىء

بالطبع.

أخوك المخلص دائماً.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وسأرجع هنا لاحقاً لأتحدث إليك في حالة نجاحي أو إخفاقي.

يخبرني الأكسس بوجود خطأ في هذه الجملة وقد قرأتها في منتديات أجنبية وغيرت ما يلزم...

SELECT CustomerID
FROM Customer
WHERE CustomerID IN
(SELECT CustomerID
FROM Order
WHERE ItemID = '1001');

الرجاء توضيح الخطأ.

قاعدة البيانات مرفقة.

db.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

أولا :

لي فقط سؤال بسيط ( مالمحكمة من إنشاء الجدول Order )

طالما أن جميع حقوله موجوده بالاصل في الجدوال الاخرى ؟؟؟؟؟؟؟؟

ثانيا :

أعتقد انك تريد معرفة جميع العملاء الذين اشتروا الصنف 1001

اذا طريقة تصميم القاعدة بهذا الشكل خطأ .. ولو فرضنا جدلا أننا نريد تصميم استعلام على قاعدتك كما هي فأن بنية الاستعلام ستكون

هكذا أنظر الكود ؟ الأتي

SELECT Customer.CustomerID, Customer.CustomerName, Order.ItemID, Item.ItemName
FROM Customer, Item, [Order]
WHERE (((Order.ItemID)="1001"));

أنظر نتيجة الاستعلام بدون علاقة !!!!!!!!!!!!!!!!!!!

adel.gif

لكن مع حذف الجدول Order وبنا علاقة بين الجدولين Customer و Item وعمل الاستعلام التالي

SELECT Customer.CustomerID, Customer.CustomerName, Item.ItemName, Item.ItemID
FROM Item INNER JOIN Customer ON Item.ItemID = Customer.ItemID
WHERE (((Item.ItemID)=1001));

أنظر كيف كانت النتيجة

adel002.gif

adel003.gif

مرفق قاعدتك الاولى وبها الاستعلام بدون علاقات - ومرفق قاعدة أرى أنها البناء الصحيح والسلام

Ekseer

Ek_Data.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ألف ألف شكر.. يا أخي لك مني فائق الاحترام.

أنا الآن مقتنع وبدأت أستشعر فائدة العلاقات وتأثيرها على الاستعلام.

أخوك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أعتقد انك تريد معرفة جميع العملاء الذين اشتروا الصنف 1001

وهذا أيضاً يعمل:

SELECT DISTINCT Customer.CustomerID, Customer.CustomerName
FROM Customer INNER JOIN [Order] ON Customer.CustomerID = Order.CustomerID
WHERE (((Order.ItemID)="1001"));

شكراً لك.. إنني الآن أقرأ عن INNER JOIN...

أخوك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

كل عام وانتم طيبين

بارك الله فيك اخي اكسير الحياة - زادك الله بسطة فى العلم والجسم

اخي الكريم صاحب المشاركة هذه http://www.arabteam2000-forum.com/index.php?showtopic=121241

وصلة لتحميل كتاب فى صلب الموضوع

اخوكم فى الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام   عليكم ورحمة الله

بالاضافة الى  ما  ذكر  من  ميزات للعلاقات يكفي  ان  تحميك من  عدم  حذف جدول بالخطأ  وخاصة  عند  زيون   عند القيام

 بعمل  تحديثات له

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أولا :

لي فقط سؤال بسيط ( مالمحكمة من إنشاء الجدول Order )

طالما أن جميع حقوله موجوده بالاصل في الجدوال الاخرى ؟؟؟؟؟؟؟؟

لكن مع حذف الجدول Order وبنا علاقة بين الجدولين Customer و Item وعمل الاستعلام التالي

كودSELECT Customer.CustomerID, Customer.CustomerName, Item.ItemName, Item.ItemID

FROM Item INNER JOIN Customer ON Item.ItemID = Customer.ItemID

WHERE (((Item.ItemID)=1001));

أنظر كيف كانت النتيجة

adel002.gif

adel003.gif

السلام عليكم

الأخ اكسير/أختلف معك كثيراً في وجهة النظر بما يتعلق بإنشاء جدولين بدلاً عن ثلاثة، وذلك لأن طبيعة العلاقة هنا بين الجدولين Customer و Item علاقة متعدد لمتعدد وليست واحد لمتعدد. لماذا؟

لأن اي customer يمكن ان يكون له اكثر من item في طلبية ما، وأي item يمكن ان يُطلب عن طريق اكثر من customer واحد. فإذا تم الاستغناء عن جدول الـ orders كما اقترحت فإن تكراراً سينشأ في جدول الـ customer للحقلين customer ID و customer Name وهو امر غير مقبول خصوصاً وانك جعلت حقل customer ID مفتاح اساسي !!!!!!!!

فعندها يصبح لزاماً انشاء جدول آخر هو جدول الطلبيات orders كما فعل الأخ Adel-N وذلك لتلافي التكرار المذكور اعلاه وعليه تصبح العلاقة متعدد لمتعدد. أليـــــس كذلــــــك؟؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله

أخي : ArcKive كلامك سليم 100 % ولا أدري كيف فاتني ذلك

الله يذكرك الشهادة ويرحم والديك ( مثل هذا خطأ قاتل في قواعد البيانات )

لكن كان همي أن أوضح للأخ الكريم Adel_N فؤائد العلاقة ولم أحلل الجداول بما فيه الكفاية

عموما تم التعديل فعلا يجب أن تكون العلاقة متعدد لمتعدد

لأن اي customer يمكن ان يكون له اكثر من item في طلبية ما، وأي item يمكن ان يُطلب عن طريق اكثر من customer واحد

أذا لابد من الجدول Order وعليه يكون شكل العلاقة يجب أن تكون هكذا

mntda002.gif

والاستعلام يكون هكذا

SELECT Customer.CustomerID, Customer.CustomerName, Order.ItemID, Item.ItemName
FROM (Item INNER JOIN [Order] ON Item.ItemID = Order.ItemID) INNER JOIN Customer ON Order.CustomerID = Customer.CustomerID
WHERE (((Order.ItemID)="1001"));

وبذالك نحصل على البيانات بشكل صحيح وبدون تكرار أنظر الصورة Order

ملاحظة / العميل وليد اشترى الصنف 1001 مرتين أنظر لرقم العملية في جدول

mntda003.gif

المثال في المرفقات

Ek_Data2.rar

تم تعديل بواسطه ekseer
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك أخي اكسير. ولكني لاحظت في المثال المُعدّل أنّــــك قمت بعمل ربط join بين ثلاثة الجداول وذلك في نافذة تصميم الاستعلام ولم تقم بعمل علاقة فعلية بين الجداول الثلاثة أعلاه، أي أن علاقة الربط فقط متعلقة بالاستعلام الموجود بالمثال ويمكن طبعا تغيير نوعية الربط من استعلام لآخر. طبعاً هذا أدّى الى المطلوب ولكن لا يُغني عن إنشاء العلاقة. أرجح أنك فعلت ذلك للتوضيح المختصر فقط باعتبار أنّ إنشاء العلاقة أمر بديهي وسبق وقمتَ - أنت - في شرحك بتوضيحه. أمّا أنا فقد أردتُ فقط التأكد من افتراضي اذا كان صحيحاً بشأن عدم انشاء علاقة ثابتة بين الثلاث جداول بدلا من عمل ربط بينهم خاص فقط بالاستعلام الموجود بالمثال.

بارك الله فيــــك ولا يفوتني أن أهنّئك على الترقية وبقية الأخوة آملاً أن أراكم قريباً بإذن الله من الذين يُشار إليهم بالبنان في وطننا العربي بل وفي العالم.. ولمَ لا؟

أخيــــك المُحــــبّ في الله..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .