Apakah ORM mempromosikan de-normalisasi basis data?

14

Doctrine dan Propel keduanya memanfaatkan pewarisan tabel tunggal dan konkret untuk memetakan hubungan objek. Yang pertama melihat semua bidang yang mungkin di pohon kelas dipetakan ke satu tabel - sedangkan yang kedua memetakan masing-masing kelas ke tabel tertentu, menduplikasi bidang umum dalam hierarki warisan.

Sementara ini memfasilitasi peralatan ORM, itu menyarankan desain database yang buruk bagi saya. Apakah pola desain yang buruk ini diterapkan pada basis data?

sunwukung
sumber

Jawaban:

4

Tidak mungkin mengatakan apakah desain basis data tertentu buruk tanpa mengetahui apa yang dilakukan aplikasi, bentuk data, harapan kinerja, dan sebagainya. Sementara umumnya normalisasi (sampai taraf tertentu) dipandang sebagai praktik terbaik, itu cukup umum untuk menormalisasi area basis data untuk alasan kinerja sehingga baik dan buruk sangat terbuka untuk diskusi tanpa lebih banyak data daripada yang dimiliki kebanyakan orang ketika mereka mulai.

Tambahkan banyak pendekatan yang dapat diambil untuk objek ke pemetaan relasional dan hal-hal menjadi lebih kompleks karena struktur database "terbaik" akan tergantung pada model objek tertentu, tingkat warisan dan sebagainya.

Dengan mengambil satu ukuran untuk semua pendekatan, perpustakaan ORM persisten hampir akan selalu menghasilkan struktur database yang tidak optimal untuk setiap situasi tertentu dan akan menggunakan beberapa hal yang dapat dilihat sebagai praktik buruk untuk situasi tertentu .

Anda tentu saja dapat menulis ORM yang dinormalisasi tetapi Anda akan melihat implikasi kinerja yang lumayan besar karena untuk setiap sisipan ke tabel utama diperlukan untuk memindai berbagai tabel pencarian untuk melihat apakah ada nilai, jika mereka mendapatkan kunci dan jika tidak dapat melakukan sisipan yang relevan.

(Ketika Anda melakukan ini dengan tangan, Anda dapat memotong sebagian dari ini karena Anda tahu Anda telah mempresentasikannya dengan drop-down yang hanya berisi nilai yang valid sehingga Anda tidak perlu melakukan ini, Anda hanya dapat menggunakan kunci senang bahwa itu akan terjadi agar valid, ORM tidak dapat membuat asumsi itu karena tidak mengontrol UI.)

Tetapi yang harus Anda ingat adalah bahwa mereka tidak bertujuan untuk mengoptimalkan kinerja database atau integritas data, mereka mengoptimalkan untuk kecepatan pengembangan . Jika struktur spesifik data Anda penting bagi Anda, maka Anda harus membuat kode objek / pemetaan RDBMS dengan tangan, atau paling tidak melakukan penilaian terperinci atas semua perpustakaan yang tersedia dan memilih yang paling sesuai dengan kebutuhan Anda ( jika ada).

Pada dasarnya itu datang ke persyaratan dan pertukaran antara data yang terstruktur dengan baik, kinerja database dan kecepatan pengembangan. Seperti banyak trade-off Anda tidak bisa memilih ketiganya.

Jon Hopkins
sumber
Saya tidak akan pernah mengambil jalan pintas atau memeriksa secara eksplisit bahwa nilai ada di berbagai tabel pencarian. Saya akan menggunakan batasan kunci asing untuk memastikannya. Saya berharap ORM yang baik akan melakukan hal yang sama.
David Conrad
7

Sebagai aturan praktis, jangan pernah memodelkan data Anda untuk memenuhi kebutuhan pengembang (Anda dapat menggunakan Tampilan atau Sp untuk itu, Tapi bukan Model Data).

Model Data harus didasarkan pada aturan Bisnis aplikasi dan kebutuhan kinerja.

Orang bodoh
sumber
6

Saya tidak setuju bahwa ORM mempromosikan de-normalisasi atau desain database yang buruk. Bahkan, database dengan desain terburuk yang pernah saya lihat telah dilakukan tanpa ORM. Dengan membuatnya sederhana untuk memiliki hubungan yang tepat berdasarkan id baris daripada membuat hubungan berdasarkan nilai bidang acak, itu lebih mempromosikan desain database yang baik.

Mungkin itu tidak mempromosikan normalisasi, tetapi sekali lagi sebuah ORM di mana mudah untuk membuat tabel / objek dan hubungan hampir bisa dilihat untuk mempromosikan itu juga. Tidak banyak lagi pekerjaan di ORM untuk membuat tabel "lokasi" dengan alamat dan menautkan karyawan ke lokasi alih-alih menambahkan alamat ke tabel karyawan. Tetapi tanpa ORM, memisahkan lokasi berarti bahwa setiap kali Anda ingin mengakses lokasi juga, Anda harus bergabung.

Jadi jawaban saya adalah: Tidak, saya rasa tidak . Mungkin sebenarnya sebaliknya, ORM yang baik mendorong desain database yang baik, setidaknya tentang mereka yang memiliki sedikit pengalaman.

Lennart Regebro
sumber
1
Dan banyak ORM mampu melakukan pewarisan multi-tabel: (N) Hibernate dan RoR ActiveRecord lakukan, misalnya.
rsenna