
بنية قواعد بيانات MySQL والقيود وViews والأمان
لا يستخدم MySQL لتخزين البيانات فقط. كما يتم استخدامه أيضًا لتصميم هياكل database، وتحديد العلاقات، وحماية سلامة البيانات، وتحسين أداء الاستعلام، وتأمين التطبيقات من الهجمات الخطيرة مثل SQL injection.
بعد تعلم SQL commands الأساسية مثل SELECT، WHERE، INSERT، UPDATE، DELETE، JOIN، GROUP BY وHAVING، الخطوة المهمة التالية هي فهم كيفية إنشاء databases والجداول والتحكم فيها. يتضمن ذلك إنشاء databases وإنشاء الجداول وتحديد القيود باستخدام indexes ومعالجة التواريخ وإنشاء views وكتابة استعلامات آمنة باستخدام prepared statements.
تشرح هذه المقالة موضوعات MySQL الموضحة في مسار التعلم: إنشاء قاعدة البيانات، إسقاط قاعدة البيانات، إنشاء جدول، إسقاط الجدول، تغيير الجدول، القيود، NOT NULL، UNIQUE، المفتاح الأساسي، المفتاح الخارجي، CHECK، DEFAULT، إنشاء فهرس، زيادة تلقائية، تواريخ، views، وحقن SQL، والبيانات المعدة.
MySQL إنشاء قاعدة بيانات
عادةً ما يكون إنشاء database هو الخطوة الأولى في إنشاء مشروع MySQL. database عبارة عن حاوية تحتوي على الجداول وviews وindexes والعلاقات وكائنات database الأخرى.
في MySQL، يمكن إنشاء database باستخدام الأمرقاعدة بيانات CREATEبيان.
CREATE DATABASE company_db;يقوم command بإنشاء database جديد يسمىCompany_db. بعد إنشاء database، يتعين عليك تحديده قبل إنشاء الجداول بداخله.
USE company_db;في التطبيقات الحقيقية، يجب أن تكون أسماء database واضحة وذات معنى. على سبيل المثال، أسماء مثلschool_db,ecommerce_db,blog_dbأومخزون_ديسيبلهي أسهل للفهم من الأسماء العشوائية.
يمكنك أيضًا إنشاء database فقط إذا لم يكن موجودًا بالفعل. يساعد هذا في تجنب الأخطاء عند تشغيل البرامج النصية للإعداد عدة مرات.
CREATE DATABASE IF NOT EXISTS company_db;يتم إنشاء قاعدة البيانات عادةً أثناء تثبيت المشروع أو نشره أو اختباره أو عند إعداد بيئة جديدة للتطوير.
MySQL قم بإسقاط قاعدة البيانات
القاعدة بيانات DROPيحذف البيان database بالكامل، بما في ذلك جميع الجداول والبيانات الموجودة بداخله.
DROP DATABASE company_db;يعد command خطيرًا لأنه يزيل بنية database والبيانات المخزنة بشكل دائم. قبل استخدامه، يجب عليك دائمًا التأكد من أنك تعمل على database الصحيح وأن هناك نسخة احتياطية إذا كانت البيانات مهمة.
يستخدم نسخة أكثر أماناإذا EXISTSلتجنب حدوث خطأ في حالة عدم وجود database.
DROP DATABASE IF EXISTS company_db;في أنظمة الإنتاج، يجب أن يقتصر إسقاط database على المسؤولين الموثوقين. لا ينبغي للمطورين مطلقًا تشغيل commands المدمر على database المباشر دون المراجعة والنسخ الاحتياطي والتأكيد.
MySQL إنشاء جدول
يقوم الجدول بتخزين البيانات في صفوف وأعمدة. يجب أن يمثل كل جدول مفهومًا واحدًا واضحًا، مثل المستخدمين أو المنتجات أو الطلبات أو المنشورات أو المدفوعات أو التعليقات أو classes.
الطاولة CREATEيتم استخدام العبارة لتحديد الجدول وأعمدته.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);هذا المثال ينشئالمستخدمينجدول يحتوي على أربعة أعمدة: المعرف، والاسم، والبريد الإلكتروني، وcreated_at.
المعرفالعمود هو مفتاح أساسي يتزايد تلقائيًا. الاسملا يمكن أن يكون العمود فارغًا. الالبريد الإلكترونييجب أن يكون العمود فريدًا. الcreate_atيقوم العمود بتخزين التاريخ والوقت الذي تم فيه إنشاء الصف.
يعد التصميم الجيد للجدول أمرًا مهمًا لأنه يؤثر على الأداء وجودة البيانات وقابلية الصيانة. يستخدم الجدول المصمم جيدًا أنواع البيانات المناسبة وأسماء الأعمدة الواضحة والقيود ذات المعنى وindexes عند الحاجة.
MySQL طاولة إسقاط
الطاولة DROPبيان يحذف الجدول وجميع البيانات المخزنة بداخله.
DROP TABLE users;يقوم command بإزالة بنية الجدول والسجلات بشكل دائم. وينبغي استخدامه بعناية، وخاصة في بيئات الإنتاج.
يمكنك أيضًا إسقاط الجدول فقط إذا كان موجودًا.
DROP TABLE IF EXISTS users;يختلف إسقاط الجدول عن حذف الصفوف.DELETEيزيل البيانات من الجدول، بينماطاولة DROPيزيل الجدول نفسه.
DELETE FROM users;تحافظ عبارة DELETE على بنية الجدول. يقوم DROP TABLE بإزالة كل من البنية والبيانات.
جدول التغيير MySQL
الطاولة ALTERيتم استخدام العبارة لتغيير جدول موجود. يمكنه إضافة أعمدة، أو تعديل الأعمدة، أو إعادة تسمية الأعمدة، أو إسقاط الأعمدة، أو إضافة قيود، أو إنشاء indexes.
على سبيل المثال، يمكنك إضافة عمود هاتف إلى جدول المستخدمين.
ALTER TABLE users
ADD phone VARCHAR(30);يمكنك تعديل نوع البيانات أو حجم عمود موجود.
ALTER TABLE users
MODIFY name VARCHAR(150) NOT NULL;يمكنك أيضًا إسقاط عمود إذا لم تعد هناك حاجة إليه.
ALTER TABLE users
DROP COLUMN phone;في المشاريع الحقيقية، يجب أن يتم تغيير الجداول بعناية. إذا كان الجدول يحتوي بالفعل على بيانات، فقد يؤدي تغيير الأعمدة إلى فقدان البيانات أو حدوث مشكلات في التحويل أو أخطاء في التطبيق.
غالبًا ما تقوم أطر العمل مثل Laravel بإدارة تغييرات الجدول من خلال عمليات الترحيل. يعد الترحيل طريقة يتم التحكم فيها بواسطة الإصدار لإنشاء جداول database وتعديلها بأمان عبر بيئات مختلفة.
قيود MySQL
القيود هي قواعد يتم تطبيقها على أعمدة الجدول لحماية تكامل البيانات. فهي تساعد على التأكد من أن database يحتوي على بيانات صالحة ومتسقة وموثوقة.
تتضمن قيود MySQL الشائعةNOT NULL,UNIQUE,PRIMARY KEY,FOREIGN KEY,CHECK، وDEFAULT.
تعتبر القيود مهمة لأن رمز التطبيق وحده لا يكفي لحماية البيانات. يمكن للمستخدم أو البرنامج النصي أو أداة الاستيراد أو أي خدمة أخرى إدراج البيانات في database. القيود تجعل database نفسه مسؤولاً عن تطبيق القواعد المهمة.
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(150) NOT NULL,
sku VARCHAR(100) UNIQUE,
price DECIMAL(10, 2) CHECK (price >= 0),
status VARCHAR(20) DEFAULT 'active'
);يستخدم هذا الجدول قيودًا متعددة لمنع بيانات المنتج غير الصالحة. الاسم مطلوب، ويجب أن يكون SKU فريدًا، ولا يمكن أن يكون السعر سالبًا، والحالة لها قيمة افتراضية.
MySQL NOT NULL
الNOT NULLيمنع القيد العمود من تخزين قيم NULL. وهذا يعني أن العمود يجب أن يكون له قيمة دائمًا.
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL
);في هذا المثال، يجب أن يكون لكل عميل اسم وبريد إلكتروني. سيرفض MySQL أي صف يحاول إدراج NULL في هذه الأعمدة.
يعد NOT NULL مفيدًا للحقول المطلوبة مثل الأسماء ورسائل البريد الإلكتروني وأرقام الطلبات وعناوين المنتجات وكلمات مرور المستخدم ومراجع المفاتيح الخارجية عندما تكون العلاقة إلزامية.
ومع ذلك، لا يجب أن يكون كل عمود NOT NULL. يمكن أن تكون البيانات الاختيارية مثل الاسم الأوسط أو الهاتف الثاني أو المحذوفة أو الملاحظات فارغة إذا كان التطبيق يسمح بقيم فارغة.
MySQL UNIQUE
الUNIQUEيمنع القيد القيم المكررة في عمود أو مجموعة من الأعمدة.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(150) NOT NULL UNIQUE
);وهذا يعني أنه لا يمكن أن يكون لدى مستخدمين نفس عنوان البريد الإلكتروني.
يتم استخدام قيود UNIQUE بشكل شائع لرسائل البريد الإلكتروني، وأسماء المستخدمين، ووحدات SKU للمنتج، وأرقام الفواتير، والمعرفات الوطنية، والارتباطات الثابتة، والرموز المميزة API.
يمكنك أيضًا تحديد قاعدة فريدة عبر أعمدة متعددة. وهذا ما يسمى القيد الفريد المركب.
CREATE TABLE course_registrations (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
course_id INT NOT NULL,
UNIQUE (student_id, course_id)
);في هذا المثال، لا يمكن تسجيل نفس الطالب في نفس المقرر الدراسي أكثر من مرة.
MySQL المفتاح الأساسي
أPRIMARY KEYيحدد بشكل فريد كل صف في الجدول. يجب أن يحتوي كل جدول عادةً على مفتاح أساسي.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
body TEXT
);المعرفيحدد العمود كل مشاركة بشكل فريد. لا يمكن أن يكون لصفين نفس قيمة المفتاح الأساسي، ولا يمكن أن يكون المفتاح الأساسي NULL.
تُستخدم المفاتيح الأساسية للعثور على السجلات وتحديثها وحذفها وإنشاء العلاقات وتوصيل الجداول باستخدام المفاتيح الخارجية.
تستخدم معظم جداول MySQL عددًا صحيحًا متزايدًا تلقائيًا كمفتاح أساسي. قد تستخدم بعض الأنظمة UUIDs بدلاً من ذلك، خاصة الأنظمة الموزعة، ولكن معرفات الزيادة التلقائية بسيطة وشائعة في العديد من التطبيقات.
MySQL المفتاح الخارجي
أFOREIGN KEYإنشاء علاقة بين جدولين. فهو يضمن أن القيمة الموجودة في جدول واحد تشير إلى صف صالح في جدول آخر.
على سبيل المثال، عادةً ما ينتمي الطلب إلى المستخدم. يمكن لجدول الطلبات تخزين user_id الذي يشير إلى جدول المستخدمين.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);وهذا يعني أن كل طلب يجب أن ينتمي إلى مستخدم حالي. لن يسمح MySQL للطلب بالإشارة إلى معرف مستخدم غير موجود.
المفاتيح الخارجية تحمي سلامة العلاقات. فهي تساعد على تجنب السجلات المعزولة، مثل الطلبات التي لا تحتوي على مستخدمين، أو التعليقات التي لا تحتوي على منشورات، أو عناصر_الطلب التي لا تحتوي على طلبات.
يمكن للمفاتيح الخارجية أيضًا تحديد إجراءات التحديثات والحذف.
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
body TEXT NOT NULL,
FOREIGN KEY (post_id) REFERENCES posts(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);مععلى DELETE تتالي، يؤدي حذف المنشور أيضًا إلى حذف التعليقات ذات الصلة به. يمكن أن يكون هذا مفيدًا، ولكن يجب استخدامه بحذر لأنه يمكنه إزالة العديد من السجلات ذات الصلة تلقائيًا.
MySQL CHECK
الCHECKيتم استخدام القيد لتحديد الشرط الذي يجب أن تستوفيه القيم قبل أن يتم إدراجها أو تحديثها.
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10, 2) CHECK (salary >= 0)
);وهذا يمنع تخزين الرواتب السلبية.
تعتبر قيود CHECK مفيدة لقواعد مثل الأسعار الموجبة والنسب المئوية الصالحة والحد الأدنى للأعمار وقيم الحالة المقبولة والنطاقات الرقمية.
CREATE TABLE coupons (
id INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL UNIQUE,
discount_percent INT CHECK (discount_percent BETWEEN 1 AND 100)
);يسمح هذا المثال بنسب خصم تتراوح بين 1 و100 فقط.
يجب استخدام قيود CHECK لقواعد البيانات البسيطة. عادةً ما تتم معالجة منطق العمل الأكثر تعقيدًا في كود التطبيق أو stored procedures.
MySQL DEFAULT
الDEFAULTيقوم القيد بتعيين قيمة افتراضية لعمود عندما لا يتم توفير أي قيمة أثناء الإدراج.
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(150) NOT NULL,
status VARCHAR(30) DEFAULT 'pending',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);إذا تم إدراج مهمة بدون حالة، فسيتم تخزين MySQL تلقائيًافي انتظار. إذا لم يتم توفير create_at، فسيقوم MySQL بتخزين التاريخ والوقت الحاليين.
INSERT INTO tasks (title)
VALUES ('Prepare database backup');تعمل قيم DEFAULT على جعل عمليات الإدخال أكثر بساطة وتساعد في الحفاظ على الاتساق. يتم استخدامها بشكل شائع للحالات والطوابع الزمنية والعدادات والأعلام والقيم الشبيهة بالتكوين.
MySQL إنشاء فهرس
index عبارة عن بنية database تساعد MySQL في العثور على البيانات بشكل أسرع. إنه يعمل مثل نظام بحث منظم للأعمدة المحددة.
الCREATE INDEXتقوم العبارة بإنشاء index على عمود واحد أو أكثر.
CREATE INDEX idx_users_email
ON users (email);يمكن لـ index إجراء عمليات البحث عبر البريد الإلكتروني بشكل أسرع.
SELECT *
FROM users
WHERE email = 'adnan@example.com';تعتبر الفهارس مفيدة للأعمدة المستخدمة بشكل متكرر في عبارات WHERE، وJOIN، وORDER BY، وGROUP BY.
CREATE INDEX idx_orders_user_id
ON orders (user_id);يمكن لـ index تحسين الاستعلامات التي تسترد الطلبات لمستخدم معين.
ومع ذلك، indexes ليست مجانية. إنها تشغل مساحة تخزين ويمكن أن تبطئ عمليات INSERT وUPDATE وDELETE لأن MySQL يجب أن تقوم بتحديث index كلما تغيرت البيانات.
تركز إستراتيجية indexing الجيدة على أنماط الاستعلام الحقيقية. لا تقم بإنشاء indexes بشكل عشوائي. قم بإنشائها للأعمدة التي يتم البحث عنها أو ضمها أو تصفيتها أو فرزها بشكل متكرر.
MySQL الزيادة التلقائية
AUTO_INCREMENTيقوم تلقائيًا بإنشاء قيمة رقمية جديدة للعمود عند إدراج صف جديد. يتم استخدامه بشكل شائع مع المفاتيح الأساسية.
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);عند إدراج class جديدة، لا تحتاج إلى تقديم المعرف.
INSERT INTO categories (name)
VALUES ('Programming');سيقوم MySQL تلقائيًا بتعيين الرقم التالي المتاح لعمود المعرف.
AUTO_INCREMENT بسيط وعملي للعديد من الأنظمة. فهو يجعل من السهل الرجوع إلى السجلات ويحافظ على إنشاء المفتاح الأساسي تلقائيًا.
أحد التفاصيل المهمة هو أن المعرفات المحذوفة لا يتم إعادة استخدامها عادة. إذا تم حذف الصف 5، فقد يستمر الصف المدرج التالي برقم أعلى. وهذا أمر طبيعي ولا ينبغي التعامل معه على أنه خطأ.
تواريخ MySQL
يوفر MySQL العديد من أنواع بيانات التاريخ والوقت. الأكثر شيوعا هيالتاريخ,الوقت,التاريخ والوقت، والطابع الزمني.
التاريخ:يخزن التاريخ فقط، مثل 10-06-2026.
الوقت:يخزن مرة واحدة فقط، مثل 14:30:00.
التاريخ والوقت:يخزن التاريخ والوقت معًا.
الطابع الزمني:يخزن التاريخ والوقت وغالبًا ما يُستخدم لقيم create_at وupdate_at.
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(150) NOT NULL,
event_date DATE NOT NULL,
starts_at DATETIME NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);تعتبر التواريخ مهمة لتصفية السجلات وإنشاء التقارير وتتبع النشاط وجدولة events وإدارة السجلات.
SELECT *
FROM events
WHERE event_date >= '2026-06-01';يمكنك أيضًا استخدام وظائف التاريخ MySQL مثلالآن (),كورديت(),التاريخ(),السنة (),شهر()، وDATEDIFF().
SELECT NOW();
SELECT CURDATE();
SELECT YEAR(created_at) FROM users;في التطبيقات المهنية، ينبغي التعامل مع المناطق الزمنية بعناية. تقوم العديد من الأنظمة بتخزين التواريخ بالتوقيت العالمي المنسق (UTC) في database وتحويلها إلى التوقيت المحلي للمستخدم في التطبيق.
مشاهدات MySQL
طريقة العرض عبارة عن جدول افتراضي يعتمد على استعلام SELECT. ولا يقوم عادةً بتخزين البيانات بنفسه. وبدلاً من ذلك، فإنه يعرض البيانات من جدول واحد أو أكثر من خلال استعلام محفوظ.
يتم إنشاء views باستخدامCREATE VIEWبيان.
CREATE VIEW active_users AS
SELECT id, name, email
FROM users
WHERE status = 'active';بعد إنشاء العرض، يمكنك الاستعلام عنه كجدول عادي.
SELECT *
FROM active_users;تكون views مفيدة عندما تريد تبسيط الاستعلامات المعقدة، أو إخفاء الأعمدة الحساسة، أو توفير هياكل تقارير أكثر وضوحًا، أو الكشف عن بيانات محدودة لمستخدمين أو خدمات محددة.
على سبيل المثال، بدلاً من تكرار استعلام ربط طويل في العديد من الأماكن، يمكنك إنشاء طريقة عرض والاستعلام عنها عند الحاجة.
CREATE VIEW order_summary AS
SELECT
orders.id AS order_id,
users.name AS customer_name,
orders.total,
orders.created_at
FROM orders
INNER JOIN users ON users.id = orders.user_id;يمكن أن تعمل views على تحسين إمكانية القراءة، ولكن لا ينبغي استخدامها كبديل لتصميم الجدول المناسب. يمكن أن يصبح من الصعب تصحيح views المعقدة جدًا وقد تؤثر على الأداء إذا تم استخدامها بلا مبالاة.
حقن MySQL
SQL injection هي ثغرة أمنية خطيرة تحدث عندما يتم إدخال إدخال المستخدم مباشرة في استعلام SQL دون حماية مناسبة.
على سبيل المثال، يعد هذا النوع من الاستعلام خطيرًا عندما يتم توصيل إدخال المستخدم مباشرة إلى سلسلة SQL.
SELECT *
FROM users
WHERE email = '$email' AND password = '$password';إذا كان أحد المهاجمين يتحكم في الإدخال، فقد يحاول تغيير معنى الاستعلام. يمكن أن يؤدي ذلك إلى تسجيل دخول غير مصرح به، أو تسرب البيانات، أو تعديل البيانات، أو حتى حذف سجلات database.
SQL injection ليست مشكلة MySQL فقط. يمكن أن يحدث ذلك في العديد من أنظمة database عندما يقوم المطورون بإنشاء استعلامات SQL بشكل غير صحيح.
الأسباب الرئيسية لـ SQL injection هي:
تسلسل إدخال المستخدم مباشرة في استعلامات SQL.
الثقة في بيانات النموذج أو معلمات URL أو ملفات تعريف الارتباط أو الرؤوس بدون validation.
استخدام SQL الخام بدون ربط المعلمات.
عرض أخطاء database التفصيلية للمستخدمين.
منح مستخدم database أذونات أكثر من اللازم.
لتقليل مخاطر SQL injection، يجب على المطورين استخدام prepared statements، والتحقق من صحة المدخلات، وهروب المخرجات عند الحاجة، واستخدام حسابات database ذات الامتيازات الأقل، وتجنب الكشف عن تفاصيل الأخطاء الداخلية.
البيانات المعدة MySQL
تعد البيانات المعدة من أهم الطرق لحماية استعلامات SQL من هجمات الحقن. وهي تفصل بنية SQL عن القيم المقدمة من قبل المستخدم.
بدلاً من وضع إدخال المستخدم مباشرةً في الاستعلام، يتم استخدام العناصر النائبة. ثم يتم ربط القيم بأمان.
SELECT *
FROM users
WHERE email = ?;في PHP، يتم استخدام prepared statements بشكل شائع مع PDO.
<?php
$pdo = new PDO(
'mysql:host=localhost;dbname=company_db;charset=utf8mb4',
'root',
'',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$email = $_POST['email'] ?? '';
$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE email = :email');
$stmt->execute([
'email' => $email,
]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>في هذا المثال،:البريد الإلكترونيهو عنصر نائب مسمى. يتم تمرير قيمة البريد الإلكتروني الفعلية بشكل منفصل إلىتنفيذ (). تتعامل شركة PDO مع القيمة بأمان بدلاً من معاملتها كجزء من SQL command.
يجب استخدام العبارات المعدة للاستعلامات SELECT، وINSERT، وUPDATE، وDELETE عندما يتعلق الأمر بإدخال المستخدم.
<?php
$stmt = $pdo->prepare(
'INSERT INTO users (name, email) VALUES (:name, :email)'
);
$stmt->execute([
'name' => $name,
'email' => $email,
]);
?>لا تحل البيانات المعدة محل جميع ممارسات الأمان، ولكنها تعد متطلبًا أساسيًا لبرمجة database الآمنة.
كيف تعمل مفاهيم MySQL معًا
في التطبيق الحقيقي، هذه المفاهيم ليست معزولة. إنهم يعملون معًا لإنشاء طبقة database موثوقة وآمنة.
على سبيل المثال، قد يقوم نظام التجارة الإلكترونية بإنشاء database، وتحديد الجداول للمستخدمين والأوامر، واستخدام المفاتيح الأساسية والمفاتيح الخارجية لتوصيل السجلات، وإضافة indexes للبحث بشكل أسرع، واستخدام الطوابع الزمنية الافتراضية للتتبع، وإنشاء طرق عرض للتقارير، واستخدام prepared statements لحماية مدخلات المستخدم.
CREATE DATABASE IF NOT EXISTS shop_db;
USE shop_db;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10, 2) NOT NULL CHECK (total >= 0),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_orders_user_id
ON orders (user_id);
CREATE VIEW user_order_summary AS
SELECT
users.id AS user_id,
users.name,
users.email,
COUNT(orders.id) AS total_orders,
SUM(orders.total) AS total_spent
FROM users
LEFT JOIN orders ON orders.user_id = users.id
GROUP BY users.id, users.name, users.email;يوضح هذا المثال إنشاء database وإنشاء الجدول والقيود والزيادة التلقائية والمفاتيح الأساسية والمفاتيح الخارجية وindexes والتواريخ وviews في بنية واحدة.
يجب أن يستخدم التطبيق بعد ذلك prepared statements عند إدراج البيانات أو تحديثها أو حذفها أو استردادها بناءً على إدخال المستخدم.
أفضل الممارسات لتصميم قاعدة البيانات MySQL
التصميم الجيد لـ MySQL هو أكثر من مجرد كتابة SQL صالح. فهو يتطلب بنية واضحة، وسلامة البيانات، والوعي بالأداء، والأمان.
استخدم أسماء database والجداول والأعمدة بشكل واضح ومتسق.
اختر أنواع البيانات المناسبة لكل عمود.
أضف المفاتيح الأساسية إلى الجداول المهمة.
استخدم المفاتيح الخارجية عندما يجب حماية العلاقات.
استخدم NOT NULL للحقول المطلوبة.
استخدم UNIQUE للقيم التي يجب عدم تكرارها.
استخدم قيم DEFAULT للقيم التلقائية الشائعة.
قم بإنشاء indexes بناءً على احتياجات الاستعلام الحقيقية.
كن حذرًا مع قاعدة بيانات DROP وDROP TABLE commands.
استخدم prepared statements لجميع مدخلات المستخدم.
احتفظ بالنسخ الاحتياطية قبل التغييرات المدمرة.
استخدم عمليات الترحيل لتتبع تغييرات database في المشاريع الاحترافية.
الاستنتاج
تعد بنية MySQL database مهارة أساسية لمطوري backend، ومطوري المكدس الكامل، وأي شخص يعمل مع التطبيقات المستندة إلى البيانات. إن فهم كيفية إنشاء databases وتصميم الجداول وتحديد القيود واستخدام indexes والتعامل مع التواريخ وإنشاء views وحماية الاستعلامات من SQL injection يساعد المطورين على إنشاء أنظمة أكثر أمانًا وموثوقية.
تحدد الأوامر مثل CREATE DATABASE وCREATE TABLE وALTER TABLE وCREATE INDEX بنية database. تعمل القيود مثل NOT NULL، وUNIQUE، وPRIMARY KEY، وFOREIGN KEY، وCHECK، وDEFAULT على حماية جودة البيانات المخزنة. تعمل views على تبسيط الوصول إلى البيانات، بينما يقوم prepared statements بحماية التطبيقات من هجمات SQL injection الخطيرة.
يمنحك تعلم هذه المواضيع بعناية أساسًا قويًا للعمل مع MySQL في مشاريع حقيقية، سواء كنت تقوم بإنشاء مدونة بسيطة، أو تطبيق Laravel، أو لوحة معلومات إدارية، أو منصة تجارة إلكترونية، أو نظام backend كبير.

