Panduan

Apa Itu ORM? Cara Aplikasi Berkomunikasi dengan Pangkalan Data, Diterangkan

ORM (object-relational mapper) ialah pustaka kod yang berada di antara aplikasi dan pangkalan data hubungan. Daripada menulis pertanyaan pangkalan data dalam SQL, pembangun bekerja dengan data sebagai objek biasa dalam bahasa pengaturcaraan mereka — db.booking.create(...) atau Booking.find(...) — dan ORM menterjemahkannya kepada SQL, menjalankannya dan menukar hasilnya kembali kepada objek. Contoh popular ialah Prisma dan Drizzle untuk TypeScript, SQLAlchemy untuk Python dan Entity Framework Core untuk C#.

Mengapa ORM penting apabila anda membina dengan AI

Apabila pembina aplikasi AI menambah pangkalan data pada aplikasi anda, ia biasanya turut menambah ORM untuk berkomunikasi dengan pangkalan data itu. Anda tidak perlu menulis kod ORM sendiri, tetapi berguna untuk tahu ia wujud:

  • Model data anda tinggal dalam kod. Fail skema ORM selalunya ialah penerangan yang paling jelas tentang data aplikasi anda: jadual yang wujud, medan bagi setiap jadual, dan cara ia dihubungkan. Membacanya ialah cara pantas untuk menyemak sama ada AI memahami aplikasi anda.
  • Perubahan pada pangkalan data melalui migrasi. Apabila anda minta “tambah nombor telefon kepada pelanggan”, AI mengemas kini model dan mencipta migrasi. Mengetahui perkara ini membantu anda faham mengapa sesuatu perubahan mungkin perlu digunakan dahulu sebelum ia berfungsi secara langsung.
  • Selamat secara lalai. ORM membina pertanyaan dengan cara yang melindungi daripada suntikan SQL, antara lubang keselamatan paling biasa dalam aplikasi yang menyusun pertanyaan dengan tangan.
  • Perangkap kelajuan. ORM memudahkan anda secara tidak sengaja menjalankan ratusan pertanyaan kecil di tempat yang sepatutnya memadai dengan satu sahaja. Ini punca biasa halaman yang perlahan dalam aplikasi yang dibina AI.

Analogi harian

Bayangkan seorang pelancong British dan seorang penjual kedai Jepun yang tidak berkongsi bahasa, berbual melalui jurubahasa.

Pelancong (aplikasi anda) berkata, “Saya mahu tiga teh termurah yang awak ada.” Jurubahasa (ORM) menterjemahkannya ke dalam bahasa Jepun yang tepat (SQL), menyerahkannya kepada penjual (pangkalan data), dan menterjemahkan jawapannya kembali ke bahasa Inggeris.

Pelancong tidak perlu belajar bahasa Jepun, dan untuk kebanyakan perbualan itu tidak mengapa. Tetapi untuk rundingan yang rumit, lebih baik bercakap secara langsung — sebab itulah kebanyakan ORM membenarkan pembangun menulis SQL mentah apabila perlu.

Cara ORM berfungsi

Pangkalan data seperti Postgres menyimpan data dalam jadual yang terdiri daripada baris dan lajur, dan ia ditanya menggunakan SQL. Bahasa pengaturcaraan pula bekerja dengan objek: tempahan dengan date, customer dan status. ORM memetakan satu kepada yang lain:

Bahagian pangkalan dataBahagian ORM / kod
Jadual bookingsModel Booking
BarisSatu objek tempahan
Lajur starts_atMedan startsAt
Kunci asing customer_idHubungan booking.customer
SELECT, INSERT, UPDATE, DELETEKaedah find, create, update, delete

Empat operasi itu ialah tindakan CRUD yang hampir setiap aplikasi dibina daripadanya.

Contoh kerja: tempahan dengan Prisma

Berikut ialah skema Prisma yang dipermudahkan untuk aplikasi tempahan salon. Ia menerangkan dua jadual dan cara keduanya dipautkan:

model Customer {
  id       Int       @id @default(autoincrement())
  name     String
  email    String    @unique
  bookings Booking[]
}

model Booking {
  id         Int      @id @default(autoincrement())
  startsAt   DateTime
  service    String
  customer   Customer @relation(fields: [customerId], references: [id])
  customerId Int
}

Dalam bahasa mudah: seorang pelanggan mempunyai nama, e-mel yang unik dan banyak tempahan; setiap tempahan mempunyai masa mula, perkhidmatan dan tergolong kepada satu pelanggan.

Sekarang aplikasi mahu “tempahan Lena yang akan datang, yang paling awal dahulu”:

const bookings = await db.booking.findMany({
  where: {
    customer: { email: "lena@example.com" },
    startsAt: { gte: new Date() },
  },
  orderBy: { startsAt: "asc" },
});

ORM menukarnya kepada SQL lebih kurang seperti ini, menjalankannya dan memulangkan senarai objek tempahan:

SELECT b.* FROM "Booking" b
JOIN "Customer" c ON c.id = b."customerId"
WHERE c.email = $1 AND b."startsAt" >= $2
ORDER BY b."startsAt" ASC;

$1 dan $2 ialah pemegang tempat: e-mel dan tarikh dihantar berasingan daripada teks pertanyaan, dan itulah yang menghalang suntikan SQL.

Migrasi

Jika anda kemudian minta “benarkan pelanggan menambah nombor telefon”, AI menambah phone String? pada model Customer (tanda ? bermaksud pilihan) dan menjana migrasi — skrip SQL kecil seperti ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Migrasi disimpan mengikut susunan, supaya setiap salinan pangkalan data boleh dibawa ke struktur yang sama, dan sejarah perubahan dikekalkan.

ORM biasa mengikut bahasa

BahasaORM biasa
TypeScript / JavaScriptPrisma, Drizzle, TypeORM, Sequelize
PythonSQLAlchemy, Django ORM, SQLModel
C#Entity Framework Core
JavaHibernate (selalunya melalui Spring Data JPA)
RubyActive Record

ORM berbeza dari segi sejauh mana ia menyembunyikan SQL. Prisma menggunakan bahasa skema sendiri dan gaya pertanyaan tersendiri; Drizzle sengaja kekal dekat dengan bentuk SQL sambil memastikan semuanya ditaip. Alat yang lebih ringan dipanggil query builder, seperti Knex atau Kysely untuk TypeScript, membantu membina SQL dalam kod tanpa memetakan baris kepada objek penuh.

Istilah utama

IstilahMaksud
ModelDefinisi kod bagi sesuatu jadual dan medannya.
SkemaPenerangan lengkap tentang semua jadual, medan dan hubungan.
HubunganPautan antara model, seperti tempahan yang tergolong kepada pelanggan.
MigrasiSkrip berversi yang mengubah struktur pangkalan data.
Query builderAlat yang lebih ringan untuk membina SQL dalam kod tanpa pemetaan objek penuh.
Masalah N+1Menjalankan satu pertanyaan untuk senarai, kemudian satu lagi untuk setiap item — perlahan apabila skala membesar.
Raw SQLSQL yang ditulis dengan tangan, digunakan apabila ORM menghalang kerja.

Salah faham yang biasa

  • “ORM ialah pangkalan data.” Bukan. Ia penterjemah. Anda tetap memerlukan pangkalan data seperti Postgres.
  • “Dengan ORM, anda tidak perlu faham data anda.” Jadual yang direka dengan lemah tetap menyusahkan walaupun melalui ORM. Model data yang baik lebih penting daripada alatnya.
  • “ORM sentiasa perlahan.” Pertanyaan harian biasanya baik. Kelambatan selalunya datang daripada corak seperti pertanyaan N+1 atau indeks yang tiada, dan ini boleh dibaiki.
  • “ORM bermakna tiada risiko suntikan SQL, selamanya.” Kaedah ORM standard adalah selamat, tetapi SQL mentah yang ditulis dengan input pengguna yang ditampal masih berbahaya.
  • “Mengedit fail skema mengubah pangkalan data yang sedang hidup.” Hanya selepas migrasi dicipta dan digunakan pada pangkalan data itu.

Apa nak tanya pembina AI anda

  • “Tunjukkan skema pangkalan data dan terangkan setiap jadual dan hubungan dalam bahasa mudah.”
  • “ORM mana yang digunakan projek ini, dan di mana migrasinya?”
  • “Sebelum menukar mana-mana jadual, beritahu saya sama ada data sedia ada akan terjejas, dan jangan buang lajur yang mempunyai data tanpa bertanya dahulu.”
  • “Semak halaman yang paling perlahan untuk pertanyaan N+1 dan tambah indeks di tempat senarai ditapis atau disusun.”
  • “Pastikan setiap pertanyaan yang menggunakan input pengguna melalui ORM atau menggunakan parameter — tiada SQL yang dibina dengan rentetan teks.”

ORM dalam Mythex

Apabila aplikasi anda perlu menyimpan data, Mythex menambah pangkalan data Postgres khusus kepada projek — tanya dalam sembang atau gunakan arahan /database — dan memasukkan butiran sambungannya ke dalam ruang kerja serta aplikasi yang diterbitkan (Database). Ejen kemudian menulis kod yang membaca dan menyimpan data anda. Jika anda ada pilihan — “guna Prisma”, “guna SQLAlchemy” atau “SQL biasa, tanpa ORM” — beritahu dalam sembang. Minta ejen menerangkan skema bila-bila masa anda mahu menyemak strukturnya; anda boleh membaca fail dalam editor kod. Untuk gambaran yang lebih besar, lihat apa itu pangkalan data dan SQL vs NoSQL.

Soalan lazim

Apakah ORM dalam istilah mudah?

ORM (object-relational mapper) ialah pustaka kod yang berada di antara aplikasi anda dan pangkalan data hubungan. Ia membolehkan pembangun membaca dan menyimpan data sebagai objek biasa dalam bahasa pengaturcaraan mereka, dan ia menulis pertanyaan SQL untuk mereka di belakang tabir.

Apakah contoh ORM?

ORM popular termasuk Prisma dan Drizzle untuk TypeScript dan JavaScript, SQLAlchemy dan Django ORM untuk Python, Entity Framework Core untuk C#, Hibernate untuk Java, dan Active Record dalam Ruby on Rails.

Adakah ORM lebih baik daripada menulis SQL?

Bergantung pada tugasnya. ORM menjadikan bacaan dan tulisan harian lebih pantas untuk ditulis, lebih selamat dan lebih mudah diubah, manakala SQL yang ditulis dengan tangan memberi kawalan penuh untuk laporan kompleks atau pertanyaan yang sensitif kepada prestasi. Kebanyakan ORM membenarkan anda turun ke SQL mentah apabila perlu.

Apakah migrasi?

Migrasi ialah skrip kecil yang berversi untuk mengubah struktur pangkalan data, seperti menambah jadual atau lajur. ORM boleh menjana migrasi daripada model data anda supaya setiap salinan pangkalan data — di komputer riba, dalam ujian dan dalam produksi — berakhir dengan struktur yang sama.

Mythex · Pricing · Bina apa sahaja dengan AI · Templat laman web dan aplikasi · Mythex dibandingkan · Glosari pembinaan aplikasi AI · Alat percuma untuk membina aplikasi dengan AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)