بمعنى اخر انا اريد ان استعلم عن اسماء وتاريخ ميلاد كل الاعضاء سوف اكتب
PHP كود :
select name,date from Tablename
هل يمكنك ان تتخيل جملة الاستعلام التي ستكتبها انت لالف شخص والف جدول
مع ملاحظة اننا لم نتطرق الى الجداول المترابطة بعد
يعني انشاء جدول لكل عضو لايقدم اي حلول او تسهيلات بالوقت الذي يمكنك استخدام جدول واحد وانت مرتاح .
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة1 user says Thank You to Delphi4Us for this post • Agmcz
أخي Delphi4Us عندما قلت (ليس منه فائدة بل انه يضر بقاعدة البيانات وتركيبتها...)
أردتك أن توضح الضرر الذي سيقع لقاعدة البيانات وتركيبتها؟
عموما للتوضيح أكثر البرنامج للتخزين
لنفرض أنني أعمل بناء وأريد أن أسجل كل الأعمال التي أقوم بها لـ (أحمد, عمر, خالد)
وأقوم بعرض التسجيلات على حدة لكل من (أحمد, عمر, خالد)
لقد قمت بذلك بإنشاء جدول لكن من (أحمد, عمر, خالد)
وبما الفكرة لم تعجبكم
ماهي أفضل الطرق التي يجب أن أتبعها للقيام بذلك؟
سبحان الله وبحمده سبحان الله العظيم
كل من 1 user says قال شكرا ل Agmcz على المشاركة المفيدة1 user says Thank You to Agmcz for this post • Delphi4Us
29-04-2020, 09:58 PM (آخر تعديل لهذه المشاركة: 29-04-2020, 10:01 PM بواسطة S.FATEH.)
السلام عليكم
قم باشاء جدول Client
PHP كود :
create table client( id_client integer not null primary key, nom varchar(100) )
بالنسبة لكل زبون تضيف سجل
PHP كود :
insert into client(id_client, nom)values(1, 'أحمد'); insert into client(id_client, nom)values(2, 'عمر'); insert into client(id_client, nom)values(3, 'خالد');
اذا اردت عرض الاعمال كما قلت
ليكن لدينا جدول الاعمال
Jobs
PHP كود :
create table jobs( id_job integer not null primary key, job varchar(200), id_client integer not null);
لاحظ في جدول الاعمال لدينا id_client
بالتالي قمت بالربط جدول الزبائن مع جدول الاعمال
للحصول على عمل كل زبون تقوم باستخدام الـ SQL بالربط بينهما
PHP كود :
select client.nom, jobs.job from client inner join jobs on (client.id_client = jobs.id_client);
اذا اردت عرظ المتعلق فقط بزبون عمر
PHP كود :
select client.nom, jobs.job from client inner join jobs on (client.id_client = jobs.id_client) where client.id_client =2
ملاحظة لم اجرب الاكواد وضعتها للشرح فقط
هذه هي الطريقة التي تعمل بها قواعد البيانات العلائقية
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
كل من 1 user says قال شكرا ل S.FATEH على المشاركة المفيدة1 user says Thank You to S.FATEH for this post • Agmcz
(30-04-2020, 10:07 PM)Agmcz كتب : وبعد حذف أي سجل من الجدول jobs
يتم حذف الزبون من الجدول client المربوط مع jobs
عند حذف client يتم حذف جميع الـ jobs و ليس العكس لا يمكن ان يوجد عمل بدون وجود client لكن يمكن ان يوجد client و ليس لديه اي عمل !
يسمى هذا الامر Referential Integrity
و يمكن اظافته لقاعدة البيانات ان كانت تدعمه
ON DELETE CASCADE يتم حذف جميع الابناء من جدول الابناء عند حذف الاب من جدول الاباء
ON UPDATE CASCADE يتم تحديث قيمة الحقل الغريب عند التحديث في الجدول الرئيسي
PHP كود :
ALTER TABLE JOBS ADD CONSTRAINT FK_1 FOREIGN KEY (ID_CLIENT) REFERENCES CLIENT (ID_CLIENT) ON DELETE CASCADE ON UPDATE CASCADE;
(30-04-2020, 10:07 PM)Agmcz كتب :
PHP كود :
select * from Jobs inner join Clients on (Jobs.Id_client = Clients.Id_client) where Clients.id_client =2
فستعملت الإستعلام التالي لحل المشكل
PHP كود :
select * from Jobs where id_client =2
فما الفرق بين الإستعلام الأول والثاني علما أنهما يعرضان نفس النتائج؟
الاستعلامين بالطريقة التي كتبتهما غير متكافئان و لا يعطيان نفس النتيجة الاستعلام الاول تحصل على جميع السجلات من الجدولين و الثاني غير ذلك
الاستعلام الاول لديك ربط بين الجدولين يمكن ان تحصل على اسم الـ client من جدول الـ client و العمل الخاص به job من جدول الـ jobs
الاستعلام الثاني لا يمكن الحصول على اسم الـ client من جدول الـ client تتعامل فقط مع جدول الـ jobs
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
كل من 1 user says قال شكرا ل S.FATEH على المشاركة المفيدة1 user says Thank You to S.FATEH for this post • Agmcz
وعليكم السلام أخي
حمل المرفق وتأكد بنفسك
إضغط الأزرار بالترتيب
Insert Client
Insert Job
Select1
Delete
وألقي نظرة على جدول Client في القاعدة
وأخبرني هل أنا محق أم لا
أعتقد أنه هناك سوء فهم
يمكن أنا لم أعرف كيف اصيغ الكلام كي تفهمني
فعند وضعي الرد التالي
إقتباس :عند إستعمال inner join يتم ربط الجدولين مع بعض
PHP كود :
الإستعلام الأول select * from Jobs inner join Clients on (Jobs.Id_client = Clients.Id_client) where Clients.id_client =2
وبعد حذف أي سجل من الجدول jobs
يتم حذف الزبون من الجدول client المربوط مع jobs
فستعملت الإستعلام التالي لحل المشكل
PHP كود :
الإستعلام الثاني select * from Jobs where id_client =2
وكل شيئ يعمل تمام.
فما الفرق بين الإستعلام الأول والثاني علما أنهما يعرضان نفس النتائج؟
فعند إستعمال الإستعلام الأول و تنفيذ ADOQuery1.Delete;
يحذف سجل من jobs وزبون من clients
أما عند إستعمال الإستعلام الثاني و تنفيذ ADOQuery1.Delete;
يحذف سجل من jobs فقط
أعلم أن الإستعلام الثاني يقوم بتحديد الجدول jobs فقط فعند تنفيذ ADOQuery1.Delete;
فبطبيعة الحال عند الحذف لن يتأثر جدول Clients
كيف أستعمل الإستعلام الأول مع ADOQuery1.Delete;
بشرط أن لا يحذف زبون من جدول Clients
ردك
إقتباس :الاستعلامين بالطريقة التي كتبتهما غير متكافئان و لا يعطيان نفس النتيجة الاستعلام الاول تحصل على جميع السجلات من الجدولين و الثاني غير ذلك
الاستعلام الاول لديك ربط بين الجدولين يمكن ان تحصل على اسم الـ client من جدول الـ client و العمل الخاص به job من جدول الـ jobs
الاستعلام الثاني لا يمكن الحصول على اسم الـ client من جدول الـ client تتعامل فقط مع جدول الـ jobs
أعلم أن الإستعلامين غير متكافئين فلا يمكن أن نقول 5 = 2 لكن بما أنني أقوم بعرض في DBGrid الحقلين (id_job, job) فقط
فيمكن أن نقول 5 = 2