15.2. الدرس: تنفيذ نموذج البيانات¶
بعد أن غطّينا الجانب النظري كله، لننشئ قاعدة بيانات جديدة. ستُستخدم قاعدة البيانات هذه في تمارين الدروس التالية.
هدف هذا الدرس: تثبيت البرمجيات اللازمة واستخدامها لتنفيذ قاعدة البيانات النموذجية.
15.2.1. تثبيت PostgreSQL¶
ملاحظة
يمكنك العثور على حزم PostgreSQL وتعليمات تثبيتها لنظام تشغيلك على https://www.postgresql.org/download/. يُرجى ملاحظة أن هذا التوثيق يفترض أن المستخدمين يشغّلون QGIS على Ubuntu.
على Ubuntu:
sudo apt install postgresql-9.1
يُفترض أن تظهر لك رسالة كهذه:
[sudo] password for qgis:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
postgresql-client-9.1 postgresql-client-common postgresql-common
Suggested packages:
oidentd ident-server postgresql-doc-9.1
The following NEW packages will be installed:
postgresql-9.1 postgresql-client-9.1 postgresql-client-common postgresql-common
0 upgraded, 4 newly installed, 0 to remove and 5 not upgraded.
Need to get 5,012kB of archives.
After this operation, 19.0MB of additional disk space will be used.
Do you want to continue [Y/n]?
اضغط Y ثم Enter وانتظر حتى ينتهي التنزيل والتثبيت.
15.2.2. المساعدة¶
يمتلك PostgreSQL توثيقًا ممتازًا على الإنترنت.
15.2.3. إنشاء مستخدم لقاعدة البيانات¶
على Ubuntu:
بعد اكتمال التثبيت، شغّل هذا الأمر لتصبح المستخدم postgres ثم أنشئ مستخدمًا جديدًا لقاعدة البيانات:
sudo su - postgres
اكتب كلمة مرور تسجيل الدخول المعتادة عند طلبها (يجب أن تكون لديك صلاحيات sudo).
الآن، في موجّه bash الخاص بالمستخدم postgres، أنشئ مستخدم قاعدة البيانات. تأكد من أن اسم المستخدم يطابق اسم تسجيل دخولك في unix: فهذا سيسهّل عليك الأمور كثيرًا، إذ سيصادق postgres على هويتك تلقائيًّا عندما تكون مسجّل الدخول بذلك المستخدم:
createuser -d -E -i -l -P -r -s qgis
أدخل كلمة مرور عند طلبها. ينبغي أن تستخدم كلمة مرور مختلفة عن كلمة مرور تسجيل الدخول.
ماذا تعني هذه الخيارات؟
-d, --createdb role can create new databases
-E, --encrypted encrypt stored password
-i, --inherit role inherits privileges of roles it is a member of (default)
-l, --login role can login (default)
-P, --pwprompt assign a password to new role
-r, --createrole role can create new roles
-s, --superuser role will be superuser
يجب الآن أن تغادر بيئة صدفة bash الخاصة بالمستخدم postgres بكتابة:
exit
15.2.4. التحقق من الحساب الجديد¶
psql -l
يُفترض أن يُرجع شيئًا كهذا:
Name | Owner | Encoding | Collation | Ctype |
----------+----------+----------+------------+------------+
postgres | postgres | UTF8 | en_ZA.utf8 | en_ZA.utf8 |
template0 | postgres | UTF8 | en_ZA.utf8 | en_ZA.utf8 |
template1 | postgres | UTF8 | en_ZA.utf8 | en_ZA.utf8 |
(3 rows)
اكتب Q للخروج.
15.2.5. إنشاء قاعدة بيانات¶
يُستخدم الأمر createdb لإنشاء قاعدة بيانات جديدة. يجب تشغيله من موجّه صدفة bash:
createdb address -O qgis
يمكنك التحقق من وجود قاعدة بياناتك الجديدة باستخدام هذا الأمر:
psql -l
ويُفترض أن يُرجع شيئًا كهذا:
Name | Owner | Encoding | Collation | Ctype | Access privileges
----------+----------+----------+------------+------------+-----------------------
address | qgis | UTF8 | en_ZA.utf8 | en_ZA.utf8 |
postgres | postgres | UTF8 | en_ZA.utf8 | en_ZA.utf8 |
template0 | postgres | UTF8 | en_ZA.utf8 | en_ZA.utf8 | =c/postgres: postgres=CTc/postgres
template1 | postgres | UTF8 | en_ZA.utf8 | en_ZA.utf8 | =c/postgres: postgres=CTc/postgres
(4 rows)
اكتب Q للخروج.
15.2.6. بدء جلسة صدفة قاعدة البيانات¶
يمكنك الاتصال بقاعدة بياناتك بسهولة هكذا:
psql address
للخروج من صدفة قاعدة البيانات psql، اكتب:
\q
للحصول على مساعدة في استخدام الصدفة، اكتب:
\?
للحصول على مساعدة في استخدام أوامر sql، اكتب:
\help
للحصول على مساعدة بخصوص أمر معيّن، اكتب (مثلًا):
\help create table
راجع أيضًا ورقة مرجعية مختصرة لـ Psql.
15.2.7. إنشاء الجداول في SQL¶
لنبدأ بإنشاء بعض الجداول! سنستخدم مخطط الكيانات والعلاقات (ER Diagram) دليلًا لنا. اتصل أولًا بقاعدة البيانات address:
psql address
ثم أنشئ جدول streets:
create table streets (id serial not null primary key, name varchar(50));
serial و varchar هما نوعا بيانات. يطلب serial من PostgreSQL بدء تسلسل أعداد صحيحة (ترقيم تلقائي) لملء id تلقائيًّا لكل سجل جديد. ويطلب varchar(50) من PostgreSQL إنشاء حقل نصي بطول 50 حرفًا.
ستلاحظ أن الأمر ينتهي بـ ;، إذ يجب إنهاء جميع أوامر SQL بهذه الطريقة. عند الضغط على Enter، سيعرض psql شيئًا كهذا:
NOTICE: CREATE TABLE will create implicit sequence "streets_id_seq"
for serial column "streets.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index
"streets_pkey" for table "streets"
CREATE TABLE
وهذا يعني أن جدولك أُنشئ بنجاح، مع مفتاح أساسي streets_pkey يستخدم streets.id.
ملاحظة: إذا ضغطت Enter دون إدخال ;، فسيظهر لك موجّه كهذا: address-#. ذلك لأن PostgreSQL ينتظر منك إدخال المزيد. أدخل ; لتشغيل الأمر.
لعرض مخطط (schema) جدولك، يمكنك فعل ما يلي:
\d streets
ويُفترض أن يعرض شيئًا كهذا:
Table "public.streets"
Column | Type | Modifiers
--------+-----------------------+--------------------------------------
id | integer | not null default
| | nextval('streets_id_seq'::regclass)
name | character varying(50) |
Indexes:
"streets_pkey" PRIMARY KEY, btree (id)
لعرض محتويات جدولك، يمكنك فعل ما يلي:
select * from streets;
ويُفترض أن يعرض شيئًا كهذا:
id | name
---+------
(0 rows)
كما ترى، جدولنا فارغ حاليًا.
جرّب بنفسك: ★★☆¶
استخدم الطريقة الموضحة أعلاه لإنشاء جدول باسم people:
أضف حقولًا مثل رقم الهاتف وعنوان المنزل والاسم وغير ذلك (ليست جميع هذه الأسماء صالحة: غيّرها لتصبح صالحة). تأكد من إعطاء الجدول عمود ID بنوع البيانات نفسه المذكور أعلاه.
الإجابة
أوامر SQL اللازمة لإنشاء جدول people الصحيح هي:
create table people (id serial not null primary key,
name varchar(50),
house_no int not null,
street_id int not null,
phone_no varchar null );
يبدو مخطط الجدول (أدخل \\d people) كما يلي:
Table "public.people"
Column | Type | Modifiers
-----------+-----------------------+-------------------------------------
id | integer | not null default
| | nextval('people_id_seq'::regclass)
name | character varying(50) |
house_no | integer | not null
street_id | integer | not null
phone_no | character varying |
Indexes:
"people_pkey" PRIMARY KEY, btree (id)
لأغراض التوضيح، أغفلنا قيد المفتاح الأجنبي (fkey) عمدًا.
15.2.8. إنشاء المفاتيح في SQL¶
مشكلة الحل السابق أن قاعدة البيانات لا تعرف أن بين الأشخاص والشوارع علاقة منطقية. وللتعبير عن هذه العلاقة، علينا تعريف مفتاح أجنبي يشير إلى المفتاح الأساسي لجدول الشوارع.
هناك طريقتان لفعل ذلك:
إضافة المفتاح بعد إنشاء الجدول
تعريف المفتاح وقت إنشاء الجدول
جدولنا أُنشئ بالفعل، لذا لنستخدم الطريقة الأولى:
alter table people
add constraint people_streets_fk foreign key (street_id) references streets(id);
يخبر ذلك الجدول people بأن حقول street_id فيه يجب أن تطابق id شارع صالحًا من الجدول streets.
الطريقة الأكثر شيوعًا لإنشاء قيد هي إنشاؤه عند إنشاء الجدول:
create table people (id serial not null primary key,
name varchar(50),
house_no int not null,
street_id int references streets(id) not null,
phone_no varchar null);
\d people
بعد إضافة القيد، يبدو مخطط جدولنا الآن هكذا:
Table "public.people"
Column | Type | Modifiers
-----------+-----------------------+---------------------------------
id | integer | not null default
| | nextval('people_id_seq'::regclass)
name | character varying(50) |
house_no | integer | not null
street_id | integer | not null
phone_no | character varying |
Indexes:
"people_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"people_streets_fk" FOREIGN KEY (id) REFERENCES streets(id)
15.2.9. إنشاء الفهارس في SQL¶
نريد عمليات بحث فائقة السرعة في أسماء الأشخاص. ولتحقيق ذلك، يمكننا إنشاء فهرس على عمود الاسم في جدول الأشخاص:
create index people_name_idx on people(name);
\d people
والنتيجة:
Table "public.people"
Column | Type | Modifiers
-----------+-----------------------+-----------------------------------
id | integer | not null default nextval
| | ('people_id_seq'::regclass)
name | character varying(50) |
house_no | integer | not null
street_id | integer | not null
phone_no | character varying |
Indexes:
"people_pkey" PRIMARY KEY, btree (id)
"people_name_idx" btree (name) <-- new index added!
Foreign-key constraints:
"people_streets_fk" FOREIGN KEY (id) REFERENCES streets(id)
15.2.10. حذف الجداول في SQL¶
إذا أردت التخلص من جدول، يمكنك استخدام الأمر DROP:
drop table streets;
في مثالنا الحالي، لن ينجح الأمر السابق. لماذا؟
الإجابة
سبب عدم نجاح الأمر DROP في هذه الحالة هو أن للجدول people قيد مفتاح أجنبي يشير إلى الجدول streets. وهذا يعني أن إسقاط (أو حذف) الجدول streets سيترك الجدول people بمراجع إلى بيانات streets غير موجودة.
يمكن "إجبار" حذف الجدول streets باستخدام الأمر CASCADE، لكن ذلك سيحذف أيضًا الجدول people وأي جدول آخر له علاقة بالجدول streets. استخدمه بحذر!
إذا استخدمت الأمر drop table نفسه على الجدول people، فسينجح:
drop table people;
ملاحظة
إذا أدخلت ذلك الأمر فعلًا وحذفت الجدول people، فهذا وقت مناسب لإعادة إنشائه، لأنك ستحتاج إليه في التمارين التالية.
15.2.11. كلمة عن pgAdmin III¶
نعرض لك أوامر SQL من موجّه psql لأنه طريقة مفيدة جدًّا لتعلّم قواعد البيانات. ومع ذلك، توجد طرق أسرع وأسهل لإنجاز كثير مما نعرضه. ثبّت pgAdmin III وستتمكن من إنشاء الجداول وحذفها وتعديلها وغير ذلك بعمليات "التأشير والنقر" في واجهة رسومية.
على Ubuntu، يمكنك تثبيته هكذا:
sudo apt install pgadmin3
سيُتناول pgAdmin III بتفصيل أكبر في وحدة أخرى.
15.2.12. الخلاصة¶
رأيت الآن كيف تنشئ قاعدة بيانات جديدة تمامًا، بدءًا من الصفر.
15.2.13. ما التالي؟¶
ستتعلم فيما يلي كيف تستخدم نظام إدارة قواعد البيانات (DBMS) لإضافة بيانات جديدة.