کاوش CRUD: چیست و چگونه کار می کند
Summarize this content to 400 words in Persian Lang
در حوزه فناوری، به ویژه در توسعه نرم افزار و مدیریت پایگاه داده، اصطلاح “CRUD” اساسی است. مخفف آن است ایجاد، خواندن، به روز رسانی، و حذف. این چهار عملیات اساسی برای تعامل با پایگاه های داده ضروری هستند و در همه جا در برنامه ها و سیستم های مختلف وجود دارند. در این مقاله، معنای CRUD، اهمیت آن و نحوه پیادهسازی آن در پلتفرمها و فناوریهای مختلف را بررسی میکنیم.
CRUD چیست؟
CRUD مخفف چهار عملیات اصلی مورد نیاز برای مدیریت ذخیره سازی پایدار است. این عملیات برای عملکرد هر برنامه کاربردی مبتنی بر پایگاه داده ضروری است. بیایید هر جزء را تجزیه کنیم:
ايجاد كردن: این عملیات شامل افزودن رکوردها یا داده های جدید به پایگاه داده است. به عنوان مثال، زمانی که کاربر در یک وب سایت ثبت نام می کند، اطلاعات او ایجاد و در پایگاه داده ذخیره می شود.
خواندن: همچنین به عنوان بازیابی شناخته می شود، این عملیات شامل واکشی یا مشاهده رکوردهای موجود از پایگاه داده است. به عنوان مثال، هنگامی که یک کاربر وارد سیستم می شود و اطلاعات پروفایل او نمایش داده می شود، سیستم این داده ها را از پایگاه داده می خواند.
به روز رسانی: این عملیات مربوط به اصلاح رکوردهای موجود در پایگاه داده است. یک مثال می تواند کاربری باشد که اطلاعات نمایه خود را به روز می کند، مانند تغییر آدرس ایمیل خود.
حذف: این عملیات شامل حذف رکوردها از پایگاه داده است. به عنوان مثال، اگر کاربر تصمیم به حذف حساب خود داشته باشد، این عملیات اطلاعات او را از پایگاه داده حذف می کند.
این عملیات برای حفظ یکپارچگی و عملکرد هر سیستمی که به ذخیره سازی و مدیریت داده ها متکی است، حیاتی هستند.
اهمیت CRUD
عملیات CRUD ستون فقرات هر سیستم پایگاه داده است. در اینجا دلیل اهمیت آنها است:
مدیریت اطلاعات: عملیات CRUD امکان مدیریت کارآمد داده ها را فراهم می کند و اطمینان حاصل می کند که اطلاعات می توانند به راحتی ایجاد، دسترسی، اصلاح و حذف شوند.
تعامل کاربر: بیشتر رابط های کاربری حول عملیات CRUD طراحی شده اند. به عنوان مثال، یک برنامه وبلاگ به کاربران اجازه می دهد تا پست ایجاد کنند، پست ها را بخوانند، پست ها را به روز کنند و پست ها را حذف کنند.
یکپارچگی داده: با استفاده از عملیات CRUD، توسعه دهندگان می توانند اطمینان حاصل کنند که داده های پایگاه داده ثابت و دقیق باقی می مانند. اجرای صحیح این عملیات به جلوگیری از خرابی داده ها کمک می کند و تضمین می کند که کاربران می توانند مطابق انتظار با برنامه تعامل داشته باشند.
مقیاس پذیری و قابلیت نگهداری: اجرای صحیح عملیات CRUD سیستم را مقیاس پذیر و نگهداری آسان تر می کند. با رشد برنامه، توسعه دهندگان می توانند حجم فزاینده داده ها را بدون به خطر انداختن عملکرد یا یکپارچگی مدیریت کنند.
CRUD در توسعه وب
در توسعه وب، عملیات CRUD معمولاً با RESTful APIها و خدمات وب مرتبط است. بیایید بررسی کنیم که چگونه CRUD در این زمینه پیاده سازی می شود:
API های RESTful
REST (Representational State Transfer) یک سبک معماری است که از روش های استاندارد HTTP برای انجام عملیات CRUD استفاده می کند. هر روش HTTP مربوط به یک عملیات CRUD است:
پست: برای ایجاد یک منبع جدید استفاده می شود. به عنوان مثال، ارسال یک درخواست POST به /users با مشخصات کاربر در بدن، یک کاربر جدید ایجاد می کند.
گرفتن: برای خواندن یا بازیابی یک منبع استفاده می شود. به عنوان مثال، ارسال یک درخواست GET به /users/1 اطلاعات کاربر با شناسه 1 را بازیابی می کند.
قرار دادن: برای به روز رسانی یک منبع موجود استفاده می شود. به عنوان مثال، ارسال یک درخواست PUT به /users/1 با جزئیات کاربر به روز شده در بدن، کاربر با شناسه 1 به روز می شود.
حذف: برای حذف یک منبع استفاده می شود. به عنوان مثال، ارسال یک درخواست DELETE به /users/1 کاربر با شناسه 1 را حذف می کند.
مثال با Node.js و Express
در اینجا یک مثال ساده از نحوه اجرای عملیات CRUD در یک برنامه Node.js با استفاده از چارچوب Express آورده شده است:
const express = require(‘express’);
const app = express();
app.use(express.json());
let users = [];
// Create
app.post(‘/users’, (req, res) => {
const user = req.body;
users.push(user);
res.status(201).send(‘User created’);
});
// Read
app.get(‘/users’, (req, res) => {
res.json(users);
});
// Update
app.put(‘/users/:id’, (req, res) => {
const id = parseInt(req.params.id);
const updatedUser = req.body;
users = users.map(user => user.id === id ? updatedUser : user);
res.send(‘User updated’);
});
// Delete
app.delete(‘/users/:id’, (req, res) => {
const id = parseInt(req.params.id);
users = users.filter(user => user.id !== id);
res.send(‘User deleted’);
});
app.listen(3000, () => console.log(‘Server running on port 3000’));
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در این مثال، ما مسیرهایی را برای هر عملیات CRUD تعریف می کنیم و منطق مربوطه را برای مدیریت داده های کاربر پیاده سازی می کنیم.
CRUD در مدیریت پایگاه داده
عملیات CRUD محدود به توسعه وب نیست. آنها همچنین برای مدیریت پایگاه داده اساسی هستند. اکثر پایگاه های داده رابطه ای از SQL (زبان پرس و جو ساختاریافته) برای انجام عملیات CRUD استفاده می کنند. در اینجا نحوه ترجمه هر عملیات CRUD به SQL آمده است:
ايجاد كردن: INSERT INTO users (name, email) VALUES (‘John Doe’, ‘john@example.com’);
خواندن: SELECT * FROM users WHERE id = 1;
به روز رسانی: UPDATE users SET email=”john.new@example.com” WHERE id = 1;
حذف: DELETE FROM users WHERE id = 1;
مثال با MySQL
در اینجا نحوه اجرای عملیات CRUD با استفاده از MySQL آورده شده است:
ايجاد كردن:
INSERT INTO users (name, email) VALUES (‘John Doe’, ‘john@example.com’);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
خواندن:
SELECT * FROM users WHERE id = 1;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
به روز رسانی:
UPDATE users SET email = ‘john.new@example.com’ WHERE id = 1;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
حذف:
DELETE FROM users WHERE id = 1;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این عملیات با استفاده از پرس و جوهای SQL اجرا می شوند و برای مدیریت داده ها در یک پایگاه داده رابطه ای ضروری هستند.
CRUD در پایگاه های داده NoSQL
در حالی که عملیات CRUD در پایگاههای داده رابطهای ساده هستند، اما برای پایگاههای داده NoSQL نیز قابل اجرا هستند، اگرچه پیادهسازی ممکن است به دلیل ماهیت بدون طرحواره پایگاههای داده NoSQL متفاوت باشد.
مثال با MongoDB
MongoDB یک پایگاه داده محبوب NoSQL است که از یک مدل سند گرا استفاده می کند. در اینجا نحوه اجرای عملیات CRUD در MongoDB آمده است:
ايجاد كردن:
db.users.insertOne({ name: “John Doe”, email: “john@example.com” });
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
خواندن:
db.users.findOne({ _id: ObjectId(“60c72b2f9b1d8f1d4c8b4567”) });
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
به روز رسانی:
db.users.updateOne({ _id: ObjectId(“60c72b2f9b1d8f1d4c8b4567”) }, { $set: { email: “john.new@example.com” } });
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
حذف:
db.users.deleteOne({ _id: ObjectId(“60c72b2f9b1d8f1d4c8b4567″) });
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این عملیات از زبان پرس و جو MongoDB برای مدیریت اسناد در یک مجموعه استفاده می کند.
CRUD در توسعه Frontend
در حالی که عملیات CRUD اغلب با توسعه باطن مرتبط است، در توسعه frontend نیز مرتبط است. چارچوبها و کتابخانههای فرانتاند مدرن مانند React، Angular و Vue.js اغلب شامل عملیات CRUD برای مدیریت وضعیت برنامه و تعامل با APIها میشوند.
مثال با React
در اینجا یک مثال ساده از نحوه پیاده سازی عملیات CRUD در برنامه React آورده شده است:
import React, { useState, useEffect } from ‘react’;
const App = () => {
const [users, setUsers] = useState([]);
const [newUser, setNewUser] = useState(”);
useEffect(() => {
// Read
fetch(‘/api/users’)
.then(response => response.json())
.then(data => setUsers(data));
}, []);
const createUser = () => {
// Create
fetch(‘/api/users’, {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ name: newUser })
})
.then(() => setNewUser(”))
.then(() => fetch(‘/api/users’).then(response => response.json()).then(data => setUsers(data)));
};
const updateUser = (id, newName) => {
// Update
fetch(`/api/users/${id}`, {
method: ‘PUT’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ name: newName })
})
.then(() => fetch(‘/api/users’).then(response => response.json()).then(data => setUsers(data)));
};
const deleteUser = id => {
// Delete
fetch(`/api/users/${id}`, { method: ‘DELETE’ })
.then(() => fetch(‘/api/users’).then(response => response.json()).then(data => setUsers(data)));
};
return (
<div>
<h1>Users</h1>
<ul>
{users.map(user => (
<li key={user.id}>
{user.name}
<button onClick={() => updateUser(user.id, prompt(‘New name:’, user.name))}>Update</button>
<button onClick={() => deleteUser(user.id)}>Delete</button>
</li>
))}
</ul>
<input value={newUser} onChange={e => setNewUser(e.target.value)} />
<button onClick={createUser}>Add User</button>
</div>
);
};
export default App;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در این مثال، عملیات CRUD برای مدیریت دادههای کاربر در یک برنامه React استفاده میشود و نشان میدهد که چگونه این عملیات در لایههای مختلف اساسی هستند.
یک برنامه کاربردی
CRUD در توسعه موبایل
توسعه موبایل همچنین به شدت به عملیات CRUD متکی است، چه در حال توسعه برای Android، iOS یا با استفاده از چارچوبهای چند پلتفرمی مانند Flutter یا React Native باشید. مدیریت داده ها، همگام سازی با سرورهای راه دور و ذخیره سازی محلی همگی به عملیات CRUD نیاز دارند.
مثال با اندروید (جاوا)
در اینجا نمونه ای از اجرای عملیات CRUD در یک برنامه اندروید با استفاده از SQLite آورده شده است:
کلاس کمکی پایگاه داده:
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = “users.db”;
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = “users”;
private static final String COLUMN_ID = “id”;
private static final String COLUMN_NAME = “name”;
private static final String COLUMN_EMAIL = “email”;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = “CREATE TABLE ” + TABLE_NAME + ” (” +
COLUMN_ID + ” INTEGER PRIMARY KEY AUTOINCREMENT, ” +
COLUMN_NAME + ” TEXT, ” +
COLUMN_EMAIL + ” TEXT)”;
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(“DROP TABLE IF EXISTS ” + TABLE_NAME);
onCreate(db);
}
// Create
public boolean insertUser(String name, String email) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME, name);
contentValues.put(COLUMN_EMAIL, email);
long result = db.insert(TABLE_NAME, null, contentValues);
return result != -1;
}
// Read
public Cursor getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
return db.query(TABLE_NAME, null, COLUMN_ID + “=?”, new String[]{String.valueOf(id)}, null, null, null);
}
// Update
public boolean updateUser(int id, String name, String email) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME, name);
contentValues.put(COLUMN_EMAIL, email);
int result = db.update(TABLE_NAME, contentValues, COLUMN_ID + “=?”, new String[]{String.valueOf(id)});
return result > 0;
}
// Delete
public boolean deleteUser(int id) {
SQLiteDatabase db = this.getWritableDatabase();
int result = db.delete(TABLE_NAME, COLUMN_ID + “=?”, new String[]{String.valueOf(id)});
return result > 0;
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
استفاده از DBHelper در یک فعالیت:
public class MainActivity extends AppCompatActivity {
DBHelper dbHelper;
EditText editName, editEmail;
Button btnAdd, btnView, btnUpdate, btnDelete;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new DBHelper(this);
editName = findViewById(R.id.editName);
editEmail = findViewById(R.id.editEmail);
btnAdd = findViewById(R.id.btnAdd);
btnView = findViewById(R.id.btnView);
btnUpdate = findViewById(R.id.btnUpdate);
btnDelete = findViewById(R.id.btnDelete);
textView = findViewById(R.id.textView);
// Add User
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = editName.getText().toString();
String email = editEmail.getText().toString();
boolean inserted = dbHelper.insertUser(name, email);
if (inserted) {
Toast.makeText(MainActivity.this, “User Added”, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, “Insertion Failed”, Toast.LENGTH_SHORT).show();
}
}
});
// View User
btnView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = Integer.parseInt(editName.getText().toString()); // For simplicity, using name input for ID
Cursor cursor = dbHelper.getUser(id);
if (cursor.moveToFirst()) {
textView.setText(“ID: ” + cursor.getInt(cursor.getColumnIndexOrThrow(“id”)) +
“\nName: ” + cursor.getString(cursor.getColumnIndexOrThrow(“name”)) +
“\nEmail: ” + cursor.getString(cursor.getColumnIndexOrThrow(“email”)));
} else {
Toast.makeText(MainActivity.this, “User Not Found”, Toast.LENGTH_SHORT).show();
}
}
});
// Update User
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = Integer.parseInt(editName.getText().toString()); // For simplicity, using name input for ID
String newName = editEmail.getText().toString();
String newEmail = “newemail@example.com”; // Dummy new email for update
boolean updated = dbHelper.updateUser(id, newName, newEmail);
if (updated) {
Toast.makeText(MainActivity.this, “User Updated”, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, “Update Failed”, Toast.LENGTH_SHORT).show();
}
}
});
// Delete User
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = Integer.parseInt(editName.getText().toString()); // For simplicity, using name input for ID
boolean deleted = dbHelper.deleteUser(id);
if (deleted) {
Toast.makeText(MainActivity.this, “User Deleted”, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, “Deletion Failed”, Toast.LENGTH_SHORT).show();
}
}
});
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
مثال با فلاتر
در اینجا مثالی از نحوه اجرای عملیات CRUD در یک برنامه Flutter با استفاده از sqflite بسته برای SQLite:
راهنما راه اندازی پایگاه داده:
import ‘package:sqflite/sqflite.dart’;
import ‘package:path/path.dart’;
class DatabaseHelper {
static final _databaseName = “users.db”;
static final _databaseVersion = 1;
static final table = ‘users’;
static final columnId = ‘id’;
static final columnName = ‘name’;
static final columnEmail = ’email’;
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
static Database? _database;
Future<Database?> get database async {
if (_database != null) return _database;
_database = await _initDatabase();
return _database;
}
_initDatabase() async {
String path = join(await getDatabasesPath(), _databaseName);
return await openDatabase(path,
version: _databaseVersion, onCreate: _onCreate);
}
Future _onCreate(Database db, int version) async {
await db.execute(”’
CREATE TABLE $table (
$columnId INTEGER PRIMARY KEY AUTOINCREMENT,
$columnName TEXT NOT NULL,
$columnEmail TEXT NOT NULL
)
”’);
}
// Create
Future<int> insert(Map<String, dynamic> row) async {
Database? db = await instance.database;
return await db!.insert(table, row);
}
// Read
Future<List<Map<String, dynamic>>> queryAllRows() async {
Database? db = await instance.database;
return await db!.query(table);
}
// Update
Future<int> update(Map<String, dynamic> row) async {
Database? db = await instance.database;
int id = row[columnId];
return await db!.update(table, row, where: ‘$columnId = ?’, whereArgs: [id]);
}
// Delete
Future<int> delete(int id) async {
Database? db = await instance.database;
return await db!.delete(table, where: ‘$columnId = ?’, whereArgs: [id]);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
استفاده از Database Helper در Flutter Widget:
import ‘package:flutter/material.dart’;
import ‘database_helper.dart’;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: UserPage(),
);
}
}
class UserPage extends StatefulWidget {
@override
_UserPageState createState() => _UserPageState();
}
class _UserPageState extends State<UserPage> {
final dbHelper = DatabaseHelper.instance;
final nameController = TextEditingController();
final emailController = TextEditingController();
void _insert() async {
Map<String, dynamic> row = {
DatabaseHelper.columnName: nameController.text,
DatabaseHelper.columnEmail: emailController.text,
};
final id = await dbHelper.insert(row);
print(‘Inserted row id: $id’);
_queryAll();
}
void _queryAll() async {
final allRows = await dbHelper.queryAllRows();
print(‘Query all rows:’);
allRows.forEach(print);
}
void _update() async {
Map<String, dynamic> row = {
DatabaseHelper.columnId: 1,
DatabaseHelper.columnName: ‘New Name’,
DatabaseHelper.columnEmail: ‘newemail@example.com’,
};
final rowsAffected = await dbHelper.update(row);
print(‘Updated $rowsAffected row(s)’);
_queryAll();
}
void _delete() async {
final id = await dbHelper.delete(1);
print(‘Deleted $id row(s)’);
_queryAll();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(‘CRUD Operations’),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
TextField(
controller: nameController,
decoration: InputDecoration(labelText: ‘Name’),
),
TextField(
controller: emailController,
decoration: InputDecoration(labelText: ‘Email’),
),
Row(
children: <Widget>[
ElevatedButton(
onPressed: _insert,
child: Text(‘Insert’),
),
SizedBox(width: 8),
ElevatedButton(
onPressed: _update,
child: Text(‘Update’),
),
SizedBox(width: 8),
ElevatedButton(
onPressed: _delete,
child: Text(‘Delete’),
),
],
),
ElevatedButton(
onPressed: _queryAll,
child: Text(‘Query’),
),
],
),
),
);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
نتیجه
عملیات CRUD برای توسعه و مدیریت برنامه های کاربردی داده محور اساسی است. این عملیات چه بر روی برنامههای وب، تلفن همراه یا دسکتاپ کار کنند، ستون فقرات تعامل دادهها را تشکیل میدهند و تضمین میکنند که برنامهها میتوانند به طور موثر دادهها را مدیریت و دستکاری کنند. از API های RESTful در توسعه وب گرفته تا SQLite در برنامه های تلفن همراه، درک و اجرای عملیات CRUD برای توسعه دهندگان برای ایجاد راه حل های نرم افزاری قوی، مقیاس پذیر و قابل نگهداری ضروری است.
با تسلط بر عملیات CRUD، توسعه دهندگان می توانند اطمینان حاصل کنند که برنامه های کاربردی آنها قادر به مدیریت کارآمد داده های کاربر، حفظ یکپارچگی داده ها و ارائه یک تجربه کاربری یکپارچه هستند. همانطور که تکنولوژی به تکامل خود ادامه می دهد، اصول CRUD سنگ بنای مدیریت داده در توسعه نرم افزار باقی خواهد ماند.
💰 شما می توانید با اهدا به من کمک کنید
در حوزه فناوری، به ویژه در توسعه نرم افزار و مدیریت پایگاه داده، اصطلاح “CRUD” اساسی است. مخفف آن است ایجاد، خواندن، به روز رسانی، و حذف. این چهار عملیات اساسی برای تعامل با پایگاه های داده ضروری هستند و در همه جا در برنامه ها و سیستم های مختلف وجود دارند. در این مقاله، معنای CRUD، اهمیت آن و نحوه پیادهسازی آن در پلتفرمها و فناوریهای مختلف را بررسی میکنیم.
CRUD چیست؟
CRUD مخفف چهار عملیات اصلی مورد نیاز برای مدیریت ذخیره سازی پایدار است. این عملیات برای عملکرد هر برنامه کاربردی مبتنی بر پایگاه داده ضروری است. بیایید هر جزء را تجزیه کنیم:
- ايجاد كردن: این عملیات شامل افزودن رکوردها یا داده های جدید به پایگاه داده است. به عنوان مثال، زمانی که کاربر در یک وب سایت ثبت نام می کند، اطلاعات او ایجاد و در پایگاه داده ذخیره می شود.
- خواندن: همچنین به عنوان بازیابی شناخته می شود، این عملیات شامل واکشی یا مشاهده رکوردهای موجود از پایگاه داده است. به عنوان مثال، هنگامی که یک کاربر وارد سیستم می شود و اطلاعات پروفایل او نمایش داده می شود، سیستم این داده ها را از پایگاه داده می خواند.
- به روز رسانی: این عملیات مربوط به اصلاح رکوردهای موجود در پایگاه داده است. یک مثال می تواند کاربری باشد که اطلاعات نمایه خود را به روز می کند، مانند تغییر آدرس ایمیل خود.
- حذف: این عملیات شامل حذف رکوردها از پایگاه داده است. به عنوان مثال، اگر کاربر تصمیم به حذف حساب خود داشته باشد، این عملیات اطلاعات او را از پایگاه داده حذف می کند.
این عملیات برای حفظ یکپارچگی و عملکرد هر سیستمی که به ذخیره سازی و مدیریت داده ها متکی است، حیاتی هستند.
اهمیت CRUD
عملیات CRUD ستون فقرات هر سیستم پایگاه داده است. در اینجا دلیل اهمیت آنها است:
- مدیریت اطلاعات: عملیات CRUD امکان مدیریت کارآمد داده ها را فراهم می کند و اطمینان حاصل می کند که اطلاعات می توانند به راحتی ایجاد، دسترسی، اصلاح و حذف شوند.
- تعامل کاربر: بیشتر رابط های کاربری حول عملیات CRUD طراحی شده اند. به عنوان مثال، یک برنامه وبلاگ به کاربران اجازه می دهد تا پست ایجاد کنند، پست ها را بخوانند، پست ها را به روز کنند و پست ها را حذف کنند.
- یکپارچگی داده: با استفاده از عملیات CRUD، توسعه دهندگان می توانند اطمینان حاصل کنند که داده های پایگاه داده ثابت و دقیق باقی می مانند. اجرای صحیح این عملیات به جلوگیری از خرابی داده ها کمک می کند و تضمین می کند که کاربران می توانند مطابق انتظار با برنامه تعامل داشته باشند.
- مقیاس پذیری و قابلیت نگهداری: اجرای صحیح عملیات CRUD سیستم را مقیاس پذیر و نگهداری آسان تر می کند. با رشد برنامه، توسعه دهندگان می توانند حجم فزاینده داده ها را بدون به خطر انداختن عملکرد یا یکپارچگی مدیریت کنند.
CRUD در توسعه وب
در توسعه وب، عملیات CRUD معمولاً با RESTful APIها و خدمات وب مرتبط است. بیایید بررسی کنیم که چگونه CRUD در این زمینه پیاده سازی می شود:
API های RESTful
REST (Representational State Transfer) یک سبک معماری است که از روش های استاندارد HTTP برای انجام عملیات CRUD استفاده می کند. هر روش HTTP مربوط به یک عملیات CRUD است:
-
پست: برای ایجاد یک منبع جدید استفاده می شود. به عنوان مثال، ارسال یک درخواست POST به
/users
با مشخصات کاربر در بدن، یک کاربر جدید ایجاد می کند. -
گرفتن: برای خواندن یا بازیابی یک منبع استفاده می شود. به عنوان مثال، ارسال یک درخواست GET به
/users/1
اطلاعات کاربر با شناسه 1 را بازیابی می کند. -
قرار دادن: برای به روز رسانی یک منبع موجود استفاده می شود. به عنوان مثال، ارسال یک درخواست PUT به
/users/1
با جزئیات کاربر به روز شده در بدن، کاربر با شناسه 1 به روز می شود. -
حذف: برای حذف یک منبع استفاده می شود. به عنوان مثال، ارسال یک درخواست DELETE به
/users/1
کاربر با شناسه 1 را حذف می کند.
مثال با Node.js و Express
در اینجا یک مثال ساده از نحوه اجرای عملیات CRUD در یک برنامه Node.js با استفاده از چارچوب Express آورده شده است:
const express = require('express');
const app = express();
app.use(express.json());
let users = [];
// Create
app.post('/users', (req, res) => {
const user = req.body;
users.push(user);
res.status(201).send('User created');
});
// Read
app.get('/users', (req, res) => {
res.json(users);
});
// Update
app.put('/users/:id', (req, res) => {
const id = parseInt(req.params.id);
const updatedUser = req.body;
users = users.map(user => user.id === id ? updatedUser : user);
res.send('User updated');
});
// Delete
app.delete('/users/:id', (req, res) => {
const id = parseInt(req.params.id);
users = users.filter(user => user.id !== id);
res.send('User deleted');
});
app.listen(3000, () => console.log('Server running on port 3000'));
در این مثال، ما مسیرهایی را برای هر عملیات CRUD تعریف می کنیم و منطق مربوطه را برای مدیریت داده های کاربر پیاده سازی می کنیم.
CRUD در مدیریت پایگاه داده
عملیات CRUD محدود به توسعه وب نیست. آنها همچنین برای مدیریت پایگاه داده اساسی هستند. اکثر پایگاه های داده رابطه ای از SQL (زبان پرس و جو ساختاریافته) برای انجام عملیات CRUD استفاده می کنند. در اینجا نحوه ترجمه هر عملیات CRUD به SQL آمده است:
-
ايجاد كردن:
INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');
-
خواندن:
SELECT * FROM users WHERE id = 1;
-
به روز رسانی:
UPDATE users SET email="john.new@example.com" WHERE id = 1;
-
حذف:
DELETE FROM users WHERE id = 1;
مثال با MySQL
در اینجا نحوه اجرای عملیات CRUD با استفاده از MySQL آورده شده است:
- ايجاد كردن:
INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');
- خواندن:
SELECT * FROM users WHERE id = 1;
- به روز رسانی:
UPDATE users SET email = 'john.new@example.com' WHERE id = 1;
- حذف:
DELETE FROM users WHERE id = 1;
این عملیات با استفاده از پرس و جوهای SQL اجرا می شوند و برای مدیریت داده ها در یک پایگاه داده رابطه ای ضروری هستند.
CRUD در پایگاه های داده NoSQL
در حالی که عملیات CRUD در پایگاههای داده رابطهای ساده هستند، اما برای پایگاههای داده NoSQL نیز قابل اجرا هستند، اگرچه پیادهسازی ممکن است به دلیل ماهیت بدون طرحواره پایگاههای داده NoSQL متفاوت باشد.
مثال با MongoDB
MongoDB یک پایگاه داده محبوب NoSQL است که از یک مدل سند گرا استفاده می کند. در اینجا نحوه اجرای عملیات CRUD در MongoDB آمده است:
- ايجاد كردن:
db.users.insertOne({ name: "John Doe", email: "john@example.com" });
- خواندن:
db.users.findOne({ _id: ObjectId("60c72b2f9b1d8f1d4c8b4567") });
- به روز رسانی:
db.users.updateOne({ _id: ObjectId("60c72b2f9b1d8f1d4c8b4567") }, { $set: { email: "john.new@example.com" } });
- حذف:
db.users.deleteOne({ _id: ObjectId("60c72b2f9b1d8f1d4c8b4567") });
این عملیات از زبان پرس و جو MongoDB برای مدیریت اسناد در یک مجموعه استفاده می کند.
CRUD در توسعه Frontend
در حالی که عملیات CRUD اغلب با توسعه باطن مرتبط است، در توسعه frontend نیز مرتبط است. چارچوبها و کتابخانههای فرانتاند مدرن مانند React، Angular و Vue.js اغلب شامل عملیات CRUD برای مدیریت وضعیت برنامه و تعامل با APIها میشوند.
مثال با React
در اینجا یک مثال ساده از نحوه پیاده سازی عملیات CRUD در برنامه React آورده شده است:
import React, { useState, useEffect } from 'react';
const App = () => {
const [users, setUsers] = useState([]);
const [newUser, setNewUser] = useState('');
useEffect(() => {
// Read
fetch('/api/users')
.then(response => response.json())
.then(data => setUsers(data));
}, []);
const createUser = () => {
// Create
fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: newUser })
})
.then(() => setNewUser(''))
.then(() => fetch('/api/users').then(response => response.json()).then(data => setUsers(data)));
};
const updateUser = (id, newName) => {
// Update
fetch(`/api/users/${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: newName })
})
.then(() => fetch('/api/users').then(response => response.json()).then(data => setUsers(data)));
};
const deleteUser = id => {
// Delete
fetch(`/api/users/${id}`, { method: 'DELETE' })
.then(() => fetch('/api/users').then(response => response.json()).then(data => setUsers(data)));
};
return (
<div>
<h1>Users</h1>
<ul>
{users.map(user => (
<li key={user.id}>
{user.name}
<button onClick={() => updateUser(user.id, prompt('New name:', user.name))}>Update</button>
<button onClick={() => deleteUser(user.id)}>Delete</button>
</li>
))}
</ul>
<input value={newUser} onChange={e => setNewUser(e.target.value)} />
<button onClick={createUser}>Add User</button>
</div>
);
};
export default App;
در این مثال، عملیات CRUD برای مدیریت دادههای کاربر در یک برنامه React استفاده میشود و نشان میدهد که چگونه این عملیات در لایههای مختلف اساسی هستند.
یک برنامه کاربردی
CRUD در توسعه موبایل
توسعه موبایل همچنین به شدت به عملیات CRUD متکی است، چه در حال توسعه برای Android، iOS یا با استفاده از چارچوبهای چند پلتفرمی مانند Flutter یا React Native باشید. مدیریت داده ها، همگام سازی با سرورهای راه دور و ذخیره سازی محلی همگی به عملیات CRUD نیاز دارند.
مثال با اندروید (جاوا)
در اینجا نمونه ای از اجرای عملیات CRUD در یک برنامه اندروید با استفاده از SQLite آورده شده است:
- کلاس کمکی پایگاه داده:
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "users.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "users";
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_EMAIL = "email";
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_EMAIL + " TEXT)";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
// Create
public boolean insertUser(String name, String email) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME, name);
contentValues.put(COLUMN_EMAIL, email);
long result = db.insert(TABLE_NAME, null, contentValues);
return result != -1;
}
// Read
public Cursor getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
return db.query(TABLE_NAME, null, COLUMN_ID + "=?", new String[]{String.valueOf(id)}, null, null, null);
}
// Update
public boolean updateUser(int id, String name, String email) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME, name);
contentValues.put(COLUMN_EMAIL, email);
int result = db.update(TABLE_NAME, contentValues, COLUMN_ID + "=?", new String[]{String.valueOf(id)});
return result > 0;
}
// Delete
public boolean deleteUser(int id) {
SQLiteDatabase db = this.getWritableDatabase();
int result = db.delete(TABLE_NAME, COLUMN_ID + "=?", new String[]{String.valueOf(id)});
return result > 0;
}
}
- استفاده از DBHelper در یک فعالیت:
public class MainActivity extends AppCompatActivity {
DBHelper dbHelper;
EditText editName, editEmail;
Button btnAdd, btnView, btnUpdate, btnDelete;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new DBHelper(this);
editName = findViewById(R.id.editName);
editEmail = findViewById(R.id.editEmail);
btnAdd = findViewById(R.id.btnAdd);
btnView = findViewById(R.id.btnView);
btnUpdate = findViewById(R.id.btnUpdate);
btnDelete = findViewById(R.id.btnDelete);
textView = findViewById(R.id.textView);
// Add User
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = editName.getText().toString();
String email = editEmail.getText().toString();
boolean inserted = dbHelper.insertUser(name, email);
if (inserted) {
Toast.makeText(MainActivity.this, "User Added", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Insertion Failed", Toast.LENGTH_SHORT).show();
}
}
});
// View User
btnView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = Integer.parseInt(editName.getText().toString()); // For simplicity, using name input for ID
Cursor cursor = dbHelper.getUser(id);
if (cursor.moveToFirst()) {
textView.setText("ID: " + cursor.getInt(cursor.getColumnIndexOrThrow("id")) +
"\nName: " + cursor.getString(cursor.getColumnIndexOrThrow("name")) +
"\nEmail: " + cursor.getString(cursor.getColumnIndexOrThrow("email")));
} else {
Toast.makeText(MainActivity.this, "User Not Found", Toast.LENGTH_SHORT).show();
}
}
});
// Update User
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = Integer.parseInt(editName.getText().toString()); // For simplicity, using name input for ID
String newName = editEmail.getText().toString();
String newEmail = "newemail@example.com"; // Dummy new email for update
boolean updated = dbHelper.updateUser(id, newName, newEmail);
if (updated) {
Toast.makeText(MainActivity.this, "User Updated", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Update Failed", Toast.LENGTH_SHORT).show();
}
}
});
// Delete User
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = Integer.parseInt(editName.getText().toString()); // For simplicity, using name input for ID
boolean deleted = dbHelper.deleteUser(id);
if (deleted) {
Toast.makeText(MainActivity.this, "User Deleted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Deletion Failed", Toast.LENGTH_SHORT).show();
}
}
});
}
}
مثال با فلاتر
در اینجا مثالی از نحوه اجرای عملیات CRUD در یک برنامه Flutter با استفاده از sqflite
بسته برای SQLite:
- راهنما راه اندازی پایگاه داده:
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static final _databaseName = "users.db";
static final _databaseVersion = 1;
static final table = 'users';
static final columnId = 'id';
static final columnName = 'name';
static final columnEmail = 'email';
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
static Database? _database;
Future<Database?> get database async {
if (_database != null) return _database;
_database = await _initDatabase();
return _database;
}
_initDatabase() async {
String path = join(await getDatabasesPath(), _databaseName);
return await openDatabase(path,
version: _databaseVersion, onCreate: _onCreate);
}
Future _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $table (
$columnId INTEGER PRIMARY KEY AUTOINCREMENT,
$columnName TEXT NOT NULL,
$columnEmail TEXT NOT NULL
)
''');
}
// Create
Future<int> insert(Map<String, dynamic> row) async {
Database? db = await instance.database;
return await db!.insert(table, row);
}
// Read
Future<List<Map<String, dynamic>>> queryAllRows() async {
Database? db = await instance.database;
return await db!.query(table);
}
// Update
Future<int> update(Map<String, dynamic> row) async {
Database? db = await instance.database;
int id = row[columnId];
return await db!.update(table, row, where: '$columnId = ?', whereArgs: [id]);
}
// Delete
Future<int> delete(int id) async {
Database? db = await instance.database;
return await db!.delete(table, where: '$columnId = ?', whereArgs: [id]);
}
}
- استفاده از Database Helper در Flutter Widget:
import 'package:flutter/material.dart';
import 'database_helper.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: UserPage(),
);
}
}
class UserPage extends StatefulWidget {
@override
_UserPageState createState() => _UserPageState();
}
class _UserPageState extends State<UserPage> {
final dbHelper = DatabaseHelper.instance;
final nameController = TextEditingController();
final emailController = TextEditingController();
void _insert() async {
Map<String, dynamic> row = {
DatabaseHelper.columnName: nameController.text,
DatabaseHelper.columnEmail: emailController.text,
};
final id = await dbHelper.insert(row);
print('Inserted row id: $id');
_queryAll();
}
void _queryAll() async {
final allRows = await dbHelper.queryAllRows();
print('Query all rows:');
allRows.forEach(print);
}
void _update() async {
Map<String, dynamic> row = {
DatabaseHelper.columnId: 1,
DatabaseHelper.columnName: 'New Name',
DatabaseHelper.columnEmail: 'newemail@example.com',
};
final rowsAffected = await dbHelper.update(row);
print('Updated $rowsAffected row(s)');
_queryAll();
}
void _delete() async {
final id = await dbHelper.delete(1);
print('Deleted $id row(s)');
_queryAll();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('CRUD Operations'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
TextField(
controller: nameController,
decoration: InputDecoration(labelText: 'Name'),
),
TextField(
controller: emailController,
decoration: InputDecoration(labelText: 'Email'),
),
Row(
children: <Widget>[
ElevatedButton(
onPressed: _insert,
child: Text('Insert'),
),
SizedBox(width: 8),
ElevatedButton(
onPressed: _update,
child: Text('Update'),
),
SizedBox(width: 8),
ElevatedButton(
onPressed: _delete,
child: Text('Delete'),
),
],
),
ElevatedButton(
onPressed: _queryAll,
child: Text('Query'),
),
],
),
),
);
}
}
نتیجه
عملیات CRUD برای توسعه و مدیریت برنامه های کاربردی داده محور اساسی است. این عملیات چه بر روی برنامههای وب، تلفن همراه یا دسکتاپ کار کنند، ستون فقرات تعامل دادهها را تشکیل میدهند و تضمین میکنند که برنامهها میتوانند به طور موثر دادهها را مدیریت و دستکاری کنند. از API های RESTful در توسعه وب گرفته تا SQLite در برنامه های تلفن همراه، درک و اجرای عملیات CRUD برای توسعه دهندگان برای ایجاد راه حل های نرم افزاری قوی، مقیاس پذیر و قابل نگهداری ضروری است.
با تسلط بر عملیات CRUD، توسعه دهندگان می توانند اطمینان حاصل کنند که برنامه های کاربردی آنها قادر به مدیریت کارآمد داده های کاربر، حفظ یکپارچگی داده ها و ارائه یک تجربه کاربری یکپارچه هستند. همانطور که تکنولوژی به تکامل خود ادامه می دهد، اصول CRUD سنگ بنای مدیریت داده در توسعه نرم افزار باقی خواهد ماند.
💰 شما می توانید با اهدا به من کمک کنید