Επίπεδη βάση δεδομένων του αρχείου

ψήφοι
101

Ποιες είναι οι βέλτιστες πρακτικές γύρω από τη δημιουργία επίπεδες δομές δεδομένων του αρχείου στην PHP;

Πολλές από τις πιο ώριμες PHP επίπεδη πλαίσια του αρχείου που βλέπω εκεί έξω προσπαθήσει να εφαρμόσει τη σύνταξη του ερωτήματος SQL-όπως, η οποία είναι πάνω από την κορυφή για τους σκοπούς μου, στις περισσότερες περιπτώσεις (θα χρησιμοποιήσετε μόνο μια βάση δεδομένων σε εκείνο το σημείο).

Υπάρχουν κομψά κόλπα εκεί έξω για να έχουμε καλή απόδοση και τα χαρακτηριστικά με ένα μικρό κώδικα γενικά εκεί;

Δημοσιεύθηκε 01/08/2008 στις 15:19
πηγή χρήστη
Σε άλλες γλώσσες...                            


12 απαντήσεις

ψήφοι
68

Λοιπόν, ποια είναι η φύση των επίπεδων βάσεων δεδομένων. Είναι μεγάλο ή μικρό. Είναι απλό συστοιχίες με συστοιχίες σε αυτά; αν κάτι απλό του λέει 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));
}

αλλά και πάλι αυτή η εφαρμογή θα ποικίλουν σχετικά με την εφαρμογή και τη φύση της βάσης δεδομένων που χρειάζεστε.

Απαντήθηκε 01/08/2008 στις 18:45
πηγή χρήστη

ψήφοι
46

Θα μπορούσε να εξετάσει SQLite . Είναι σχεδόν τόσο απλό όσο επίπεδα αρχεία, αλλά μπορείτε να πάρετε μια μηχανή SQL για την αναζήτηση. Αυτό λειτουργεί καλά με την PHP πάρα πολύ.

Απαντήθηκε 09/08/2008 στις 00:00
πηγή χρήστη

ψήφοι
20

Κατά τη γνώμη μου, χρησιμοποιώντας ένα «Flat αρχείου βάσης δεδομένων» με την έννοια είσαι δηλαδή (και η απάντηση που έχετε αποδεχτεί) δεν είναι 'ανάγκη ο καλύτερος τρόπος να πάει για τα πράγματα. Πρώτα απ 'όλα, τη χρήση serialize()και unserialize()μπορεί να προκαλέσει σοβαρά πονοκεφάλους, αν κάποιος παίρνει και επεξεργάζεται το αρχείο (που μπορεί, στην πραγματικότητα, να θέσει arbritrary κώδικα σε «βάση δεδομένων» σας να τρέχει κάθε φορά.)

Προσωπικά, θα ήθελα να πω - γιατί να μην κοιτάξουμε προς το μέλλον; Υπήρξαν τόσες πολλές φορές που είχα προβλήματα, διότι έχω τη δημιουργία του δικού μου «ιδιόκτητο» αρχεία, και το έργο έχει εξερράγη σε ένα σημείο όπου χρειάζεται μια βάση δεδομένων, και σκέφτομαι «ξέρεις, εύχομαι είχα γράψει αυτό για μια βάση δεδομένων για να ξεκινήσει με»- επειδή η refactoring του κώδικα παίρνει πάρα πολύ χρόνο και προσπάθεια.

Από αυτό που έχω μάθει ότι η μελλοντική θωράκιση της αίτησής μου, έτσι ώστε όταν μεγαλώνει, δεν έχω να πάω και να περάσουν τις μέρες refactoring είναι ο τρόπος να πάει προς τα εμπρός. Πώς το κάνω αυτό?

SQLite. Λειτουργεί ως βάση δεδομένων, χρησιμοποιεί SQL, και είναι πολύ εύκολο να αλλάξει πάνω σε MySQL (espescially αν χρησιμοποιείτε αφηρημένες κατηγορίες για χειραγώγηση της βάσης δεδομένων όπως εγώ!)

Στην πραγματικότητα, espescially με την «αποδεκτή απάντηση» 's μέθοδο, μπορεί να μειώσει δραστικά τη χρήση της μνήμης της εφαρμογής σας (δεν χρειάζεται να φορτώσει όλα τα “RECORDS” σε PHP)

Απαντήθηκε 21/09/2008 στις 19:21
πηγή χρήστη

ψήφοι
15

Αυτό είναι αλήθεια. serialize()μπορεί να είναι πολύ χρήσιμη και γι 'αυτό.

Νομίζω ότι το τέχνασμα για να καταλήξουμε σε ένα βιώσιμο σύστημα βρίσκει κάποιο τρόπο με τον δείκτη τους κόμβους δεδομένων χωρίς σκοτώνοντας τον εαυτό σας με την πολυπλοκότητα.

Απαντήθηκε 01/08/2008 στις 15:58
πηγή χρήστη

ψήφοι
11

Ένα πλαίσιο Σκέφτομαι θα είναι για μια πλατφόρμα blogging. Δεδομένου ότι σχεδόν κάθε πιθανή προβολή των δεδομένων που θα θέλατε να ταξινομούνται με βάση την ημερομηνία, σκεφτόμουν για αυτή τη δομή:

Ένας κατάλογος ανά κόμβο περιεχόμενο:

./content/YYYYMMDDHHMMSS/

Υποκαταλόγους του κάθε κόμβου συμπεριλαμβανομένων

/tags  
/authors  
/comments  

Εκτός από απλά αρχεία κειμένου στον κατάλογο κόμβο για πριν και μετά καταστεί το περιεχόμενο και τα παρόμοια.

Αυτό θα επιτρέψει ένα απλό PHP glob()κλήση (και πιθανώς μια αντιστροφή της σειράς αποτέλεσμα) το ερώτημα σχετικά με οτιδήποτε μέσα στη δομή του περιεχομένου:

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

Θα επιστρέψει μονοπάτια περιλαμβανομένων όλων των ειδών ετικέτα «αστείο».

Απαντήθηκε 01/08/2008 στις 15:26
πηγή χρήστη

ψήφοι
8

Εδώ είναι ο κώδικας που χρησιμοποιούμε για 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);
    }
}

?>

Αποθηκεύει κάθε καταχώρηση ως ξεχωριστό αρχείο, το οποίο βρήκαμε είναι αρκετά αποτελεσματική για χρήση (όχι περιττά στοιχεία είναι φορτωμένο και είναι πιο γρήγορα για να σώσει).

Απαντήθηκε 28/10/2008 στις 11:45
πηγή χρήστη

ψήφοι
8

Εάν πρόκειται να χρησιμοποιήσετε ένα απλό αρχείο να συνεχιστεί δεδομένων, χρησιμοποιούν XML για τη δομή των δεδομένων. PHP έχει ένα ενσωματωμένο στο πρόγραμμα ανάλυσης XML .

Απαντήθηκε 18/09/2008 στις 07:40
πηγή χρήστη

ψήφοι
7

Έχω γράψει δύο απλές λειτουργίες έχουν σχεδιαστεί για την αποθήκευση δεδομένων σε ένα αρχείο. Μπορείτε να κρίνετε μόνοι σας αν είναι χρήσιμο σε αυτή την περίπτωση. Το θέμα είναι να σώσει μια μεταβλητή php (αν είναι είτε μία συστοιχία ένα string ή ένα αντικείμενο) σε ένα αρχείο.

<?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;
}
Απαντήθηκε 19/12/2012 στις 21:48
πηγή χρήστη

ψήφοι
6

Αυτός είναι εμπνευσμένη ως πρακτική λύση:
https://github.com/mhgolkar/FlatFire
Χρησιμοποιεί πολλαπλές στρατηγικές για το χειρισμό των δεδομένων ...
[Αντιγραφή από Readme Αρχείο]

Δωρεάν ή δομημένη ή 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
Απαντήθηκε 02/05/2013 στις 14:57
πηγή χρήστη

ψήφοι
6

IMHO, έχετε δύο επιλογές, αν θέλετε να αποφύγετε homebrewing κάτι:

  1. SQLite

    Αν είστε εξοικειωμένοι με ΠΟΠ, μπορείτε να εγκαταστήσετε ένα πρόγραμμα οδήγησης ΠΟΠ που υποστηρίζει SQLite. Ποτέ στο παρελθόν, αλλά έχω χρησιμοποιήσει ΠΟΠ έναν τόνο με MySQL. Πάω να δώσει σε αυτό έναν πυροβολισμό σε ένα τρέχον έργο.

  2. XML

    Έγινε πολλές φορές για σχετικά μικρές ποσότητες δεδομένων. XmlReader είναι ένα ελαφρύ, διαβάστε τα εμπρός, κατηγορίας δρομέα στιλ. Simplexml καθιστά απλό να διαβάσει ένα έγγραφο XML σε ένα αντικείμενο που μπορείτε να έχετε πρόσβαση ακριβώς όπως και κάθε άλλη κατηγορία παράδειγμα.

Απαντήθηκε 02/12/2012 στις 16:49
πηγή χρήστη

ψήφοι
6

Αν θέλετε μια αναγνώσιμη από τον άνθρωπο αποτέλεσμα, μπορείτε επίσης να χρησιμοποιήσετε αυτόν τον τύπο αρχείου:

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

Με αυτό τον τρόπο, έχετε μόνο ένα αρχείο, μπορείτε να το διορθώσετε (και με το χέρι να διορθώσετε) εύκολα, μπορείτε να προσθέσετε πεδία αργότερα (στο τέλος της κάθε γραμμής) και ο κώδικας PHP είναι απλό (για κάθε γραμμή, χωρίζονται ανάλογα με |).

Ωστόσο, τα μειονεκτήματα είναι ότι θα πρέπει να αναλύσει το σύνολο του φακέλου για να αναζητήσετε κάτι (αν έχετε τα εκατομμύρια εισόδου, δεν είναι μια χαρά) και θα πρέπει να χειριστεί το διαχωριστικό στα δεδομένα (για παράδειγμα, αν το nick είναι πόλεμος | ordz).

Απαντήθηκε 18/09/2008 στις 08:51
πηγή χρήστη

ψήφοι
4

Απλά δείχνει ένα πιθανό πρόβλημα με μια επίπεδη βάση δεδομένων αρχείο με αυτό το είδος του συστήματος:

data|some text|more data

row 2 data|bla hbalh|more data

...και τα λοιπα

Το πρόβλημα είναι ότι τα δεδομένα κύτταρο περιέχει ένα «|» ή «\ n» τότε τα δεδομένα θα χαθούν. Μερικές φορές θα ήταν ευκολότερο να χωρίσει από τους συνδυασμούς των γραμμάτων που οι περισσότεροι άνθρωποι δεν θα χρησιμοποιήσουν.

Για παράδειγμα:

Στήλη splitter: #$% (Shift+345)

Σειρά splitter: ^&* (Shift+678)

Αρχείο κειμένου: test data#$%blah blah#$%^&*new row#$%new row data 2

Στη συνέχεια, χρησιμοποιήστε: explode("#$%", $data); use foreach, the explode again to separate columns

Ή τίποτα προς αυτή την κατεύθυνση. Επίσης, θα ήθελα να προσθέσω ότι η επίπεδη βάση δεδομένων αρχείων είναι καλό για τα συστήματα με μικρές ποσότητες δεδομένων (δηλ. Λιγότερο από 20 γραμμές), αλλά να γίνει τεράστια γουρούνια μνήμης για τις μεγαλύτερες βάσεις δεδομένων.

Απαντήθηκε 04/01/2013 στις 01:14
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more