الانتقال إلى المحتوى الرئيسي
الوحدة 9 · الدرس 1 من 433/57 في الدورة~10 min
دروس الوحدة (1/4)

أنواع البيانات المتقدمة وENUMs

في الدرس السابق رأينا الأمر الأساسي CREATE TABLE. لنستكشف الآن بعض أنواع البيانات المتقدمة التي تقدمها PostgreSQL لتصميم نطاقاتنا بطريقة أكثر دقة وأمانًا.

أنواع رقمية ونصية

لدى PostgreSQL عدة أنواع للأرقام والنصوص. يساعد اختيار الخيار الصحيح في التحقق من الصحة ومساحة التخزين.

SQL
CREATE TABLE advanced_products (
  id           SERIAL PRIMARY KEY,
  name         VARCHAR(50) NOT NULL,
  description  TEXT,
  -- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
  price        NUMERIC(10, 2) NOT NULL,
  featured     BOOLEAN DEFAULT FALSE
);
  • TEXT مقابل VARCHAR(n): الأداء في Postgres متطابق. لا تستخدم VARCHAR(n) إلا عندما تريد تحديد الطول المدرج بشكل صريح على مستوى قاعدة البيانات.
  • NUMERIC(10, 2): مثالي للمال أو الدقة الحسابية. يسمح هنا بحد أقصى 8 أرقام صحيحة ورقمين عشريين (10 في المجموع). إذا قمت بإدراج 10.555، فسيقوم Postgres بتقريبه إلى 10.56.

نوع UUID

بالنسبة للمعرفات الآمنة المعروضة على الويب (مثل المعرفات العامة في عناوين URL)، غالبًا ما يتم تفضيل UUID على الزيادة SERIAL الكلاسيكية.

SQL
CREATE TABLE public_orders (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  customer    TEXT NOT NULL,
  total       NUMERIC(10, 2)
);

ENUM (التعدادات)

في كثير من الأحيان، يجب أن يحتوي العمود على واحدة فقط من عدد قليل من القيم المحددة مسبقًا (على سبيل المثال، حالة الطلب: "جديد"، "مدفوع"، "تم الشحن"). إحدى الطرق هي استخدام الكلمة الأساسية CHECK، لكن PostgreSQL تقدم أنواع ENUM مخصصة.

SQL
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');

-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
  id SERIAL PRIMARY KEY,
  status order_status NOT NULL DEFAULT 'nuovo'
);

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

جربه

تمرين#sql.m9.l1.e1
المحاولات: 0جارٍ التحميل…

قم بإنشاء جدول "user_reviews" باستخدام: المعرف (SERIAL pk)، وtest_id (UUID مع gen_random_uuid() الافتراضي)، والنتيجة (عدد صحيح ليس فارغًا)، والمحتوى (TEXT). لا يحتاج أي من الحقول الأخرى إلى قيود صريحة تتجاوز النوع.

جارٍ تحميل المحرر…
إظهار التلميح

اكتب إنشاء جدول user_reviews (...) ثم الحقول المختلفة. تذكر الفواصل.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m9.l1.e2
المحاولات: 0جارٍ التحميل…

قم أولاً بإنشاء نوع ENUM "user_role" بالقيمتين "admin" و"user". ثم قم بإنشاء جدول "enum_users" بالمعرف (SERIAL pk) والدور (النوع الذي أنشأته للتو، وليس NULL).

جارٍ تحميل المحرر…
إظهار التلميح

لا تنسى ; للفصل بين العبارتين (CREATE TYPE وCREATE TABLE).

الحل متاح بعد 3 من المحاولات