복붙노트

[SQL] 플랫 파일 데이터베이스 [마감]

SQL

플랫 파일 데이터베이스 [마감]

PHP에서 플랫 파일 데이터베이스 구조를 만드는 주변에 가장 좋은 방법은 무엇입니까?

나는 대부분의 경우 내 목적을 위해 맨 위에입니다 쿼리 구문 SQL-처럼 구현하려고 시도가 더 많은 성숙 PHP 플랫 파일 프레임 워크의 많은. (난 그냥 그 시점에서 데이터베이스를 사용합니다).

작은 코드 오버 헤드 좋은 성능과 기능을 얻을 거기 어떤 우아한 트릭이 있습니까?

해결법

  1. ==============================

    1.음, 평면 데이터베이스의 본질은 무엇인가. 그들은 크거나 작은 수 있습니다. 그것은 그들의 배열과 간단한 배열인가? 그 뭔가 간단한의 말에 userprofiles 같은 내장 된 경우 :

    음, 평면 데이터베이스의 본질은 무엇인가. 그들은 크거나 작은 수 있습니다. 그것은 그들의 배열과 간단한 배열인가? 그 뭔가 간단한의 말에 userprofiles 같은 내장 된 경우 :

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

    저장하거나 해당 사용자에 대한 DB 레코드를 업데이트합니다.

    $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));
    }
    

    그러나 다시이 구현은 당신이 필요로하는 데이터베이스의 적용과 자연에 달라집니다.

  2. ==============================

    2.당신은 SQLite는 고려할 수 있습니다. 그것은 거의 플랫 파일로 간단하게, 그러나 당신은 쿼리에 대한 SQL 엔진을 얻는다. 너무 PHP와 함께 잘 작동합니다.

    당신은 SQLite는 고려할 수 있습니다. 그것은 거의 플랫 파일로 간단하게, 그러나 당신은 쿼리에 대한 SQL 엔진을 얻는다. 너무 PHP와 함께 잘 작동합니다.

  3. ==============================

    3.제 생각에는, 당신이 의미하고있는 의미 (당신이 수락 한 대답)에서 "플랫 파일 데이터베이스"를 사용하는 것은 굳이 용 것들에 대해 이동하는 가장 좋은 방법은 아닙니다. 누군가에 도착하고 파일을 편집 할 경우, 우선, 직렬화 ()와 때 unserialize ()를 사용하여 주요 두통을 일으킬 수 있습니다 (그들은 사실, 때마다 실행하는 "데이터베이스"에 arbritrary 코드를 넣을 수 있습니다.)

    제 생각에는, 당신이 의미하고있는 의미 (당신이 수락 한 대답)에서 "플랫 파일 데이터베이스"를 사용하는 것은 굳이 용 것들에 대해 이동하는 가장 좋은 방법은 아닙니다. 누군가에 도착하고 파일을 편집 할 경우, 우선, 직렬화 ()와 때 unserialize ()를 사용하여 주요 두통을 일으킬 수 있습니다 (그들은 사실, 때마다 실행하는 "데이터베이스"에 arbritrary 코드를 넣을 수 있습니다.)

    없는 미래를 보는 이유 - 개인적으로, 나는 말할 것? 이 난 내 자신의 "독점"파일을 생성했습니다 때문에이 문제를 했어, 프로젝트는 데이터베이스를 필요로하는 시점에 폭발했다 너무 여러 번 있었다, 그리고 내가 원하는, 당신은 알고 "생각하고 있어요 코드의 리팩토링은 너무 많은 시간과 노력이 필요하기 때문에 - 나는 "로 시작하는 데이터베이스에 대한이 기록 된 것입니다.

    이로부터 나는 그것이 더 큰 오면 내가 가야와 리팩토링 일 낭비하지 않도록 미래가 앞으로 갈 수있는 방법은 내 응용 프로그램입니다 교정 것을 배웠다. 이걸 어떻게해야합니까?

    SQLite는. 그것은 SQL을 사용하여 데이터베이스로 작동하고, MySQL의에 이상 변경 아주 쉽게 (내가처럼 데이터베이스 조작에 대한 추상화 된 클래스를 사용하고 espescially 경우!)

    사실, espescially은 "허용 대답"의 방법으로는 크게 귀하의 응용 프로그램의 메모리 사용량을 줄일 수 있습니다 (당신은 PHP로 모든 "RECORDS"를로드 할 필요가 없습니다)

  4. ==============================

    4.내가 고려하고 하나의 프레임 워크는 블로깅 플랫폼이 될 것입니다. 당신이 날짜별로 정렬 될 싶은 데이터의 가능한 모든보기에 대한 때문에,이 구조에 대해 생각했다 :

    내가 고려하고 하나의 프레임 워크는 블로깅 플랫폼이 될 것입니다. 당신이 날짜별로 정렬 될 싶은 데이터의 가능한 모든보기에 대한 때문에,이 구조에 대해 생각했다 :

    컨텐츠 노드 당 하나의 디렉토리 :

    ./content/YYYYMMDDHHMMSS/
    

    를 포함하여 각 노드의 하위 디렉토리

    /tags  
    /authors  
    /comments  
    

    뿐만 아니라 등 사전 및 사후 렌더링 된 내용과의 노드 디렉토리에 간단한 텍스트 파일입니다.

    이것은 단지 내용 구조 내에서 무엇이든에 질의 (아마 그 결과 배열의 반전) 간단한 PHP는 글로브 () 호출을 허용합니다 :

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

    모든 기사는 "재미"태그를 포함하는 경로를 반환합니다.

  5. ==============================

    5.여기에 우리가 Lilina에 사용하는 코드는 다음과 같습니다

    여기에 우리가 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);
        }
    }
    
    ?>
    

    우리가 볼 수있는 별도의 파일, 각 항목이 사용하기에 효율적으로 충분하다 (더 불필요한 데이터가로드되지 않고 더 빠르게 저장하기입니다) 저장합니다.

  6. ==============================

    6.당신이 데이터를 유지하기 위해 플랫 파일을 사용하려고하는 경우, 사용 XML 데이터를 구조화합니다. PHP는 내장 XML 파서 있습니다.

    당신이 데이터를 유지하기 위해 플랫 파일을 사용하려고하는 경우, 사용 XML 데이터를 구조화합니다. PHP는 내장 XML 파서 있습니다.

  7. ==============================

    7.당신은 사람이 읽을 수있는 결과를 원하는 경우에, 당신은 또한이 유형의 파일을 사용할 수 있습니다 :

    당신은 사람이 읽을 수있는 결과를 원하는 경우에, 당신은 또한이 유형의 파일을 사용할 수 있습니다 :

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

    (에 따라, 분할 각 라인 |)이 방법, 당신은 하나 개의 파일을 가지고, 당신은 쉽게, 당신은 (각 행의 끝에서) 나중에 필드를 추가 할 수 있습니다 그것은 (수동 수정)를 디버깅 할 수와 PHP 코드는 간단하다.

    그러나 단점은 당신이 뭔가를 검색하기 위해 전체 파일을 구문 분석해야한다 (당신이 항목 수백만이있는 경우, 그것은 잘 아니다)과 (| ordz 닉 전쟁 인 경우, 예를 들어)는 데이터의 구분을 처리해야한다는 것입니다.

  8. ==============================

    8.나는 파일에 데이터를 저장하도록 설계 두 가지 간단한 기능을 작성했습니다. 그것은이 경우에 유용 경우 직접 판단 할 수 있습니다. 포인트는 파일에 (이 중 하나를 배열 문자열 또는 객체의 경우) PHP는 변수를 저장하는 것입니다.

    나는 파일에 데이터를 저장하도록 설계 두 가지 간단한 기능을 작성했습니다. 그것은이 경우에 유용 경우 직접 판단 할 수 있습니다. 포인트는 파일에 (이 중 하나를 배열 문자열 또는 객체의 경우) PHP는 변수를 저장하는 것입니다.

    <?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'."\n\$".$varname.'='.var_export($var, true).";\n");
        return true;
    }
    
  9. ==============================

    9.이것은 하나의 실용적인 솔루션으로 고무되어있다 : https://github.com/mhgolkar/FlatFire 그것은 데이터를 처리하는 여러 전략을 사용하여 ... [추가 정보 파일 복사]

    이것은 하나의 실용적인 솔루션으로 고무되어있다 : https://github.com/mhgolkar/FlatFire 그것은 데이터를 처리하는 여러 전략을 사용하여 ... [추가 정보 파일 복사]

    - 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
    
  10. ==============================

    10.당신이 뭔가를자가 맥주 피하려면 IMHO, 당신은 두 가지 옵션이 있습니다 :

    당신이 뭔가를자가 맥주 피하려면 IMHO, 당신은 두 가지 옵션이 있습니다 :

  11. ==============================

    11.다만 이러한 유형의 시스템과 플랫 파일 데이터베이스와의 잠재적 인 문제를 지적 :

    다만 이러한 유형의 시스템과 플랫 파일 데이터베이스와의 잠재적 인 문제를 지적 :

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

    ...기타

    "|"문제는 셀 데이터가 포함되어 있다는 것입니다 또는 "\ n"은 다음 데이터가 손실됩니다. 때때로 그것은 대부분의 사람들이 사용하지 않을 문자의 조합으로 분할하는 것이 더 쉽습니다.

    예를 들면 :

    열 스플리터 : # $ % (Shift + 345)

    행 스플리터 ^ & * (Shift + 678)

    텍스트 파일 : 테스트 데이터 # $ % 저쩌구 # $ % ^ & * 새 행을 # $ % 새 행 데이터 2

    그런 다음 사용 : ( "# $으로의 %", $ 데이터)를 폭발; 사용 foreach 문은 별도의 컬럼에 다시 폭발

    또는 다음 행과 함께 아무것도. 또한, 나는 더 큰 데이터베이스에 대한 거대한 메모리 돼지를 플랫 파일 데이터베이스가 적은 양의 데이터 (예. 이하 20 행)와 시스템에 좋은 것을 추가 할 수 있지만 될 수 있습니다.

  12. from https://stackoverflow.com/questions/85/flat-file-databases by cc-by-sa and MIT license