37. مخططات PostgreSQL¶
تحتوي قواعد بيانات الإنتاج حتمًا على عدد كبير من الجداول والعروض (views)، وقد تصبح إدارتها جميعًا في مخطط واحد مرهقة بسرعة. ولحسن الحظ، يتضمن PostgreSQL مفهوم "_Schema" (المخطط).
المخططات تشبه المجلدات، ويمكن أن تحتوي على جداول وعروض (views) ودوال ومتسلسلات (sequences) وعلاقات أخرى. تبدأ كل قاعدة بيانات بمخطط واحد هو المخطط public.
داخل هذا المخطط، ينشئ التثبيت الافتراضي لـ PostGIS علاقات البيانات الوصفية geometry_columns و geography_columns و spatial_ref_sys، إضافة إلى جميع الأنواع والدوال التي تستخدمها PostGIS. لذا يحتاج مستخدمو PostGIS دائمًا إلى صلاحية الوصول إلى المخطط public.
يمكنك أيضًا أن ترى في المخطط public جميع الجداول التي أنشأناها حتى الآن في هذه الورشة.
37.1. لماذا نستخدم المخططات؟¶
هناك سببان وجيهان جدًا لاستخدام المخططات:
البيانات المُدارة في مخطط يسهل تطبيق العمليات الجماعية عليها.
يسهل النسخ الاحتياطي للبيانات الموجودة في مخطط منفصل: إذ يمكن أن يكون للبيانات المتغيرة جدول نسخ احتياطي مختلف عن البيانات غير المتغيرة.
تسهل استعادة البيانات الموجودة في مخطط منفصل: إذ يمكن استعادة المخططات الخاصة بالتطبيقات ونسخها احتياطيًا كلٌّ على حدة لأغراض الرجوع الزمني والاسترداد.
تسهل إدارة الفروق بين التطبيقات عندما تكون بيانات التطبيق في مخطط: إذ يمكن لإصدار جديد من البرنامج أن يعمل على بنية جداول في مخطط جديد، ويقتصر الانتقال على تغيير بسيط في اسم المخطط.
يمكن قصر عمل المستخدمين على مخططات منفردة لعزل جداول التحليل والاختبار عن جداول الإنتاج.
لذا، لأغراض الإنتاج، يؤدي فصل بيانات تطبيقك في مخططات إلى تحسين الإدارة؛ ولأغراض المستخدمين، يمنع وضع كل مستخدم في مخطط منفصل تداخل عملهم بعضهم مع بعض.
37.2. إنشاء مخطط للبيانات¶
لننشئ مخططًا جديدًا وننقل جدولًا إليه. أولًا، أنشئ مخططًا جديدًا في قاعدة البيانات:
CREATE SCHEMA census;
بعد ذلك، سننقل الجدول nyc_census_blocks إلى المخطط census:
ALTER TABLE nyc_census_blocks SET SCHEMA census;
إذا كنت تستخدم برنامج سطر الأوامر psql فستلاحظ أن nyc_census_blocks قد اختفى الآن من قائمة جداولك! وإذا كنت تستخدم PgAdmin فقد تحتاج إلى تحديث العرض لترى المخطط الجديد والجدول الموجود داخله.
يمكنك الوصول إلى الجداول داخل المخططات بطريقتين:
بالإشارة إليها باستخدام الصيغة
schema.tableبإضافة المخطط إلى
search_path
الإشارة الصريحة سهلة، لكن كتابتها تصبح مُتعبة بعد فترة:
SELECT * FROM census.nyc_census_blocks LIMIT 1;
يُعد التحكم في search_path طريقة جيدة لإتاحة الوصول إلى الجداول في مخططات متعددة دون الكثير من الكتابة الإضافية.
يمكنك ضبط search_path أثناء التشغيل باستخدام الأمر SET:
SET search_path = census, public;
يضمن هذا البحث عن جميع الإشارات إلى العلاقات والدوال في كلا المخططين census و public. تذكّر أن جميع دوال PostGIS وأنواعها موجودة في public، لذا لا نريد حذفه من مسار البحث.
قد يصبح ضبط مسار البحث في كل مرة تتصل فيها مُتعبًا أيضًا، لكن لحسن الحظ يمكن ضبط مسار البحث بشكل دائم لمستخدم ما:
ALTER USER postgres SET search_path = census, public;
الآن سيكون المخطط census دائمًا في مسار البحث الخاص بالمستخدم postgres.
37.3. إنشاء مخطط للمستخدم¶
يحب المستخدمون إنشاء الجداول، ومستخدمو PostGIS على وجه الخصوص: فعمليات التحليل باستخدام SQL تتطلب جداول مؤقتة للعرض المرئي أو للنتائج المرحلية، لذا تميل SQL المكانية إلى أن تتطلب امتلاك المستخدمين صلاحيات CREATE أكثر من أعباء العمل العادية لقواعد البيانات.
افتراضيًا، يُمنح كل دور في Oracle مخططًا شخصيًا. وهذه ممارسة جيدة يمكن اتباعها مع مستخدمي PostgreSQL أيضًا، ومن السهل تكرارها باستخدام أدوار PostgreSQL ومخططاته ومسارات البحث.
أنشئ مستخدمًا جديدًا بصلاحيات إنشاء الجداول (انظر أمان PostgreSQL للحصول على معلومات حول الدور postgis_writer)، ثم أنشئ مخططًا يكون ذلك المستخدم مالكه (authorization):
CREATE USER myuser WITH ROLE postgis_writer;
CREATE SCHEMA myuser AUTHORIZATION myuser;
إذا سجّلت الدخول بهذا المستخدم، فستجد أن search_path الافتراضي في PostgreSQL هو في الواقع:
show search_path;
search_path
----------------
"$user",public
المخطط الأول في مسار البحث هو المخطط الذي يحمل اسم المستخدم! لذا تتحقق الآن الشروط التالية:
المستخدم موجود، ولديه القدرة على إنشاء جداول مكانية.
المخطط الذي يحمل اسم المستخدم موجود، والمستخدم يملكه.
يبدأ مسار البحث الخاص بالمستخدم بمخطط المستخدم، لذا تُنشأ الجداول الجديدة فيه تلقائيًا، وتبحث الاستعلامات فيه أولًا تلقائيًا.
هذا كل ما في الأمر؛ أصبحت منطقة العمل الافتراضية للمستخدم الآن منفصلة بشكل أنيق عن أي جداول في المخططات الأخرى.