Saya bekerja dengan database SQL Server dengan 1000 tabel, beberapa ratus tampilan, dan beberapa ribu prosedur tersimpan. Kami sedang mencari untuk mulai menggunakan Entity Framework untuk proyek-proyek baru kami, dan kami sedang mengerjakan strategi kami untuk melakukannya. Hal yang saya tutup adalah bagaimana cara terbaik untuk membagi tabel menjadi model yang berbeda (EDMX atau DbContext jika kita pergi kode dulu). Saya dapat memikirkan beberapa strategi langsung:
- Dibagi berdasarkan skema
Kami memiliki tabel kami yang dibagi menjadi mungkin selusin skema. Kita bisa melakukan satu model per skema. Ini tidak sempurna, karena dbo masih menjadi sangat besar, dengan 500+ tabel / tampilan. Masalah lain adalah bahwa unit kerja tertentu pada akhirnya harus melakukan transaksi yang menjangkau beberapa model, yang menambah kompleksitas, meskipun saya berasumsi EF membuat ini cukup mudah. - Pisahkan dengan niat
Daripada mengkhawatirkan skema, pisahkan model dengan niat. Jadi kita akan memiliki model yang berbeda untuk setiap aplikasi, atau proyek, atau modul, atau layar, tergantung pada seberapa granular yang ingin kita dapatkan. Masalah yang saya lihat dengan ini adalah bahwa ada tabel tertentu yang mau tidak mau harus digunakan dalam setiap kasus, seperti Pengguna atau AuditHistory. Apakah kita menambahkan itu ke setiap model (saya pikir ini melanggar KERING), atau apakah mereka dalam model terpisah yang digunakan oleh setiap proyek? - Jangan berpisah sama sekali - satu model raksasa
Ini jelas sederhana dari sudut pandang pengembangan tetapi dari penelitian dan intuisi saya ini sepertinya bisa tampil sangat, baik pada waktu desain, waktu kompilasi, dan mungkin waktu yang berjalan.
Apa praktik terbaik untuk menggunakan EF terhadap basis data yang begitu besar? Khususnya strategi apa yang digunakan orang dalam merancang model terhadap volume objek DB ini? Apakah ada opsi yang menurut saya tidak lebih baik daripada yang saya miliki di atas?
Juga, apakah ini masalah di ORM lain seperti NHibernate? Jika ya, apakah mereka menghasilkan solusi yang lebih baik daripada EF?
sumber
Jawaban:
Secara pribadi, saya sudah mencoba membuat satu skema besar untuk semua entitas saya pada proyek yang cukup kompleks tetapi kecil (~ 300 tabel). Kami memiliki basis data yang sangat normal (normalisasi formulir ke-5 (saya katakan dengan longgar)) dengan banyak hubungan "banyak ke banyak" dan penegakan integritas referensial ekstrem.
Kami juga menggunakan strategi "satu contoh per permintaan" yang saya tidak yakin membantu.
Ketika melakukan daftar sederhana, cukup datar "didefinisikan secara eksplisit", mencari dan menyimpan kinerja secara umum dapat diterima. Tetapi ketika kami mulai menggali hubungan yang dalam, kinerja itu tampaknya mengalami penurunan drastis. Dibandingkan dengan proc yang disimpan dalam hal ini, tidak ada perbandingan (tentu saja). Saya yakin kami bisa men-tweak basis kode di sana-sini untuk meningkatkan kinerjanya, namun, dalam hal ini kami hanya memerlukan peningkatan kinerja tanpa analisis karena kendala waktu, dan kami kembali ke proc yang disimpan (masih memetakannya melalui EF, karena EF memberikan hasil yang sangat diketik), kami hanya membutuhkan itu sebagai jatuh kembali di beberapa daerah. Ketika kami harus menelusuri seluruh basis data untuk membuat koleksi (menggunakan .include () tanpa tanggung jawab), kinerjanya terasa menurun, tapi mungkin kami terlalu banyak bertanya ..
Jadi berdasarkan pengalaman saya, saya akan merekomendasikan membuat .edmx terpisah per niat. Hanya hasilkan apa yang akan Anda gunakan berdasarkan ruang lingkup kebutuhan itu. Anda mungkin memiliki beberapa file .edmx yang dicakup lebih kecil untuk tugas yang bertujuan, dan kemudian beberapa yang besar di mana Anda perlu melintasi hubungan kompleks untuk membangun objek. Saya tidak yakin di mana tempat sihir itu, tapi saya yakin ada satu ... lol ...
Jujur saja, selain dari beberapa jebakan yang menurut kami agaknya datang (melintasi rumit), .edmx besar bekerja dengan baik dari perspektif "bekerja". Tapi Anda harus berhati-hati dengan sihir "fixup" yang konteksnya lakukan di belakang layar jika Anda tidak menonaktifkannya secara eksplisit. Serta menjaga .edmx dalam sinkronisasi ketika perubahan ke database dibuat .. terkadang lebih mudah untuk menghapus seluruh permukaan dan membuat ulang entitas, yang membutuhkan waktu 3 menit sehingga itu bukan masalah besar.
Ini semua dengan EntityFramework 4.1. Saya akan sangat tertarik mendengar tentang pilihan dan pengalaman akhir Anda juga.
Dan mengenai pertanyaan Anda di nHibernate, itu pertanyaan tentang cacing, menurut pendapat saya, Anda akan menggonggong di kedua sisi pagar ... Saya mendengar banyak orang menampar EF demi bashing tanpa bekerja melalui tantangan dan memahami nuansa unik untuk EF itu sendiri .. dan meskipun saya belum pernah menggunakan nHibernate dalam produksi, secara umum, jika Anda harus secara manual dan eksplisit membuat hal-hal seperti pemetaan, Anda akan mendapatkan kontrol yang lebih terbatas, namun, jika Anda dapat menyeret n 'drop, menghasilkan, dan mulai CRUD'ing dan query menggunakan LINQ, saya bisa memberikan omong kosong tentang granularity.
Saya harap ini membantu.
sumber
Biarkan saya mulai dengan klarifikasi sederhana: Saya tidak memiliki pengalaman dengan database yang begitu besar sehingga sisa jawaban saya tidak didasarkan pada contoh dunia nyata.
Jadi Anda memiliki basis data BESAR dan Anda ingin menggunakannya dengan ORM / EF. Saya akan memilih yang kedua. Inilah penjelasan sederhana saya mengapa:
sumber
Saya akan mengatakan Anda tidak dapat memutuskan pertanyaan semacam ini dari perspektif teknis. Saya akan merekomendasikan agar Anda membangun arsitektur berdasarkan kasus penggunaan Anda (cerita pengguna, dll.). Pertama temukan objek bisnis Anda. Objek entitas tidak sesuai standar objek bisnis. Biasanya Anda akan memiliki objek bisnis di depan objek entitas. Kemudian Anda dapat secara bertahap memutuskan apa yang benar-benar Anda butuhkan, berdasarkan kebutuhan pengguna.
"Arsitek yang baik memaksimalkan jumlah keputusan yang tidak dibuat." Robert C. Martin
http://cleancoder.posterous.com/architecture-deference
sumber
Saya menggunakan pendekatan hibrid - hal-hal OLTP ditangani oleh EF sementara operasi berat seperti sisipan bets, pembaruan massal, kueri laporan, dll. Ditangani oleh Stored Procs. Itu juga membuat jalur migrasi lebih mudah jika Anda tidak melakukan penulisan ulang penuh dari lapisan data Anda sekaligus.
sumber