دروس الوحدة (1/4)
أنواع البيانات المتقدمة وENUMs
في الدرس السابق رأينا الأمر الأساسي CREATE TABLE. لنستكشف الآن بعض أنواع البيانات المتقدمة التي تقدمها PostgreSQL لتصميم نطاقاتنا بطريقة أكثر دقة وأمانًا.
أنواع رقمية ونصية
لدى PostgreSQL عدة أنواع للأرقام والنصوص. يساعد اختيار الخيار الصحيح في التحقق من الصحة ومساحة التخزين.
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 الكلاسيكية.
CREATE TABLE public_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer TEXT NOT NULL,
total NUMERIC(10, 2)
);ENUM (التعدادات)
في كثير من الأحيان، يجب أن يحتوي العمود على واحدة فقط من عدد قليل من القيم المحددة مسبقًا (على سبيل المثال، حالة الطلب: "جديد"، "مدفوع"، "تم الشحن"). إحدى الطرق هي استخدام الكلمة الأساسية CHECK، لكن PostgreSQL تقدم أنواع ENUM مخصصة.
-- 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'
);وهذا يضمن عدم تمكن أي شخص من إدراج حالة غير صالحة على الإطلاق، مما يحمي اتساق البيانات.
جربه
قم بإنشاء جدول "user_reviews" باستخدام: المعرف (SERIAL pk)، وtest_id (UUID مع gen_random_uuid() الافتراضي)، والنتيجة (عدد صحيح ليس فارغًا)، والمحتوى (TEXT). لا يحتاج أي من الحقول الأخرى إلى قيود صريحة تتجاوز النوع.
إظهار التلميح
اكتب إنشاء جدول user_reviews (...) ثم الحقول المختلفة. تذكر الفواصل.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
قم أولاً بإنشاء نوع ENUM "user_role" بالقيمتين "admin" و"user". ثم قم بإنشاء جدول "enum_users" بالمعرف (SERIAL pk) والدور (النوع الذي أنشأته للتو، وليس NULL).
إظهار التلميح
لا تنسى ; للفصل بين العبارتين (CREATE TYPE وCREATE TABLE).
الحل متاح بعد 3 من المحاولات