قاعدة البيانات تحتوي على جداول مترابطة بينها غالبا وكل جدول يحتوي على سجلات وكل سجل يجمع معلومات عن الصنف الذي يمثله الجدول.
مثلا AgmczDB >> فيها جدول Client تسجل فيه معلومات عن كل زبون, غير صحيح ان تنشئ جدول باسم احد الزبائن مثلا
بل تجمعهم في جدول واحد
PHP كود :
CREATE TABLE Client(id integer not NULL,
FirstName varchar(x) not NULL,
LastName Varchar(x) not NULL,
PRIMARY KEY(ID) )
بمعنى اخر انا اريد ان استعلم عن اسماء وتاريخ ميلاد كل الاعضاء سوف اكتب
PHP كود :
select name,date from Tablename
هل يمكنك ان تتخيل جملة الاستعلام التي ستكتبها انت لالف شخص والف جدول
مع ملاحظة اننا لم نتطرق الى الجداول المترابطة بعد
يعني انشاء جدول لكل عضو لايقدم اي حلول او تسهيلات بالوقت الذي يمكنك استخدام جدول واحد وانت مرتاح .
أولا شكرا للجميع...
أخي Delphi4Us عندما قلت (ليس منه فائدة بل انه يضر بقاعدة البيانات وتركيبتها...)
أردتك أن توضح الضرر الذي سيقع لقاعدة البيانات وتركيبتها؟
عموما للتوضيح أكثر البرنامج للتخزين
لنفرض أنني أعمل بناء وأريد أن أسجل كل الأعمال التي أقوم بها لـ (أحمد, عمر, خالد)
وأقوم بعرض التسجيلات على حدة لكل من (أحمد, عمر, خالد)
لقد قمت بذلك بإنشاء جدول لكن من (أحمد, عمر, خالد)
وبما الفكرة لم تعجبكم
ماهي أفضل الطرق التي يجب أن أتبعها للقيام بذلك؟
السلام عليكم
قم باشاء جدول 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
ملاحظة لم اجرب الاكواد وضعتها للشرح فقط
هذه هي الطريقة التي تعمل بها قواعد البيانات العلائقية
تمام أخي S.FATEH
تم تطبيق ماذكرت بنجاح
يبدوا ان العملية أكثر سلاسة هكذا.
عند إستعمال 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
وكل شيئ يعمل تمام.
فما الفرق بين الإستعلام الأول والثاني علما أنهما يعرضان نفس النتائج؟
السلام عليكم
(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
وعليكم السلام أخي
حمل المرفق وتأكد بنفسك
إضغط الأزرار بالترتيب
Insert Client
Insert Job
Select1
Delete
وألقي نظرة على جدول Client في القاعدة
وأخبرني هل أنا محق أم لا
السلام عليكم
عند اجابتي
لم اطلع على المرفقات اطلعت فقط على ردك اخي...
اذا كان لديك جدول
او
PHP كود :
select id_client, nom from client
نفس الشيئ
اذا كان لديك جدول jobs مع الجدول السابق
PHP كود :
Jobs(id_job, job, id_client)
PHP كود :
select * from client inner join jobs on (client.id_client = jobs.id_client)
او
PHP كود :
select client.id_client, client.job, jobs.id_job, jobs.job, jobs.id_client from client inner join jobs on (client.id_client = jobs.id_client)
نفس الشيئ
بالنسبة للمرفقات يمكن ان يكونا نفس الشيئ لكنهما ليسا نفس الشيئ !!!
5≠2

أعتقد أنه هناك سوء فهم
يمكن أنا لم أعرف كيف اصيغ الكلام كي تفهمني
فعند وضعي الرد التالي
إقتباس :عند إستعمال 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
