Τα τελευταία χρόνια έχει μεγάλη κουβέντα και μεγάλη χρήση από αρκετούς στην χρήση ORMs. Υπάρχουν αρκετά πλέον στην αγορά (EF, ΝHibernate κ.α.) και έτσι ο καθένας μπορεί να επιλέξει αυτό που του ταιριάζει.
Αρκετές φορές έχω βρεθεί σε συζητήσεις σχετικά με αυτά και από αυτές έχω αποκτήσει την φήμη ότι είμαι από αυτούς που τα κατακρίνουν και στέκονται απέναντι τους.
Η πραγματικότητα όμως είναι διαφορετική, και είναι διαφορετική καθώς έχω κάνει πραγματική χρήση αυτών σε πραγματικά μεγάλο όγκο από database objects (tables, views, stored procedures, functions κ.λ.π) και σε μεγάλο όγκο δεδομένων.
Δεν είμαι αντίθετος στην σωστή χρήση τους και ξεκαθαρίζω αυτό.
Η πλειοψηφία και ιδιαίτερα οι κάτω των 35 πιστεύουν ότι έχουν βρει το άγιο δισκοπότηρο και με αυτό δεν χρειάζονται πλέον να ασχοληθούν με την database δηλαδή να την σχεδιάσουν σωστά ή να μάθουν να γράφουν σωστά κώδικα για αυτή. Αυτό είναι παντελώς λάθος. Ακόμα και στην περίπτωση που έχω δύο πίνακες στην βάση μου θα πρέπει να ασχοληθώ σοβαρά με τον σχεδιασμό της database.
Προσωπικά την δυνατότητα που αρκετά ORMs δίνουν και την ονομάζουν code first την χρησιμοποιώ σαν μέσο επικοινωνίας με τους developers για να μου πουν τι ακριβώς θέλουν να φτιάξουν και όχι για να μπει αυτό σε παραγωγική διαδικασία. Μετά φτιάχνω με τους "παραδοσιακούς τρόπους" την database.
Πολλοί ξεκινάνε και χρησιμοποιούν τα ORMs βλέποντας απλά μια παρουσίαση και απλά παραδείγματα. Λάθος μέγα. Πρέπει να διαβάσεις και πολύ μάλιστα για να μπορέσεις να κάνεις πραγματικά σοβαρή δουλειά μαζί τους.
Αυτό που κάνει όλους να είναι χαρούμενοι από την χρήση των ORMs είναι ότι αυτόματα δημιουργείται κώδικας για τα CRUD operations (Insert, Update, Delete και Read/Select ). Και εγώ είμαι χαρούμενος με αυτό εκτός από ένα σημείο, αυτό που αφορά τα read/select operations.
Ο κώδικας που δημιουργείται για αυτές τις read/select λειτουργίες δεν πάντα ο ιδανικός (για τις άλλες δεν υπάρχει πρόβλημα). Μπορώ να πως ότι δεν είναι ποτέ, ιδιαίτερα όταν εμπλέκονται πολλοί πίνακες, ιδανικός και αυτό που λέω πάντα είναι "Θέλεις να χρησιμοποιήσεις ORM; Κανένα πρόβλημα για τα insert update και delete, αλλά για τα select κοίτα καλά και πείραξε αυτά ώστε να παίζουν σωστά". Μάλιστα προτρέπω όλα τα περίπλοκα queries να γίνουν stored procedures ή views (αν δεν έχουν παραμέτρους).
Θα πρέπει να επισημανθεί ότι είναι καλό, απαραίτητο θα έλεγα, όταν γίνεται access της database με την χρήση ORM στον SQL Server να έχουμε ενεργοποιημένο το "Optimize for Ad hoc queries" και αυτό διότι τα ORMs είναι έτσι φτιαγμένα ώστε να κάνουν ad hoc queries. Αυτό δημιουργεί σοβαρά προβλήματα στο SQL Server και ιδιαίτερα με τη κατανάλωση μνήμης. Έχω γράψει για αυτό σε παλαιότερο μου post εδώ.
Ακόμα αρκετοί ισχυρίζονται ότι πλέον δεν χρειάζονται stored procedures με τα ORMs καθώς αυτά τους δίνουν τα parameterized queries και όπως ισχυρίζονται είναι καλύτερα από τις stored procedures. Λάθος, είναι ακριβώς τα ίδια όσον αφορά τους πόρους και την κατανάλωση τους.
Επίσης όταν οι stored procedures έχουν παραμέτρους και αυτές τις έχουμε κάνει map μέσα στο ORM, θα πρέπει αυτό το mapping να έχει γίνει σωστά όσον αφορά τα data types αυτών με αυτά που έχουν δηλωθεί σε αυτές.
Αυτό θέλω να περάσω σαν μήνυμα σε όλους είναι ότι πάντα μα πάντα θα πρέπει να σχεδιάσουμε και μάλιστα σωστά την βάση μας. Ποτέ χρησιμοποιούμε τον default code για τα select/read operations και οι stored procedures δεν θα πεθάνουν ποτέ όσο και αν κάποιοι επιμένουν να λένε το αντίθετο.
/*antonch*/