ফ্ল্যাট ফাইল ডাটাবেস [বন্ধ]


120

পিএইচপি-তে ফ্ল্যাট ফাইল ডাটাবেস স্ট্রাকচার তৈরি করার সর্বোত্তম অনুশীলনগুলি কী কী?

সেখানে অনেক বেশি পরিপক্ক পিএইচপি ফ্ল্যাট ফাইলের ফ্রেমওয়ার্ক রয়েছে যা আমি এসকিউএল-এর মতো কোয়েরি সিনট্যাক্স বাস্তবায়নের চেষ্টা করি যা বেশিরভাগ ক্ষেত্রে আমার উদ্দেশ্যে শীর্ষে রয়েছে। (আমি ঠিক তখনই একটি ডাটাবেস ব্যবহার করব)।

একটি ছোট কোড ওভারহেড সহ ভাল পারফরম্যান্স এবং বৈশিষ্ট্যগুলি পেতে কি কোনও মার্জিত কৌশল আছে?


1
আমি যুক্ত করতে চাই যে এখানে ফ্ল্যাট ফাইল ডাটাবেস github.com/tmarois/Filebase জন্য একটি প্যাকেজ রয়েছে আমি জানি এটি একটি পুরানো প্রশ্ন, তবে এই প্যাকেজটি সর্বাধিক সাম্প্রতিক বিল্ড এবং রক্ষণাবেক্ষণ করা হয়েছে, এছাড়াও বৈশিষ্ট্যগুলিতে সম্পূর্ণরূপে অবহেলিত রয়েছে ।
tmarois

আমি একটি সিএমএস বিকাশ করছি এবং আমি একটি ফ্ল্যাট টেক্সট ফাইল পাঠ্য ডাটাবেস ব্যবহার করি। এটি তৈরি করতে বেশ কয়েক ঘন্টা সময় লেগেছিল এবং রিফ্র্যাকচারে কয়েক ঘন্টা সময় নেয় তবে এটি পুরোপুরি কার্যকর হয়। সম্পূর্ণ ইনডেক্স এবং অপ্টিমাইজড ডাটাবেসের সাহায্যে ক্যোরিগুলি আরও দ্রুত সঞ্চালিত হবে। যাইহোক, আমি মেটা ডেটা সঞ্চয় করে এবং সাবধানে সংগঠন এবং কাঠামো দিয়ে প্রশ্নের প্রয়োজন এড়াচ্ছি। যখন আমার ডেটার দরকার হয়, আমি এটি ছাড়াই for loopপাই (যদি না আমি ফোল্ডারের সমস্ত ডেটা ব্যবহার না করি), সুতরাং এটি ডাটাবেসের চেয়ে অনেক দ্রুত সম্পাদন করে। আমি বিশদে যাব এবং খুব ভাল উত্তর দেব তবে দুর্ভাগ্যক্রমে এই প্রশ্নটি বন্ধ রয়েছে।
ড্যান ব্রে

উত্তর:


75

ঠিক আছে, ফ্ল্যাট ডাটাবেসের প্রকৃতি কী। তারা বড় বা ছোট। এটির মধ্যে সহজ অ্যারেগুলি কী রয়েছে? যদি এর কিছু সাধারণ ব্যবহারকারী প্রোফাইলে যেমন নির্মিত হয় তবে:

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

তবে আবার এই বাস্তবায়ন আপনার প্রয়োজনীয় ডাটাবেসের প্রয়োগ এবং প্রকৃতির ক্ষেত্রে পরিবর্তিত হবে।


48

আপনি এসকিউএলাইট বিবেচনা করতে পারেন । এটি প্রায় সমতল ফাইলগুলির মতো সহজ, তবে আপনি অনুসন্ধানের জন্য একটি এসকিউএল ইঞ্জিন পান। এটি পিএইচপি খুব ভাল কাজ করে।


6
এসকিউএলাইট ডিফল্টরূপে 5.0+ তে নির্মিত হয়েছিল, কিন্তু পিএইচপি 5.4+ থেকে ছাড়! আমি যেমন জুলাই ২০১২ এ লিখি, এসকিউএলাইট আর পূর্বনির্ধারিত সিস্টেমে ডিফল্টরূপে কাজ করবে না। অফিসিয়াল বিবৃতি এখানে
Sliq

আপনার সার্ভার অ্যাক্সেস থাকলে SQLite PDO ড্রাইভার ইনস্টল করা বেশ তুচ্ছ। উবুন্টু / ডেবিয়ান অ্যাপাচি
চালিয়ে

4
@ স্লিকের মন্তব্যের প্রতিক্রিয়া হিসাবে এই বলে যে "এসকিউএলাইট ... বন্ধ ছিল" ধরণের সত্য: "এসকিউএলাইট" নামক এক্সটেনশনটি বন্ধ করে দেওয়া হয়েছিল এবং "এসকিউএলাইট 3" এখন ডিফল্টরূপে সক্ষম হয়েছে। php.net/manual/en/sqlite.installation.php "পিএইচপি 5.0 থেকে এই এক্সটেনশনটি পিএইচপি দিয়ে বান্ডিল করা হয়েছিল। পিএইচপি 5.4 দিয়ে শুরু করে, এই এক্সটেনশানটি কেবলমাত্র পিইসিএল এর মাধ্যমে উপলব্ধ" " php.net/manual/en/sqlite3.installation.php "পিএইচপি 5.3.0 হিসাবে SQLite3 এক্সটেনশনটি ডিফল্টরূপে সক্ষম করা হয়েছে।" "এই এক্সটেনশানটি সংক্ষেপে একটি পিসিএল এক্সটেনশান ছিল তবে সেই সংস্করণটি কেবল পরীক্ষামূলক ব্যবহারের জন্যই প্রস্তাবিত।"
পল ভ্যান লিউউইন

আপনি প্রশ্নের উত্তর দেননি
জেজি ইসতিয়াত

20

আমার মতে, আপনি বোঝাচ্ছেন সেই অর্থে "ফ্ল্যাট ফাইল ডেটাবেস" ব্যবহার করা (এবং আপনি যে উত্তরটি গ্রহণ করেছেন) খুব সহজেই জিনিসগুলি নিয়ে যাওয়ার সেরা উপায় নয়। সবার আগে, ব্যবহার করা serialize()এবং unserialize()যদি ফাইলটি সম্পাদনা করে তবে মেজর মাথা ব্যাথার কারণ হতে পারে (তারা আসলে আপনার "ডাটাবেসে" আরব্রিটরি কোডটি প্রতিবার চালাতে পারে।)

ব্যক্তিগতভাবে, আমি বলব - কেন ভবিষ্যতের দিকে তাকাবেন না? আমি অনেকবার এমন সমস্যার মুখোমুখি হয়েছি কারণ আমি নিজের "মালিকানাধীন" ফাইল তৈরি করে চলেছি, এবং প্রকল্পটি এমন একটি পয়েন্টে বিস্ফোরিত হয়েছে যেখানে এটির একটি ডাটাবেস দরকার, এবং আমি ভাবছি "আপনি জানেন, আমি ইচ্ছা করি "এটি দিয়ে একটি ডেটাবেস শুরু করার জন্য আমি এটি লিখেছিলাম - কারণ কোডটির রিফ্যাক্টরিং অনেক বেশি সময় এবং প্রচেষ্টা নেয়।

এ থেকে আমি শিখেছি ভবিষ্যতে আমার অ্যাপ্লিকেশনটির প্রুফিং করা যাতে এটি বড় হয়ে যায় তখন আমাকে যেতে হবে এবং দিন কাটাতে হবে না oring আমি এটা কিভাবে করবো?

SQLite। এটি একটি ডাটাবেস হিসাবে কাজ করে, এসকিউএল ব্যবহার করে এবং মাইএসকিউএলে রূপান্তর করা বেশ সহজ (যদি আপনি আমার মতো ডাটাবেস ম্যানিপুলেশনের জন্য বিমূর্ত শ্রেণি ব্যবহার করেন তবে স্বতন্ত্র!)

আসলে, "স্বীকৃত উত্তর" এর পদ্ধতির সাথে স্বতঃস্ফূর্তভাবে এটি আপনার অ্যাপ্লিকেশনটির মেমরির ব্যবহারকে মারাত্মকভাবে কাটাতে পারে (আপনাকে সমস্ত "রেকর্ডস" পিএইচপি-তে লোড করতে হবে না)


সেটা সত্য. serialize()পাশাপাশি এটি বেশ কার্যকর হতে পারে। আমি মনে করি একটি কার্যকর সিস্টেমের সাথে আসার কৌশলটি নিজেকে জটিলতার সাথে হত্যা না করে ডেটা নোডগুলিকে সূচকের কোনও উপায় খুঁজে পাচ্ছে।
সন্ত_গ্রোসিওন

12

আমি যে ফ্রেমওয়ার্কটি বিবেচনা করছি তা ব্লগিং প্ল্যাটফর্মের জন্য। যেহেতু আপনি চান ডেটা সম্পর্কে কোনও সম্ভাব্য দৃশ্য তারিখ অনুসারে বাছাই করা হবে, তাই আমি এই কাঠামোটি সম্পর্কে ভাবছিলাম:

সামগ্রী নোড প্রতি এক ডিরেক্টরি:

./content/YYYYMMDDHHMMSS/

সহ প্রতিটি নোডের সাব-ডিরেক্টরিগুলি

/tags  
/authors  
/comments  

পাশাপাশি প্রাক- এবং পোস্ট-রেন্ডারযুক্ত সামগ্রী এবং এর মতো নোড ডিরেক্টরিতে সাধারণ পাঠ্য ফাইল।

এটি একটি সাধারণ পিএইচপি glob()কল (এবং সম্ভবত ফলাফল অ্যারের একটি বিপরীত) বিষয়বস্তু কাঠামোর মধ্যে কিছু সম্পর্কে জিজ্ঞাসা করতে অনুমতি দেবে :

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

"মজার" ট্যাগযুক্ত নিবন্ধ সহ সমস্ত পথ ফিরে আসবে।


9

লিলিনার জন্য আমরা যে কোডটি ব্যবহার করি তা এখানে:

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

?>

এটি প্রতিটি এন্ট্রি পৃথক ফাইল হিসাবে সংরক্ষণ করে, যা আমরা দেখতে পেয়েছি ব্যবহারের জন্য যথেষ্ট দক্ষ (কোনও অপ্রয়োজনীয় ডেটা লোড করা হয়নি এবং এটি সংরক্ষণ করা দ্রুত)।


8

আপনি যদি ডেটা ধরে রাখতে ফ্ল্যাট ফাইল ব্যবহার করতে যাচ্ছেন তবে ডেটা গঠনের জন্য এক্সএমএল ব্যবহার করুন। পিএইচপি -র অন্তর্নির্মিত এক্সএমএল পার্সার রয়েছে


এবং মানব-পঠনযোগ্যতার এক্সএমএল নিয়মগুলি অনুসরণ করুন বা আপনি পাশাপাশি সিরিয়ালাইজেশন বা জেসন বা কিছু ব্যবহার করতে পারেন।
বেন

খুব খারাপ পরামর্শ। এক্সএমএল কখনও ব্যবহার করা উচিত নয়। এটি একটি চর্বি ক্ষয় হয়।
জেজি ইসতিয়াত

@ জিজিস্টিওট কেয়ার আরও ব্যাখ্যা করার জন্য?
আনকচাটটাইপ এরর

7

আপনি যদি কোনও মানব-পঠনযোগ্য ফলাফল চান তবে আপনি এই ধরণের ফাইলও ব্যবহার করতে পারেন:

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

এইভাবে, আপনার কাছে কেবল একটি ফাইল রয়েছে, আপনি এটিকে সহজেই ডিবাগ করতে পারেন (এবং ম্যানুয়ালি ফিক্স করতে পারেন), আপনি পরে ক্ষেত্রগুলি যুক্ত করতে পারেন (প্রতিটি লাইনের শেষে) এবং পিএইচপি কোডটি সহজ (প্রতিটি লাইনের জন্য, | অনুসারে বিভক্ত)।

তবে ত্রুটিগুলি হ'ল কিছু অনুসন্ধান করার জন্য আপনার পুরো ফাইলটি পার্স করা উচিত (যদি আপনার লক্ষ লক্ষ এন্ট্রি থাকে তবে এটি ঠিক নয়) এবং আপনাকে ডেটাতে বিভাজকটি পরিচালনা করতে হবে (উদাহরণস্বরূপ নিকটি যদি ওয়ের | অর্ডজ হয়)।


7

আমি একটি ফাইলে তথ্য সংরক্ষণের জন্য ডিজাইন করা দুটি সাধারণ ফাংশন লিখেছি। এই ক্ষেত্রে যদি এটি কার্যকর হয় তবে আপনি নিজের জন্য বিচার করতে পারেন। বিন্দুটি হ'ল পিএইচপি ভেরিয়েবল (যদি তা হয় কোনও অ্যারে একটি স্ট্রিং বা কোনও অবজেক্ট) কোনও ফাইলে সংরক্ষণ করে।

<?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;
}

আমি এটি আকর্ষণীয় পেয়েছি এবং এটি সর্বোত্তম উপায়, কারণ আমরা কেবল একটি ফর্ম্যাট করা অ্যারেটিকে একটি ফাইলে ডাম্প করি। আমাদের এটি আবার নির্মাণ করার দরকার নেই, কেবল এটি পড়ুন। এছাড়াও, পরিবর্তনগুলি সম্পাদনা করুন এটি কিছুটা সহজ। আমি এটি কখনই বড় ডেটা সঞ্চয় করতে ব্যবহার করব না, তবে আমি এটি ডেটাবেস ছাড়াই প্রোগ্রামের মডিউলগুলি সঞ্চয় করতে ব্যবহারিক বলে মনে করি। ধন্যবাদ.
এম 3 এ

7

এটি একটি ব্যবহারিক সমাধান হিসাবে অনুপ্রেরণামূলক:
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

7

আইএমএইচও, আপনি যদি কিছু হোমব্রাইং এড়াতে চান তবে আপনার কাছে দুটি বিকল্প রয়েছে:

  1. SQLite

    আপনি যদি PDO এর সাথে পরিচিত হন তবে আপনি একটি পিডিও ড্রাইভার ইনস্টল করতে পারেন যা এসকিউএলাইট সমর্থন করে। এটি কখনই ব্যবহার করা হয়নি, তবে আমি মাইএসকিউএল সহ এক টন পিডিও ব্যবহার করেছি। আমি এটি একটি বর্তমান প্রকল্পে একটি শট দিতে যাচ্ছি।

  2. এক্সএমএল

    অপেক্ষাকৃত স্বল্প পরিমাণের ডেটার জন্য এটি বহুবার হয়ে গেছে। এক্সএমএলআডার হ'ল লাইটওয়েট, রিড-ফরোয়ার্ড, কার্সর-স্টাইলের ক্লাস। সিম্পল এক্সএমএল একটি এক্সএমএল ডকুমেন্টকে এমন কোনও অবজেক্টে পড়া সহজ করে তোলে যা আপনি অন্যান্য শ্রেণীর উদাহরণের মতো অ্যাক্সেস করতে পারেন।


5

এই ধরণের সিস্টেম সহ একটি ফ্ল্যাট ফাইল ডাটাবেস নিয়ে কেবল একটি সম্ভাব্য সমস্যাটি দেখানো:

data|some text|more data

row 2 data|bla hbalh|more data

... ইত্যাদি

সমস্যাটি হ'ল সেল ডেটাতে একটি "|" রয়েছে বা একটি "\ n" তখন ডেটা হারিয়ে যাবে। কখনও কখনও চিঠিগুলির সংমিশ্রণ দ্বারা বিভাজন করা সহজ হবে যা বেশিরভাগ লোকেরা ব্যবহার করবেন না।

উদাহরণ স্বরূপ:

কলাম বিভাজন: #$% (Shift+345)

সারি বিভাজন: ^&* (Shift+678)

লেখার ফাইল: test data#$%blah blah#$%^&*new row#$%new row data 2

তারপরে ব্যবহার করুন: explode("#$%", $data); use foreach, the explode again to separate columns

বা এই লাইন বরাবর কিছু। এছাড়াও, আমি যুক্ত করতে পারি যে ফ্ল্যাট ফাইল ডাটাবেসগুলি অল্প পরিমাণে ডেটা (যেমন 20 সারি এর চেয়ে কম) সিস্টেমগুলির জন্য ভাল তবে বড় ডেটাবেসগুলির জন্য বিশাল মেমরি হোগে পরিণত হয়।


ভাল দিক. এইটিকে আরও একধাপ এগিয়ে নিয়ে যাওয়া, পিএইচপি সত্যিই খুব সহজেই JSON কে সিরিয়ালাইজ করতে পারে। এস্কেপিং ইনপুট অনেক সহজ তাই আপনার মজাদার স্ট্রিং সংমিশ্রণগুলি ব্যবহার করার দরকার নেই যাতে ফাইলটি আরও পঠনযোগ্য।
সাইফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.