¿Cuáles son las mejores prácticas para crear estructuras de bases de datos de archivos planos en PHP?
Hay muchos marcos de archivos planos PHP más maduros que intento implementar una sintaxis de consulta similar a SQL, que es exagerada para mis propósitos en la mayoría de los casos. (Solo usaría una base de datos en ese momento).
¿Existen trucos elegantes para obtener un buen rendimiento y funciones con una pequeña sobrecarga de código?
for loop
(a menos que esté usando todos los datos en la carpeta), por lo tanto, funciona mucho más rápido que una base de datos. Me gustaría entrar en detalles y dar una muy buena respuesta, pero desafortunadamente esta pregunta está cerrada.Respuestas:
Bueno, ¿cuál es la naturaleza de las bases de datos planas? ¿Son grandes o pequeños? ¿Son matrices simples con matrices en ellas? si es algo simple, digamos perfiles de usuario construidos como tal:
y guardar o actualizar el registro db para ese usuario.
y cargar el registro para el usuario
pero, nuevamente, esta implementación variará según la aplicación y la naturaleza de la base de datos que necesite.
fuente
Podría considerar SQLite . Es casi tan simple como archivos planos, pero obtienes un motor SQL para realizar consultas. También funciona bien con PHP .
fuente
En mi opinión, usar una "Base de datos de archivos planos" en el sentido que usted quiere decir (y la respuesta que ha aceptado) no es necesariamente la mejor manera de hacer las cosas. En primer lugar, usar
serialize()
yunserialize()
puede causar GRANDES dolores de cabeza si alguien ingresa y edita el archivo (de hecho, pueden poner código arbitrario en su "base de datos" para que se ejecute cada vez).Personalmente, diría: ¿por qué no mirar hacia el futuro? Ha habido tantas veces que he tenido problemas porque he estado creando mis propios archivos "propietarios", y el proyecto se ha disparado hasta un punto en el que necesita una base de datos, y estoy pensando "ya sabes, desearía Para empezar, escribí esto para una base de datos ", porque la refactorización del código requiere demasiado tiempo y esfuerzo.
De esto aprendí que la manera de seguir adelante es preparar mi aplicación para el futuro para que cuando crezca no tenga que pasar días refactorizando. ¿Cómo hago esto?
SQLite. Funciona como una base de datos, usa SQL y es bastante fácil de cambiar a mySQL (¡especialmente si está usando clases abstractas para la manipulación de la base de datos como yo!)
De hecho, especialmente con el método de "respuesta aceptada", puede reducir drásticamente el uso de memoria de su aplicación (no tiene que cargar todos los "REGISTROS" en PHP)
fuente
serialize()
también puede ser muy útil para eso. Creo que el truco para crear un sistema viable es encontrar alguna forma de indexar los nodos de datos sin matarte con la complejidad.Un marco que estoy considerando sería para una plataforma de blogs. Dado que casi cualquier vista posible de los datos que desee se ordenaría por fecha, estaba pensando en esta estructura:
Un directorio por nodo de contenido:
Subdirectorios de cada nodo incluyendo
Así como archivos de texto simples en el directorio de nodos para contenido pre-renderizado y post-renderizado y similares.
Esto permitiría una simple
glob()
llamada de PHP (y probablemente una inversión de la matriz de resultados) para consultar casi cualquier cosa dentro de la estructura de contenido:Devolvería rutas que incluyan todos los artículos etiquetados como "divertidos".
fuente
Aquí está el código que usamos para Lilina:
Almacena cada entrada como un archivo separado, que encontramos que es lo suficientemente eficiente para su uso (no se cargan datos innecesarios y es más rápido de guardar).
fuente
Si va a utilizar un archivo plano para conservar los datos, utilice XML para estructurar los datos. PHP tiene un analizador XML incorporado .
fuente
Si desea un resultado legible por humanos, también puede usar este tipo de archivo:
De esta manera, solo tiene un archivo, puede depurarlo (y corregirlo manualmente) fácilmente, puede agregar campos más tarde (al final de cada línea) y el código PHP es simple (para cada línea, dividido según |).
Sin embargo, los inconvenientes son que debe analizar todo el archivo para buscar algo (si tiene millones de entradas, no está bien) y debe manejar el separador en los datos (por ejemplo, si el nick es WaR | ordz).
fuente
He escrito dos funciones simples diseñadas para almacenar datos en un archivo. Puede juzgar por sí mismo si es útil en este caso. El punto es guardar una variable php (si es una matriz, una cadena o un objeto) en un archivo.
fuente
Éste es inspirador como solución práctica:
https://github.com/mhgolkar/FlatFire
Utiliza múltiples estrategias para manejar datos ...
[Copiado del archivo Readme]
Libre o Estructurado o Mixto
fuente
En mi humilde opinión, tienes dos opciones si quieres evitar hacer algo casero:
SQLite
Si está familiarizado con PDO, puede instalar un controlador PDO que admita SQLite. Nunca lo usé, pero he usado mucho PDO con MySQL. Voy a darle una oportunidad a esto en un proyecto actual.
XML
Se hace esto muchas veces para cantidades relativamente pequeñas de datos. XMLReader es una clase liviana de estilo cursor de lectura hacia adelante. SimpleXML simplifica la lectura de un documento XML en un objeto al que puede acceder como cualquier otra instancia de clase.
fuente
Solo señalando un problema potencial con una base de datos de archivos planos con este tipo de sistema:
... etc
El problema es que los datos de la celda contienen un "|" o un "\ n", los datos se perderán. A veces, sería más fácil dividir por combinaciones de letras que la mayoría de la gente no usaría.
Por ejemplo:
Divisor de columna:
#$% (Shift+345)
Separador de filas:
^&* (Shift+678)
Archivo de texto:
test data#$%blah blah#$%^&*new row#$%new row data 2
Entonces usa:
explode("#$%", $data); use foreach, the explode again to separate columns
O cualquier cosa por el estilo. Además, podría agregar que las bases de datos de archivos planos son buenas para sistemas con pequeñas cantidades de datos (es decir, menos de 20 filas), pero se convierten en grandes consumidores de memoria para bases de datos más grandes.
fuente