Flat Database: Evoluzione per piccoli progetti

21 Feb 2020 | M.A.D.R.

Quante volte abbiamo avuto bisogno di un database per piccoli progetti, e nello spazio gratuito non disponiamo di un blasonato DBMS.

Oggi vediamo insieme come sfruttare la potenzialità di un database su file, meglio conosciuto con il nome di Flat-DB, utilizzando la notazione JSON e un file di indice per le collection.

Partiamo definendo "Collection": Collezione di dati non necessariamente omogenea che afferisce allo stesso spazio di nomi.

Altra piccola astrazione, immaginate una Collection come un Tabella di un classico Database, con alcune piccole differenze.

Non ho capito nulla... Ossia?

Semplicemente immaginiamo di avere una pagina "HTML" (lasciatemi passare questa forzatura), e che i dati vengono prelevati da una base dati.

Esattamente in questo scenario possiamo scindere le varie pagine in questo modo:

  • Home -> Collection Page
  • Chi Siamo -> Collection Page
  • Contatti -> Collection Page
  • Articoli -> Collection Articoli

Come possiamo notare, data la forzatura di separare gli articoli dalle pagine altrimenti non avrebbe avuto senso, possiamo notare che tre pagine faranno parte della Collection Page mentre il repository di Articoli ha una Collection Separata appunto chiamata Articoli.

Questa è solo una divisione logica, andiamo più nel dettaglio immaginiamo la struttura dei dati della Home.

  • title:''
  • descrizione:''
  • corpo_testo:''
  • slideshow:[],
  • testo_agg1:'',
  • testo_agg3:
  • ...... e così via.

NB: Se avessimo un classico database tutte le altre pagine afferenti alla collection "PAGE" dovranno avere questi "campi" anche se non valorizzati.

La bellezza della notazione JSON è la mancata strutturazione fisica dell'oggetto, possiamo quindi sbizzarrirci con le proprietà che comporranno la nostra base dati.

Nello specifico nel Documento "Chi Siamo" della Collection Page, potremmo aggiungere (a nostro piacimento) "chiavi" e/o "proprietà" che saranno trattate solo dalla pagina incriminata.

Dopo questo piccolo e doveroso preambolo, noteremo sicuramente delle affinità su quanto citato con i DB NO-SQL, che seppur documentali necessitano di un motore su cui far girare il tutto.

La "libreria" di questo articolo, NON fa nessun uso di motori DB, lasciando al programmatore l'onere di aggiustare il tiro come meglio crede.

La Struttura

La nostra libreria si presenta in modo semplice e senza fronzoli.

  • Dir -> classes ossia il core della nostra libreria
  • Dir -> db, ogni cartella rappresenta una collection con all'interno "N" file rappresentanti i documenti. Sempre in questa directory notiamo un file indx.fdba, ossia il file indice delle collection.
  • Dir -> facades, facciata dell'applicazione.
  • Dir -> traits, ext class.

Abbiamo omesso sia autoload che configs in quanto autoparlanti.

NB:Questa libreria fa uso dell'helper string reperibile qui.

Vediamo alcune righe di codice, nello specifico la nostra facade...

include_once FLAT_DB_ROOT.'/classes/Flatdb.php';
include_once FLAT_DB_ROOT.'/classes/CrudDB.php';
include_once FLAT_DB_ROOT.'/traits/FlattenTraits.php';
include_once FLAT_DB_ROOT.'/configs.php';
use MadiFDBA\CrudDB;
class FlattenDB {
	use FlattenTraits;
	private $flatDB;
	private $collection='';
	private $where=[];
	private $orderBY=[];
	public function __construct($opts=[]) {
		$this->flatDB=new CrudDB($opts);
	}
	public static function getInstance($options=[]){
		(empty($options))?$options=getDataFlattendDB():null;
		return (new self($options));
	}
}

La nostra facciata verso le operazioni del nostro FlatDB.

Il nostro file config.php

define('FLAT_DB_ROOT',__DIR__);
function getDataFlattendDB(){
	$flat_db['store_path']=__DIR__.'/db/';
	$flat_db['extension']='.fdba';
	$flat_db['store_index_path']=__DIR__.'/db/';
	$flat_db['index_data_name']='indx';
	$flat_db['data_indexed']=true;
//accept only json - array (serialize)
	$flat_db['mode']='json';
	return $flat_db;
}

A breve il link per scaricare il pacchetto zip!

Soluzioni complete per ogni esigenza