Mejores prácticas: patrones de programación de aplicaciones de bases de datos

11

He escrito muchas aplicaciones web de bases de datos (MySQL) hasta ahora, pero siempre creo que mi estructura es un poco torpe. Quiero mejorar el patrón de programación / diseño que uso, esperando algún consejo aquí. Particularmente, no puedo encontrar una estructura que complemente un enfoque OOP que encapsule la implementación de la base de datos (esquema). yo

Creo que mi pregunta puede explicarse mejor con un ejemplo. Hay 2 enfoques que uso ahora y digo que tengo un objeto / clase Factura:

primero es usar funciones miembro estáticas

class Invoice
{
   int id;
   string ref;
   int customer_id;
   date created;
   date due;

   static id create();
   static bool update(id, field1, field2, ...);
   static bool delete(id);
   static bool get(id);
};

El segundo enfoque es poner todo en un objeto de base de datos:

class Database extends ProprietaryDBConnecter, Singleton
{
   id createInvoice();
   bool updateInvoice(id, field1, field2, ...);
   bool deleteInvoice(id);
   bool getInvoice(id);

   id createCustomer();
   bool updateCustomer(id, field1, field2, ...);
   bool deleteCustomer(id);
   bool getCustomer(id);

   // etc...
}

Me parece que en ambos sentidos las funciones miembro (SQL) son muy inseparables de la "vista", ya que la "vista" determina lo que las clases deben tener y, por lo tanto, parece romper la arquitectura de documento / vista.

Además, parece un poco ineficiente, por ejemplo, una instrucción SELECT solo debe seleccionar lo que se necesita, pero la presencia de variables miembro en Factura parece implicar "datos garantizados".

No sé si expliqué la pregunta claramente: ¿Cuáles son algunos de los mejores enfoques para esta arquitectura / patrón de diseño / cómo se conoce?

Gracias por los consejos

Jake
fuente

Respuestas:

14

Bueno, supongo que podrías usar un ORM.

Pero realmente, el diseño de la base de datos NO debe seguir los principios de OOP, debe seguir los principios del diseño de la base de datos, como la normalización. Y debe diseñarse en la base de datos, no en la aplicación. Y las reglas de integridad de datos deben aplicarse a nivel de la base de datos, no por la aplicación.

Le sugiero que lea algunos libros de diseño de bases de datos y, luego, lea sobre el ajuste de rendimiento de la base de datos de su elección.

HLGEM
fuente
55
+1 porque no todo debe ser OOP (¡incluso si algunos ORM son bastante agradables!)
Javier
1
Los O / RM son buenos, pero usarlos no significa que no pueda cumplir con un buen diseño de base de datos.
BlackICE
1
@David, estoy de acuerdo en que eso es cierto en manos de alguien que sabe lo que está haciendo. Y le sugerí que mirara un ORM, pero realmente si no conoce el diseño de la base de datos primero, un ORM es una herramienta peligrosa.
HLGEM
Es un buen punto que las reglas de integridad de datos se pueden aplicar a nivel de base de datos. Sin embargo, a veces tiene sentido poner algunas reglas (como 'el proyecto siempre debe contener más de 5 miembros del equipo') en la aplicación si las reglas están sujetas a cambios, y solo la aplicación modificará los datos.
Jon Onstott
La aplicación casi nunca es lo único que modifica los datos. Las reglas de negocio que no se incluyen en la base de datos tienden a violarse muy fácilmente cuando alguien necesita hacer un cambio rápido a una gran cantidad de datos para admitir alguna corrección de datos.
HLGEM
10

No puedo encontrar una estructura que complemente un enfoque OOP que encapsule la implementación de la base de datos

Parece que estás describiendo el desajuste de impedancia relacional del objeto .

Hay varias cosas que se supone que resuelven este OODBMS, herramientas ORM, una gran cantidad de herramientas de acceso a datos.

Creo que el hecho de que haya tantas soluciones me lleva a creer que One True Solution ™ no existe.

Por lo tanto, puede elegir cualquier dirección que desee con la seguridad de que algunas personas lo odiarán y otras lo amarán.

Conrad Frix
fuente
Parece que es, de una manera más rigurosa.
Jake
2

Si no desea usar un contenedor ORM, use una base de datos que admita el almacenamiento de estilo OOP como MongoDB .

MongoDB (de "hu mongo nosotros") es un multi-plataforma de base de datos orientada a documentos del sistema. Clasificada como una base de datos " NoSQL ", MongoDB evita la estructura de base de datos relacional tradicional basada en tablas en favor de documentos similares a JSON con esquemas dinámicos (MongoDB llama al formato BSON ), haciendo que la integración de datos en ciertos tipos de aplicaciones sea más fácil y rápida. ..

Josh K
fuente