Базы данных на основе плоских файлов [закрываются]

116
задан meDeepakJain 8 November 2019 в 09:37
поделиться

7 ответов

Ну, какова природа плоских баз данных. Действительно ли они являются большими или маленькими. Это - простые массивы с массивами в них? если что-то простое говорит профили пользователей, созданные как таковой:

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

и сохранить или обновить запись дБ для того пользователя.

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

и загружаться запись для пользователя

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

, но снова эта реализация будет варьироваться на приложении и природе базы данных, в которой Вы нуждаетесь.

74
ответ дан Paul Fleming 24 November 2019 в 02:16
поделиться

Вы могли бы рассмотреть SQLite. Это почти столь же просто как плоские файлы, но Вы действительно получаете механизм SQL для запросов. Это работы хорошо с PHP также.

48
ответ дан yukondude 24 November 2019 в 02:16
поделиться

По-моему, с помощью "Базы данных на основе плоских файлов" в смысле Вы имеете в виду (и ответ, который Вы приняли), не neccesarily лучший способ пойти о вещах. В первую очередь, использование serialize() и unserialize() может вызвать СИЛЬНЫЕ головные боли, если кто-то входит и редактирует файл (они могут, на самом деле, поместить код arbritrary в Вашу "базу данных", которая будет выполнена каждый раз.)

Лично, я сказал бы - почему бы не смотреть в будущее? Были так много раз, что у меня были проблемы, потому что я создавал свои собственные "собственные" файлы, и проект взорвался к точке, где ему нужна база данных, и я думаю, что "Вы знаете, мне жаль, что я не записал это для базы данных для запуска с" - потому что рефакторинг кода занимает слишком много времени и усилия.

От этого я узнал, что, соответствуя требованиям завтрашнего дня мое приложение так, чтобы, когда это становится больше, я не шел и провести дни, осуществляя рефакторинг, является способом продвинуться. Как я делаю это?

SQLite. Это работает базой данных, использует SQL и довольно легко перейти на MySQL (espescially при использовании абстрагированных классов для управления базой данных как, я делаю!)

На самом деле, espescially с "принятым ответом" метод, это может решительно сократить использование памяти Вашего приложения (Вы не должны загружать все "ЗАПИСИ" в PHP)

20
ответ дан Mez 24 November 2019 в 02:16
поделиться

Одна платформа, которую я рассматриваю, была бы для платформы блоггинга. Так как примерно любое возможное представление данных, которые Вы хотели бы, будет отсортировано по дате, я думал об этой структуре:

Один каталог на узел содержания:

./content/YYYYMMDDHHMMSS/

Подкаталоги каждого узла включая

/tags  
/authors  
/comments  

, А также простые текстовые файлы в каталоге узла для пред - и постпредставленное содержание и т.п..

Это позволило бы простому вызову PHP glob() (и вероятно реверсирование массива результата) запрашивать на примерно чем-либо в структуре содержания:

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

Был бы обратные каналы включая все статьи, отмеченные "забавный".

12
ответ дан H. Pauwelyn 24 November 2019 в 02:16
поделиться

Вот код, который мы используем для 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);
    }
}

?>

Это хранит каждую запись как отдельный файл, который мы нашли, достаточно эффективно для использования (никакие ненужные данные не загружаются, и это быстрее для сохранения).

9
ответ дан meagar 24 November 2019 в 02:16
поделиться

Если Вы собираетесь использовать плоский файл для сохранения данных, используйте XML для структурирования данных. PHP имеет встроенный синтаксический анализатор XML .

8
ответ дан Peter Mortensen 24 November 2019 в 02:16
поделиться

Если Вы хотите человекочитаемый результат, можно также использовать этот тип файла:

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

Таким образом, у Вас есть только один файл, можно отладить его (и вручную зафиксировать), легко, можно добавить поля позже (в конце каждой строки), и код PHP прост (для каждой строки, разделенной согласно |).

Однако недостатки состоят в том, что необходимо проанализировать весь файл для поиска чего-то (если у Вас есть миллионы записи, он не прекрасен), и необходимо обработать разделитель в данных (например, если зарубка является WaR|ordz).

7
ответ дан ofaurax 24 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: