Bases de datos de archivos planos [cerrados] -- php campo con sql campo con database campo con flat-file camp Relacionados El problema

Flat file databases [closed]


126
vote

problema

Español
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas.

¿Quieres mejorar esta pregunta? Actualizar la pregunta para que pueda responderse con hechos y citas de Edición de este post .

cerrado hace 5 años .

> Mejorar esta pregunta

¿Cuáles son las mejores prácticas alrededor de la creación de estructuras de base de datos de archivos planos en PHP?

Muchos marcos de archivo PHP más madurados que intento implementar la sintaxis de consulta similar a SQL, que está en la parte superior para mis propósitos en la mayoría de los casos. (Yo solo usaría una base de datos en ese punto).

¿Hay algún truco elegante para obtener un buen rendimiento y características con un pequeño código de arriba?

Original en ingles

What are the best practices around creating flat file database structures in PHP?

A lot of more matured PHP flat file frameworks out there which I attempt to implement SQL-like query syntax which is over the top for my purposes in most cases. (I would just use a database at that point).

Are there any elegant tricks out there to get good performance and features with a small code overhead?

</div
           
   
   

Lista de respuestas

77
 
vote
vote
La mejor respuesta
 

Bueno, cuál es la naturaleza de las bases de datos planas. Son grandes o pequeños. ¿Son simples matrices con arreglos en ellos? Si es algo simple, digamos los problemas de usuario construido como tal:

  $user = array("name" => "dubayou",                "age" => 20,               "websites" => array("dubayou.com","willwharton.com","codecream.com"),               "and_one" => "more");   

y para guardar o actualizar el registro DB para ese usuario.

  $dir = "../userdata/";  //make sure to put it bellow what the server can reach. file_put_contents($dir.$user['name'],serialize($user));   

y para cargar el registro para el usuario

  function &get_user($name){     return unserialize(file_get_contents("../userdata/".$name)); }   

Pero nuevamente, esta implementación variará en la aplicación y la naturaleza de la base de datos que necesita.

 

Well, what is the nature of the flat databases. Are they large or small. Is it simple arrays with arrays in them? if its something simple say userprofiles built as such:

$user = array("name" => "dubayou",                "age" => 20,               "websites" => array("dubayou.com","willwharton.com","codecream.com"),               "and_one" => "more"); 

and to save or update the db record for that user.

$dir = "../userdata/";  //make sure to put it bellow what the server can reach. file_put_contents($dir.$user['name'],serialize($user)); 

and to load the record for the user

function &get_user($name){     return unserialize(file_get_contents("../userdata/".$name)); } 

but again this implementation will vary on the application and nature of the database you need.

</div
 
 
48
 
vote

Podría considerar sqlite . Es casi tan simple como archivos planos, pero obtiene un motor SQL para consultar. Es funciona bien con PHP también.

 

You might consider SQLite. It's almost as simple as flat files, but you do get a SQL engine for querying. It works well with PHP too.

</div
 
 
       
       
21
 
vote

En mi opinión, usando una "base de datos de archivos planos" en el sentido que está buscando (y la respuesta que ha aceptado) no es necesariamente la mejor manera de recorrer las cosas. En primer lugar, usando serialize() y unserialize() puede causar grandes dolores de cabeza si alguien entra y edita el archivo (puede, de hecho, poner código arbitrario en su "base de datos" a correr 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 ha explotado hasta un punto en el que necesita una base de datos, y estoy pensando "ya sabes, deseo Había escrito esto para que una base de datos comenzara con ", porque la refactorización del código lleva demasiado tiempo y esfuerzo.

De esto, he aprendido que la futura pruebas de mi solicitud es de modo que cuando se hace más grande, no tengo que ir y pasar días. La refactorización es la forma de avanzar. ¿Cómo hago esto?

sqlite. Funciona como base de datos, utiliza SQL, y es bastante fácil cambiar a MySQL (¡especialmente si está utilizando clases abstraídas para la manipulación de la base de datos como yo!)

De hecho, especialmente con el método "Respuesta aceptada", puede reducir drásticamente el uso de la memoria de su aplicación (no tiene que cargar todos los "registros" en PHP)

 

In my opinion, using a "Flat File Database" in the sense you're meaning (and the answer you've accepted) isn't necessarily the best way to go about things. First of all, using serialize() and unserialize() can cause MAJOR headaches if someone gets in and edits the file (they can, in fact, put arbitrary code in your "database" to be run each time.)

Personally, I'd say - why not look to the future? There have been so many times that I've had issues because I've been creating my own "proprietary" files, and the project has exploded to a point where it needs a database, and I'm thinking "you know, I wish I'd written this for a database to start with" - because the refactoring of the code takes way too much time and effort.

From this I've learnt that future proofing my application so that when it gets bigger I don't have to go and spend days refactoring is the way to go forward. How do I do this?

SQLite. It works as a database, uses SQL, and is pretty easy to change over to MySQL (especially if you're using abstracted classes for database manipulation like I do!)

In fact, especially with the "accepted answer"'s method, it can drastically cut the memory usage of your app (you don't have to load all the "RECORDS" into PHP)

</div
 
 
     
     
12
 
vote

Un marco que estoy considerando sería para una plataforma de blogs. Dado que casi cualquier otra vista de los datos que desearía, se ordenaría por fecha, estaba pensando en esta estructura:

Un directorio por contenido de contenido:

  ./content/YYYYMMDDHHMMSS/   

subdirectorios de cada nodo incluyendo

  /tags   /authors   /comments     

, así como archivos de texto simples en el directorio del nodo para contenido previo y posgrado y similares.

Esto permitiría un simple PHP glob() Llame (y probablemente una reversión de la matriz de resultados) para consultar casi cualquier cosa dentro de la estructura de contenido:

  sqlite_prepare0  

devolvería las rutas que incluyen todos los artículos etiquetados "graciosos".

 

One framework I'm considering would be for a blogging platform. Since just about any possible view of data you would want would be sorted by date, I was thinking about this structure:

One directory per content node:

./content/YYYYMMDDHHMMSS/ 

Subdirectories of each node including

/tags   /authors   /comments   

As well as simple text files in the node directory for pre- and post-rendered content and the like.

This would allow a simple PHP glob() call (and probably a reversal of the result array) to query on just about anything within the content structure:

glob("content/*/tags/funny");   

Would return paths including all articles tagged "funny".

</div
 
 
9
 
vote

Aquí está el código que utilizamos para Lilina:

  sqlite_prepare111  

Almacena cada entrada como un archivo separado, que encontramos es lo suficientemente eficiente para su uso (no se cargan los datos innecesarios y es más rápido guardar).

 

Here's the code we use for Lilina:

<?php /**  * Handler for persistent data files  *  * @author Ryan McCue <cubegames@gmail.com>  * @package Lilina  * @version 1.0  * @license http://opensource.org/licenses/gpl-license.php GNU Public License  */  /**  * Handler for persistent data files  *  * @package Lilina  */ class DataHandler {     /**      * Directory to store data.      *      * @since 1.0      *      * @var string      */     protected $directory;      /**      * Constructor, duh.      *      * @since 1.0      * @uses $directory Holds the data directory, which the constructor sets.      *      * @param string $directory       */     public function __construct($directory = null) {         if ($directory === null)             $directory = get_data_dir();          if (substr($directory, -1) != '/')             $directory .= '/';          $this->directory = (string) $directory;     }      /**      * Prepares filename and content for saving      *      * @since 1.0      * @uses $directory      * @uses put()      *      * @param string $filename Filename to save to      * @param string $content Content to save to cache      */     public function save($filename, $content) {         $file = $this->directory . $filename;          if(!$this->put($file, $content)) {             trigger_error(get_class($this) . " error: Couldn't write to $file", E_USER_WARNING);             return false;         }          return true;     }      /**      * Saves data to file      *      * @since 1.0      * @uses $directory      *      * @param string $file Filename to save to      * @param string $data Data to save into $file      */     protected function put($file, $data, $mode = false) {         if(file_exists($file) && file_get_contents($file) === $data) {             touch($file);             return true;         }          if(!$fp = @fopen($file, 'wb')) {             return false;         }          fwrite($fp, $data);         fclose($fp);          $this->chmod($file, $mode);         return true;      }      /**      * Change the file permissions      *      * @since 1.0      *      * @param string $file Absolute path to file      * @param integer $mode Octal mode      */     protected function chmod($file, $mode = false){         if(!$mode)             $mode = 0644;         return @chmod($file, $mode);     }      /**      * Returns the content of the cached file if it is still valid      *      * @since 1.0      * @uses $directory      * @uses check() Check if cache file is still valid      *      * @param string $id Unique ID for content type, used to distinguish between different caches      * @return null|string Content of the cached file if valid, otherwise null      */     public function load($filename) {         return $this->get($this->directory . $filename);     }      /**      * Returns the content of the file      *      * @since 1.0      * @uses $directory      * @uses check() Check if file is valid      *      * @param string $id Filename to load data from      * @return bool|string Content of the file if valid, otherwise null      */     protected function get($filename) {         if(!$this->check($filename))             return null;          return file_get_contents($filename);     }      /**      * Check a file for validity      *      * Basically just a fancy alias for file_exists(), made primarily to be      * overriden.      *      * @since 1.0      * @uses $directory      *      * @param string $id Unique ID for content type, used to distinguish between different caches      * @return bool False if the cache doesn't exist or is invalid, otherwise true      */     protected function check($filename){         return file_exists($filename);     }      /**      * Delete a file      *      * @param string $filename Unique ID      */     public function delete($filename) {         return unlink($this->directory . $filename);     } }  ?> 

It stores each entry as a separate file, which we found is efficient enough for use (no unneeded data is loaded and it's faster to save).

</div
 
 
8
 
vote

Si va a usar un archivo plano para persistir los datos, use XML para estructurar los datos. PHP tiene una analizador XML incorporado .

 

If you're going to use a flat file to persist data, use XML to structure the data. PHP has a built-in XML parser.

</div
 
 
     
     
8
 
vote

Imho, tienes dos ... ER, tres opciones si quieres evitar la casa de la casa:

  1. sqlite

Si está familiarizado con PDO, puede instalar un controlador de PDO que admite SQLite. Nunca lo usé, pero he usado PDO una tonelada con MySQL. Voy a darle un tiro en un proyecto actual.

  1. xml

Hecho esto muchas veces por cantidades relativamente pequeñas de datos. XMLReaders es una clase ligera, delante de lectura, de estilo cursor. simplexml hace que sea fácil de leer un documento XML en un objeto que usted Puede acceder al igual que cualquier otra instancia de clase.

  1. json (actualización)

Buena opción para pequeñas cantidades de datos, simplemente lectura / escritura de archivos y JSON_DECODE / JSON_ENCODE. No estoy seguro si PHP ofrece una estructura para navegar por un árbol JSON sin cargarlo todo en la memoria, aunque.

 

IMHO, you have two... er, three options if you want to avoid homebrewing something:

  1. SQLite

If you're familiar with PDO, you can install a PDO driver that supports SQLite. Never used it, but I have used PDO a ton with MySQL. I'm going to give this a shot on a current project.

  1. XML

Done this many times for relatively small amounts of data. XMLReader is a lightweight, read-forward, cursor-style class. SimpleXML makes it simple to read an XML document into an object that you can access just like any other class instance.

  1. JSON (update)

Good option for smallish amounts of data, just read/write file and json_decode/json_encode. Not sure if PHP offers a structure to navigate a JSON tree without loading it all in memory though.

</div
 
 
     
     
7
 
vote

Si desea un resultado legible por humano, también puede usar este tipo de archivo:

  ofaurax|27|male|something| another|24|unknown|| ...   

De esta manera, solo tiene un archivo, puede depurarlo (y arreglarla manualmente) fácilmente, puede agregar campos más adelante (al final de cada línea) y el código PHP es simple (para cada línea, dividirse de acuerdo con |).

Sin embargo, los inconvenientes es que debe analizar todo el archivo para buscar algo (si tiene millones de entrada, no está bien) y debe manejar el separador en los datos (por ejemplo, si el Nick es la guerra | Ordz).

 

If you want a human-readable result, you can also use this type of file :

ofaurax|27|male|something| another|24|unknown|| ... 

This way, you have only one file, you can debug it (and manually fix) easily, you can add fields later (at the end of each line) and the PHP code is simple (for each line, split according to |).

However, the drawbacks is that you should parse the entire file to search something (if you have millions of entry, it's not fine) and you should handle the separator in data (for example if the nick is WaR|ordz).

</div
 
 
7
 
vote

He escrito dos funciones simples diseñadas para almacenar datos en un archivo. Puedes juzgar por ti mismo si es útil en este caso. El punto es guardar una variable PHP (si es una matriz de una cadena o un objeto) en un archivo.

  <?php function varname(&$var) {     $oldvalue=$var;     $var='AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==';     foreach($GLOBALS as $var_name => $value) {         if ($value === 'AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==')         {             $var=$oldvalue;             return $var_name;         }     }     $var=$oldvalue;     return false; }  function putphp(&$var, $file=false)     {     $varname=varname($var);     if(!$file)     {         $file=$varname.'.php';     }     $pathinfo=pathinfo($file);     if(file_exists($file))     {         if(is_dir($file))         {             $file=$pathinfo['dirname'].'/'.$pathinfo['basename'].'/'.$varname.'.php';         }     }     file_put_contents($file,'<?php'." $".$varname.'='.var_export($var, true)."; ");     return true; }   
 

I have written two simple functions designed to store data in a file. You can judge for yourself if it's useful in this case. The point is to save a php variable (if it's either an array a string or an object) to a file.

<?php function varname(&$var) {     $oldvalue=$var;     $var='AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==';     foreach($GLOBALS as $var_name => $value) {         if ($value === 'AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==')         {             $var=$oldvalue;             return $var_name;         }     }     $var=$oldvalue;     return false; }  function putphp(&$var, $file=false)     {     $varname=varname($var);     if(!$file)     {         $file=$varname.'.php';     }     $pathinfo=pathinfo($file);     if(file_exists($file))     {         if(is_dir($file))         {             $file=$pathinfo['dirname'].'/'.$pathinfo['basename'].'/'.$varname.'.php';         }     }     file_put_contents($file,'<?php'." $".$varname.'='.var_export($var, true)."; ");     return true; } 
</div
 
 
 
 
7
 
vote

Este es inspirador como una 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

  - STRUCTURED Regular (table, row, column) format. [DATABASE] /    TX  TableY     _____________________________     |ROW_0 Colum_0 Colum_1 Colum_2|     |ROW_1 Colum_0 Colum_1 Colum_2|     |_____________________________| - FREE More creative data storing. You can store data in any structure you want for each (free) element, its similar to storing an array with a unique "Id". [DATABASE] /    EX  ElementY (ID)     ________________     |Field_0 Value_0 |     |Field_1 Value_1 |     |Field_2 Value_2 |     |________________| recall [ID]: get_free("ElementY") --> array([Field_0]=>Value_0,[Field_1]=>Value_1... - MIXD (Mixed) Mixed databases can store both free elements and tables.If you add a table to a free db or a free element to a structured db, flat fire will automatically convert FREE or SRCT to MIXD database. [DATABASE] /    EX  TY   
 

This one is inspiring as a practical solution:
https://github.com/mhgolkar/FlatFire
It uses multiple strategies to handling data...
[Copied from Readme File]

Free or Structured or Mixed

- STRUCTURED Regular (table, row, column) format. [DATABASE] /    TX  TableY     _____________________________     |ROW_0 Colum_0 Colum_1 Colum_2|     |ROW_1 Colum_0 Colum_1 Colum_2|     |_____________________________| - FREE More creative data storing. You can store data in any structure you want for each (free) element, its similar to storing an array with a unique "Id". [DATABASE] /    EX  ElementY (ID)     ________________     |Field_0 Value_0 |     |Field_1 Value_1 |     |Field_2 Value_2 |     |________________| recall [ID]: get_free("ElementY") --> array([Field_0]=>Value_0,[Field_1]=>Value_1... - MIXD (Mixed) Mixed databases can store both free elements and tables.If you add a table to a free db or a free element to a structured db, flat fire will automatically convert FREE or SRCT to MIXD database. [DATABASE] /    EX  TY 
</div
 
 
5
 
vote

Simplemente señalando un problema potencial con una base de datos de archivos planos con este tipo de sistema:

  data|some text|more data  row 2 data|bla hbalh|more data   

... etc

El problema es que los datos celulares contienen un "|" o un " n", se perderán los datos. A veces sería más fácil dividirse por combinaciones de letras que la mayoría de las personas no usarían.

Por ejemplo:

Splitter de columna: #$% (Shift+345)

Splitter de fila: ^&* (Shift+678)

Archivo de texto: test data#$%blah blah#$%^&*new row#$%new row data 26

Luego use: explode("#$%", $data); use foreach, the explode again to separate columns

o cualquier cosa a lo largo de estas líneas. Además, podría agregar que las bases de datos de archivos planos son buenos para los sistemas con pequeñas cantidades de datos (es decir, menos de 20 filas), pero se convierten en enormes cerdos de memoria para bases de datos más grandes.

 

Just pointing out a potential problem with a flat file database with this type of system:

data|some text|more data  row 2 data|bla hbalh|more data 

...etc

The problem is that the cell data contains a "|" or a " " then the data will be lost. Sometimes it would be easier to split by combinations of letters that most people wouldn't use.

For example:

Column splitter: #$% (Shift+345)

Row splitter: ^&* (Shift+678)

Text file: test data#$%blah blah#$%^&*new row#$%new row data 2

Then use: explode("#$%", $data); use foreach, the explode again to separate columns

Or anything along these lines. Also, I might add that flat file databases are good for systems with small amounts of data (ie. less than 20 rows), but become huge memory hogs for larger databases.

</div
 
 
 
 

Relacionados problema

49  ¿Por qué todavía programamos con archivos planos? [cerrado]  ( Why do we still program with flat files ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

3  ¿Por qué agrega el texto al comienzo de la siguiente línea, y no el final del derecho?  ( Why does it add the text at the beginning of next line and not the end of the r ) 
Solución necesaria: Estoy trabajando con un script PHP simple que debería: Agregar "Value4 :::" Al final de la primera línea en un archivo Agregar ":...

126  Bases de datos de archivos planos [cerrados]  ( Flat file databases ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...

1  Muchos a uno une la ayuda para el archivo plano  ( Many to one join help for flat file ) 
No estoy seguro de si esto ya se ha preguntado, miré un poco por bastante, pero no pude encontrar nada. El resultado final es obtener datos de varias de mis...

2  ¿Cómo puedo recuperar solo las x filas superior de una fila plana en SSIS?  ( How do i retrieve only the top x rows from a flatfile in ssis ) 
Tengo una conexión de FLANFILE y solo estoy interesado en las primeras 10 filas de datos. ¿Cómo puedo importar las primeras 10 filas? El muestreo de fila es a...

6  C #: convertir el Decimal de COMP-3 Embalado al valor legible por humano  ( C convert comp 3 packed decimal to human readable value ) 
Tengo una serie de archivos planos ASCII que entran desde un mainframe para ser procesado por una aplicación C #. Se ha introducido una nueva alimentación con...

1  SSIS - Realice el grupo y cuente con el archivo plano  ( Ssis perform group by and count on flat file ) 
Hago algunas transformaciones y validación en un archivo plano .csv para importar datos. Me gustaría agregar una columna con el número de tiempo que un emplea...

10  SSIS está eliminando un registro en la importación de fuente de archivo plano  ( Ssis is dropping a record on flat file source import ) 
Estoy experimentando un tema muy extraño en SSI (2008). Flujo de trabajo básico es el siguiente ... Usando una fuente de filo plana (CSV), trae a SSIS, pr...

3  ¿Estructura de datos apropiada para el procesamiento de archivos planos?  ( Appropriate data structure for flat file processing ) 
Esencialmente, tengo que obtener un archivo plano en una base de datos. Los archivos planos vienen con los dos primeros caracteres en cada línea que indica qu...

0  Columna de datos de archivo plano SSIS Compare contra el rango de datos de la columna de la tabla  ( Ssis flat file data column compare against tables column data range ) 
Necesito desarrollar un paquete SSIS en el que necesitaré importar / usar un archivo plano (solo tiene 1 columna) para comparar cada fila contra las columnas ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos