Serialized LOB design pattern in PHP

Design Patterns | Stefanescu Mihai | 2023-01-15

Design pattern-ul Serialized LOB (Large Object) este un pattern menit pentru stocarea obiectelor binare mari (BLOB) in baza de date. In loc sa salvam datele BLOB direct in baza de date, acest pattern ne indeamna sa stocam aceste informatii intr-un sistem de storage diferit, de exemplu am putea sa le salvam pe disk sau in cloud, apoi in baza de date sa salvam doar o referinta catre acest BLOB. Astfel putem sa ne scalam sistemul mai bine si sa avem performante mai bune, BLOB-urile putand fi tratate separat fata de baza de date. Acest pattern, de asemenea ajuta la scaderea dimensiunii bazei de date.

Acest design pattern este destul de simplu si cel mai probabil l-ati implementat, intr-o forma sau alta, dar nu stiati cum se numeste.
Un simplu exemplu pentru acest design pattern presupunea indeplinirea urmatorilor pasi:

1.  Upload fisier binar (BLOB, de exemplu o imagine sau un video) pe un serviciu precum Amazon S3 (sau pe disk sau orice alt serviciu de cloud alegi).
2.  Din raspunsul de la S3 luam URL-ul si il salvam in baza noastra de date.
3.  Cand vrei sa folosesti acest fisier, poti lua informatiile de pe disk sau S3 (sau orice alt serviciu ai alege) on the fly.

Iata un simplu exemplu de cod:

/* Upload fisier binar (BLOB, de exemplu o imagine sau un video) pe un serviciu precum Amazon S3 (sau pe disk sau orice alt serviciu de cloud alegi).*/

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1',
    'credentials' => [
        'key'    => 'YOUR_KEY',
        'secret' => 'YOUR_SECRET',
    ],
]);

$result = $s3->putObject([
    'Bucket' => 'my-bucket',
    'Key'    => 'large-file.jpg',
    'Body'   => fopen('path/to/large-file.jpg', 'r'),
    'ACL'    => 'public-read',
]);

/* Din raspunsul de la S3 luam URL-ul si il salvam in baza noastra de date. */
$url = $result->get('ObjectURL');
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password');
$stmt = $pdo->prepare("INSERT INTO files (url) VALUES (:url)");
$stmt->execute(['url' => $url]);

/* Cand vrei sa folosesti acest fisier, poti lua informatiile de pe disk sau S3 (sau orice alt serviciu ai alege) on the fly. */
$stmt = $pdo->prepare("SELECT url FROM files WHERE id = :id");
$stmt->execute(['id' => $file_id]);
$url = $stmt->fetchColumn();
$file_data = file_get_contents($url);

Acesta exemplu de cod este cat se poate de simplist, dar in functie de nevoile pe care le ai in proiectul tau, acest pattern poate fi usor adaptat pentru a ajunge sa implementezi cerinta de business pe care o ai.


Imi place ce faci aici
Daca iti place ce fac aici imi poti cumpara o cafea Buy Me a Coffee at ko-fi.com

Stefanescu Mihai
Programator de ~8 ani, am lucrat la proiecte din mai multe industrstrii, de la eCommerce la telecomunicatii la automatizari. In acest timp am folosi diferite tehnologii, de la PHP, MySQL, PostgreSql, RabbitMq, Redis, Memcached si altele.
       

Get in touch
Pentru nelamuriri, dubii, comentarii si chestii de pe suflet ne putem auzi pe Discord, Reddit sau poti deschide o discutie noua pe forum.

Posteaza un comentariu

Comentarii

Inca nu au fost postate comentarii, fii primul care posteaza un comentariu!

Club-ul este dedicat membrilor si ofera access la mai multe zone ale website-ului.

🗝ïļ Login 🌟 Register

🔖 Bookmarks ⊞
âœĻ Pentru a sustine aceasta comunitate am sa te rog sa te autentifici sau sa te inregistrezi!

🌊ïļ Discord ⊞

Folosim cookie-uri pentru a oferi functionalitatile critice ale aplicatiei Invata-Programare. Folosim cookie-uri si pentru a analiza traficul, pentru care e nevoie de consimtamantul dvs. explicit.

⮆ïļ