Actualmente estoy desarrollando una aplicación PHP que utiliza una base de datos de Access como back-end. No por elección usted entiende ... la base de datos es lo que el cliente usó originalmente y usarla es parte de los requisitos.
Uno de los problemas con esta base de datos es que los nombres de columna tienen la convención de nombres más locos que pueda imaginar. Mayúsculas, minúsculas, guiones bajos, espacios y la llanura demente. Por ejemplo, la columna "género" contiene una fecha. Y también lo hace la columna "Usuario2". Hay mucho más pero entiendes la idea.
Enfrentado con esto, decidí crear una matriz para asignar las columnas de la base de datos a las variables de PHP para que podamos aislar el código de la locura. Sin embargo, mi colega cree que estoy complicando demasiado las cosas y deberíamos usar los nombres de las columnas de la base de datos para las variables de PHP correspondientes, de modo que no necesitamos pasar por la matriz de mapeo para encontrar qué va donde.
Así que mi pregunta es esta ... ¿estoy haciendo lo correcto o estoy complicando las cosas?En K.I.S.S y pavimentación de cowpaths
Respuesta
Absolutamente usted está en el camino correcto. Si no abstrae la locura, eventualmente sucumbirá a la locura.
Sin embargo, su colega tiene un punto válido, por lo que le sugiero que también codifique una forma fácil de determinar los datos para el mapeo de columnas en PHP.
No se trata de hacer que sea sencillo, se trata de reequipamiento una base sólida para construir.
Lo que me preocuparía es que este tipo de diseño aleatorio a menudo oculta ciertas reglas comerciales, cosas como "... si el género es una fecha, entonces deben haber comprado un widget en algún momento, por lo tanto, no pueden se le permitirá frotar el lubdub ... "- lo sé loco, pero más común de lo que debería ser.
+10 si pudiera. No ceda a la locura, de lo contrario su código será de escritura única, leído, nunca más. "Entonces, hay variable $ dd, que en ciertos casos contiene la dirección del remitente, pero en otras circunstancias el pago debido. Esto se determina por el número de puntos en la variable $ punts ". (ejemplo real (ya rly!)) – Piskvor
+1 para "fribbish the lubdub" –
Los nombres son excepcionalmente importantes. Si desea que su aplicación sea mantenible, corríjala antes de que la base de códigos crezca aún más.
Esta es una buena pregunta, ya que habla con el corazón de mi humilde opinión de codificación.
Me gustaría ir con usted y abstraer los malos nombres a nombres legibles decente. El resultado es una pequeña complicación para mucho más código lógicamente comprensible y legible.
Para jugar a Devil's Advocate, hay algo que decir para no tener una capa innecesaria de indirección en la carga de memoria a corto plazo para trabajar con el sistema. Una vez que esté familiarizado con el código, sabrá qué va en cada variable, por lo que el beneficio principal es que alguien nuevo tome el código desde cero. Sin embargo, corregir ese problema adecuadamente también requeriría arreglar el esquema de la base de datos que (a) sería un cuerpo de trabajo significativo, y (b) en gran parte haría desaparecer el problema.
No hay una respuesta en blanco y negro a esta pregunta, y la falta de una respuesta obvia a su problema específico sugiere que es posible que desee dejar que los perros durmientes mientan.
Por otro lado, si una operación de limpieza está dentro de los límites de la posibilidad, entonces puede hacerlo en un tipo de factorización, arreglando incrementalmente los nombres de las columnas de la base de datos cuando surja la oportunidad.
Realmente depende de qué tan grande es la aplicación, si puede o no mantener todas las inconsistencias directamente en su cabeza. – Kibbee
De esta manera se encuentra la locura, una vez que la aplicación se desarrolla más allá de un juguete. Una vez entré en un proyecto que comenzó así: "sabrás qué va en qué variable". En el momento en que entré, ha crecido hasta "nadie sabe lo que hace, no toques". Los errores que tardaban unos minutos en arreglarse tomaban horas, incluso días para encontrarlos. – Piskvor
De acuerdo. En un cierto nivel de complejidad, realmente necesita tener un sistema bien organizado para poder darle sentido. – ConcernedOfTunbridgeWells
No dijo que no puede cambiar el nombre de las columnas en Access, así que ... ¡haga eso! Otra posibilidad sería crear vistas para cada tabla y cambiar el nombre de las columnas en la vista. Luego, en lugar de trabajar con Table Employees, trabajas con view vEmployees. Si recuerdo correctamente, Access te permite actualizar las vistas y seleccionarlas.Si está utilizando un ORM con PHP, es posible que no admita la actualización de vistas.
Lo sentimos, se olvidó de aclarar ... La base de datos de Access no se puede cambiar. –
No lo creo ... entonces le sugiero que pruebe el enfoque de la vista. – RedFilter
yo no diría que está complicando las cosas. Domain Driven Design libro de
Eric Evan tiene un plazo preciosa para esto: Anti Corruption Layer
codificación de nombres de tabla y nombres de columna duros nunca es una buena idea, incluso cuando los nombres tienen sentido.
no sé si se usan matrices es la mejor solución sin embargo. No estoy muy familiarizado con PHP, pero me hubiera ido con algo así como cadenas constantes para almacenar los nombres de la tabla. En los idiomas que trabajo en esto conduciría a un código más legible.
Tiene la mala suerte de estar atrapado en esta base de datos, pero creo que, en general, es más inteligente una forma de abstraer los nombres de campo en algo más sensato.
Quizás crearía una estructura de datos que contenga el nombre de la base de datos, el nombre desinfectado, el tipo y un campo para el contenido cuando extraiga los datos del DB. Eso le daría una forma conveniente de unir las cosas para que no esté solo mapeando el esquema del nombre loco.
Absolutamente que estás haciendo lo correcto. En mi opinión, es mejor implementar cierta cordura allí. En el futuro, tu lógica no sería descartada si decidieran cambiar esa base de datos o cualquiera de sus nombres de columna. Si construye su mapeo de la manera correcta, debería ser fácil simplemente conectar las nuevas tablas/columnas directamente.
En todo caso, lo que está haciendo mejora la agilidad de su solución general.
¡Por supuesto que todavía diría que KISS se aplica al método de su mapeo!
Usar los nombres de columna adecuados al final de la aplicación es lo mejor que puede hacer. Y deberías hacerlo a menos que quieras tener que buscar "¿qué se suponía que era ese campo otra vez?" cuando tienes que volver a mirarlo después de haber hecho otra cosa. punto
Su colega es no complicar las cosas. Eso es válido, también.
Así que encapsule el acceso a los campos en un método o métodos y haga que ese método haga la traducción. Usar mapas esto no debería ser un problema de rendimiento.
De hecho, poner toda la asignación a la fuente de datos en un objeto podría ayudarlo si su cliente reconsidera utilizar una base de datos real. Y a los clientes les encanta cambiar su opinión.
por qué no crear una capa de datos con las clases que se asignan a cada mesa. Luego puede definir los métodos de clase para acceder a las columnas y dar los métodos con los nombres que desee. Entonces, el código de acceso a la base de datos de capa de datos es lo único que necesita saber sobre los nombres reales de las columnas. Sospecho que alguien (tal vez varios soneones) ya ha desarrollado un marco para hacer esto. Google "php orm".
Basta con crear vistas, donde más se necesita.
Utilice un ORM, va a cambiar la db pronto ...
Todavía es necesario para mantener la base de datos. Un posible enfoque que puedo sugerir es mapear los nombres de los campos en el código de la aplicación a medida que planificas hacerlo.Pero tarde o temprano tendrás que empezar a manejar esta locura de nombres con nombres de campo y arreglarlo. No es buena idea simplemente detectar un problema e imaginar que es una solución segura y una buena forma de hacerlo. Es solo una solución temporal. No te preocupes por eso.
Es cierto. El plan aquí es lograr que el cliente salga de Access y nos permita mover todos los datos a una base de datos decente donde podamos establecer un esquema un poco menos loco. –
- 1. Significado de * & y ** & en C++
- 2. formato y visualización de fecha y hora en XSLT
- 3. Diferencia y definición de constantes literales y simbólicas en C?
- 4. Herencia y funciones de fábrica en Python y Django
- 5. Combinación y minificación de JS y CSS en ASP.NET MVC
- 6. Modelado de blogs y clasificaciones en mongodb y nodejs
- 7. Buscar y reemplazar en una gama de línea y columna
- 8. Mínimo y máximo de un campo en cakephp y mysql
- 9. Ejecución y depuración de un script y función en R
- 10. 'Y' y 'O' Condición en NSPredicate
- 11. orden de evaluación de || y & en c
- 12. Diferencia entre "y" y "donde" en une
- 13. Diferencia entre "y" y && en Ruby?
- 14. tienda y leer hash y matriz en archivos en Perl
- 15. Efecto de usar una coma en lugar de un punto y coma en C y C++
- 16. Excepción de fecha y hora en la consulta de ColdFusion en cfc y mySQL
- 17. Configurar, publicar y hacer copias de seguridad de repositorios git en Windows y en la red
- 18. Almacenamiento de fechas y horas en UTC y conversión de la hora local en PHP/MySQL
- 19. Y-combinator en D?
- 20. && y || en Scala
- 21. Catamorphism y en Haskell
- 22. escape y en App.config
- 23. Modelo de base de datos en vivo y en borrador
- 24. en Perl y PHP
- 25. Y Combinator en Haskell
- 26. manejo de excepciones en node.js y express
- 27. Orientación de pantalla y valores en manifest.xml
- 28. Auditoría de datos en NHibernate y SqlServer
- 29. Tubería de entrada y salida en Java
- 30. Significados de paréntesis en C++ y C
+1 para "sexo" tiene una fecha – inspite
+1 Igual que la anterior. ¡El más extraño de todos! – Ace