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 بنوع البيانات نفسه المذكور أعلاه.

15.2.8. إنشاء المفاتيح في SQL

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

../../../_images/er-people-streets.png

هناك طريقتان لفعل ذلك:

  • إضافة المفتاح بعد إنشاء الجدول

  • تعريف المفتاح وقت إنشاء الجدول

جدولنا أُنشئ بالفعل، لذا لنستخدم الطريقة الأولى:

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 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) لإضافة بيانات جديدة.