Saat menggunakan ORM, beberapa hal yang harus diperhatikan dalam desain basis data Anda


19

Apa sajakah desain database yang harus diperhatikan ketika Anda tahu bahwa database akan diakses menggunakan Object Relational Mapper (ORM) Wikipedia ? Juga lihat Entity Framework NHibernate atau LLBLGenPro.

Sebagai contoh, saya akan mencatat batas parameter 2100 pada panggilan RPC SqlServer. Ini adalah masalah ketika menggunakan LLBLgen dan tabel bergabung ketika kunci primer majemuk digunakan lihat artikel MSDN untuk kunci majemuk .


4
Jangan tersinggung, tetapi "bergabung dengan tabel dengan lebih dari 1 kunci primer" .. ini mendefinisikan kembali salah satu aturan dasar sebuah tabel, satu PK per tabel. Apa sebenarnya yang kamu maksud?
Marian

Bagaimana cara ini mencapai batas parameter 2100? Apakah Anda memiliki tabel dengan banyak kolom? Juga, saya kira Anda maksud "Pemetaan Objek-Relasional" dan bukan "Pemodelan Peran-Peran"
John Saunders

Batas parameter 2100 terkadang menjadi masalah jika Anda meneruskan daftar nilai yang besar ke SQL 'IN' (LINQ array.Contains (anggota)). Namun, itu tidak benar-benar ada hubungannya dengan desain database; itu lebih merupakan masalah pola kueri. Solusi termudah untuk ORM yang 'menderita' dari itu adalah memasukkan daftar ke tabel sementara [permanen] dan bergabung dengan itu dan / atau menggunakan subquery yang memilih item yang akan ditanyakan dari mana pun mereka berasal. (Melewati ribuan item ke 'IN' SQL umumnya buruk, apakah Anda menggunakan ATAU mapper atau tidak).
KristoferA

@ John, ya Pemetaan Relasional Objek
BozoJoe

4
@BozoJoe: sebuah tabel dapat - menurut definisi - hanya memiliki satu kunci utama. Tidak ada DBMS yang akan memungkinkan Anda untuk menentukan lebih dari satu kunci utama untuk satu tabel.
a_horse_with_no_name

Jawaban:


17

Pergi melalui teknik normalisasi standar, terutama ke bentuk normal ke-3. Beberapa ORM dapat menangkap hubungan yang ditentukan pada tingkat basis data sehingga Anda tidak perlu secara manual.

Saya akan benar-benar pergi ke arah lain dan bertanya apa yang harus saya ketahui tentang ORM. Pastikan Anda tahu: - Bagaimana cara membuat profil kueri? - Bagaimana saya bisa mengganti ORM dan menulis permintaan saya sendiri? - Bisakah saya menggunakan procs yang disimpan sebagai gantinya?

Database harus ORN agnostik karena, kemungkinan besar, itu akan bertahan lebih lama dari aplikasi.


+1: "Basis data harus ORM agnostik". Tetap berpegang pada standar untuk desain database dan ORM yang baik akan senang juga.
MicSim

12
  1. Jangan pernah ORM membuat atau memperbarui skema. Selalu gunakan SQL yang dihasilkan sebagai templat tetapi telusuri sebelum membuat perubahan (Saya telah melihat ORM kami membuat indeks yang berlebihan, gunakan tipe data yang buruk ... semua hal buruk itu)

  2. Waspadai apa yang tidak dapat dilakukan oleh ORM Anda. Django untuk sementara waktu tidak mendukung grup melalui ORM yang menyusahkan (tetap saja, sistem legacy menyenangkan!). Jadi menyadari keterbatasan ORM adalah suatu keharusan bagi DBA bahkan jika mereka bukan orang yang menulis kode untuk ORM

  3. Secara berkala, ambil log lambat Anda, gabungkan mereka melalui mysqlslowlog, dan lihat 10 teratas. Pada dasarnya ini akan menunjukkan kepada Anda pertanyaan yang memakan waktu paling banyak secara keseluruhan. Kueri yang hanya membutuhkan rata-rata 1 detik tetapi berjalan 50 ribu kali dalam sebulan terakhir akan mencuat pada laporan agregat itu seperti jempol yang sakit;)

Saya tidak akan mengatakan terlalu ekstrim untuk membuang ORM sepenuhnya. Jika pengembang Anda menggunakan ORM bukan DBA, mereka cenderung menulis SQL yang lebih buruk atau lebih buruk daripada ORM. Jadi pada akhirnya akan jatuh pada DBA untuk menonton apa yang terjadi.


1
Dan pertimbangkan untuk menempatkan logika yang sangat kompleks dalam proc yang disimpan. ORM dapat memanggil procs yang disimpan dan untuk logika yang sangat kompleks, lebih mudah untuk menyempurnakan tune proc.
HLGEM

7

Ada beberapa hal yang saya perhatikan segera tentang database lama yang berbeda dari database yang dibuat oleh ORM seperti Sequel dan ActiveRecord untuk Ruby.

  1. Penggunaan kunci utama di semua tabel disebut 'id'. Ya, itu bisa diganti, tetapi idmerupakan default.
  2. Penggunaan nama jamak untuk tabel.
  3. Penggunaan garis bawah ("snakecase") untuk memisahkan kata-kata yang menciptakan nama deskriptif dari tabel dan bidang.
  4. Penggunaan _idditambahkan ke kunci asing: Tata letaknya biasanya seperti referenced_table_id.

Saya telah menulis SQL dengan tangan saya selama bertahun-tahun karena saya tidak mempercayai ORM, tetapi selama dua atau tiga terakhir saya mulai menggunakan dua ORM yang disebutkan sebelumnya, dan saya terkesan dengan seberapa baik mereka berintegrasi dengan database yang ada, dan seberapa baik mereka dapat menguraikan database jika konvensi mereka diikuti, atau saya meluangkan waktu untuk memberi mereka petunjuk yang diperlukan untuk memahami DB warisan.

Saya tidak tahu apakah ada pedoman umum untuk merancang skema agar bermain baik dengan ORM, tapi saya pikir kita semua akan mendapat manfaat dengan memiliki beberapa standar. Pasti ada waktu dan tempat untuk ORM, terutama jika Anda menggunakan bahasa OO yang baik dan Anda berada di jadwal yang ketat.


1
FYI: ada alat untuk menangani perbedaan penamaan konvensi untuk banyak ATAU pembuat peta. Saya memiliki tambahan untuk Visual Studio yang menangani itu untuk Entity Framework dan Linq-to-SQL dengan penamaan berbasis aturan; lihat huagati.com/dbmltools untuk detail lebih lanjut tentang itu.
KristoferA

1
Id adalah antipattern SQL untuk penamaan bidang id dan tidak boleh digunakan.
HLGEM

Mau jelaskan kenapa? Bagaimana kita menangani hubungan antar tabel ketika kita perlu melakukan pencarian seperti satu-ke-banyak dan banyak-ke-satu? Dalam ORM yang saya gunakan tidak menggunakan ID pasti akan bertentangan dengan arus.
the Tin Man

2

Tergantung (:)) sedikit pada apa ATAU mapper yang Anda gunakan, jadi luangkan waktu untuk meneliti fitur db mapper OR apa yang didukung / tidak didukung.

Misalnya, pemetaan Microsoft ATAU tidak mendukung semua tipe data bawaan SQL Server, tidak mendukung beberapa fitur TSQL yang lebih baru / canggih (kueri rekursif, petunjuk pengoptimal, dll. Muncul dalam pikiran).

Secara teori , seorang ATAU mapper yang baik harus cukup fleksibel untuk mengatasi (dan memungkinkan Anda untuk memetakan) skema database relasional yang dirancang dengan baik untuk model objek yang baik. Pada kenyataannya, kita masih harus sedikit sebelum semua potongan puzzle ada di tempatnya; meskipun banyak ATAU pembuat peta mendukung pemetaan tingkat lanjut, pemetaan itu sering kali dilakukan dengan mengorbankan pertanyaan yang rumit dan masalah kinerja.

Untuk kinerja db yang baik (dan untuk menjaga kewarasan dba :)), Anda harus tetap mengikuti praktik terbaik dalam hal desain skema db; normalisasikan dulu dan denormalkan di mana [/ jika] perlu. Di sisi kode, jangan berlebihan dengan model objek Anda ; bahkan jika ATAU mapper mendukung model pewarisan kompleks dan entitas yang menggabungkan banyak tabel bersama, ini juga area di mana Anda berisiko mengalami masalah dengan kueri yang terlalu rumit mengenai database dll. Profil, profil, profil, dan jangan hanya mengambil ORM permintaan yang dihasilkan begitu saja. Ingatlah bahwa ATAU kueri yang dihasilkan mapper sering dapat diubah seperti kueri SQL normal dan bahwa dua kueri yang secara fungsional setara di sisi objek (mis. Kueri linq) terkadang dapat menghasilkan kueri SQL yang sangat berbeda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.