PostgreSQL-Binary Large Objects

Introduction

PostgreSQL on olemassa useita tapoja hallita Binary Large Objects (LOB, BLOB):

  1. basic binary data type BYTEA
  2. basic character data type TEXT
  3. Large object (LO) facility ”pg_largeobject”
  4. tietotyyppi DATALINK (that is just spec., ei täytäntöönpanoa)

PostgreSQL tukee myös tallennusjärjestelmää nimeltä ”TOAST” (the Oversized-Attribute Storage Technique), joka tallentaa automaattisesti arvot, jotka ovat suurempia kuin yhden tietokantasivun (tyypillisesti 8 KB), toissijaiselle tallennusalueelle taulukkoa kohti. Tämä määrittelee minkä tahansa sarakkeen / kentän kokorajoituksen 1 gigatavuun.

Tässä muutamia suuria kohteita koskevia suunnittelu-ja toteutuskysymyksiä:

  • onko LO (käsitteellisesti) osa oliota/entiteettiä – tai vain liittyy siihen?
  • miten LO: ta käytetään: koodattuna merkkijonona, tiedostona tai striimattuna?
  • jos sitä ei ole tallennettu taulukkoon, kuka säilyttää LO: n eheyden?

ulkoisten binääritiedostojen tuonti/vienti

käytettäessä BYTEA: ta ja tekstiä (ja XML: ää) yleinen tapa tuoda/viedä ulkoisia tiedostoja on client (esim.Java/Python) tai serverside programms (esim. PL/Python). Ulkoisten tiedostojen käsittely psql: llä on vaikeaa.

KS. Stackexchange: .

BYTEA

BYTEA-tietotyyppi mahdollistaa binääristen merkkijonojen tallentamisen.

  • se säilyttää pöydän sisällä KOHOKKEEN paahtoleivän avulla.
  • se on siten rajoitettu 1 GB
  • tallennustila on oktaalinen ja mahdollistaa ei-tulostettavat merkit (toisin kuin merkkijonot, jotka eivät).
  • input/output formaatti on HEX (kuten PostgreSQL 9.0).

huomautuksia:

  • BYTEA on lähellä SQL-standardin binäärijonotyyppiä ”BLOB”. Bytean tarjoamat funktiot ja operaattorit ovat pääosin samoja, kun taas BYTEAN Hex-syöttömuoto on erilainen.
  • BYTEA on hitaampi pituuksilla >20 MB kuin LO-laitos (sillä ei ole satunnaisliittymiä).

Katso PostgreSQL doc-Binääritietotyypit.

TEXT

Basic data type text it ’ s just here for comparentity. Tämä on muuttuva merkistötyyppi, jonka pituus on rajoittamaton (enintään 1 GB). merkistötyypit mahdollistavat lokaaliasetukset.

se ei ole tavumerkkijono, mutta sitä voi silti käyttää, kun binäärimerkkijono esikäsitellään ja koodataan tulostettavaan muotoon (esim.base64 tai hex).

Large object (lo) facility

Large objects (lo) voidaan sijoittaa myös yhteen järjestelmätaulukkoon nimeltä ”pg_largeobject”, johon on päästävä tietotyypin OID tunnisteiden avulla.

  • on olemassa luku- / kirjoitusrajapinta, joka tarjoaa client (= C-kielellä kirjoitetut moduulit) – ja server-side (= SQL) – funktioita.
  • tärkeimmät SQL-funktiot ovat: lo_creat(), lo_create(), lo_unlink(), lo_import () ja lo_export (). lo_import() ja lo_export () tarvitsevat tietokannan omistavan käyttäjän (eli pääkäyttäjän) oikeudet.
  • LO on jaettu ”paloihin” ja tallennettu btree-indeksoituihin riveihin.
  • LO sallii enintään 2 gigatavun kokoiset arvot, kun taas paahdetut kentät (kuten BYTEA) voivat olla enintään 1 gigatavu.
  • lo-tietueita voidaan satunnaisesti muuttaa käyttämällä luku / kirjoitus-API: a, joka on tehokkaampi kuin tällaisten operaatioiden suorittaminen TOASTILLA (ja esim.BYTEA: lla).

Huom.:

  • kun PostgreSQL doc. mainitaan ”lo” (lo = Suuri objekti) se viittaa tyypillisesti tähän laitokseen.
  • toisin kuin esimerkiksi BYTEA – LO ei ole yksinään tietotyyppi vaan taulukko, ”laitos”.

tärkeä huomautus käytettäessä JDBC BLOB (or @Lob annotation in Hibernate):

  • koska PostgreSQL pitää LO-merkintää omana objektinaan, rivien poistaminen tai kohottaminen käyttäjätaulukossa ei poista tai poista merkintöjä pg_largeobjects-projektissa. pg_largeobjects kasvaa siis äärettömästi, ellei erillistä puhdistusta tehdä (Katso tämä virheraportti Hibernate-foorumilta).
  • tämän estämiseksi on yleensä lisättävä käynnistin, joka poistaa kohdat pg_largeobject descriebd-tiedostona moduulissa ”lo”.
  • KS.PostgreSQL: n lisädokumenteista ” Lo ” ja ”vaccumlo”.

Katso PostgreSQL doc ”Large Objects” ja JDBC datatyyppi BLOB: .

esimerkki: tyypillinen käyttö SQL: ssä (perustuu Postgres Docsiin):

 CREATE TABLE image ( id integer, name text, picture oid ); SELECT lo_creat(-1); -- returns OID of new, empty large object. SELECT lo_create(43213); -- attempts to create large object with OID 43213. SELECT lo_unlink(173454); -- deletes large object with OID 173454. INSERT INTO image (id, name, picture) VALUES (1, 'beautiful image', lo_import('/etc/motd')); INSERT INTO image (id, name, picture) -- same as above, but specify OID to use. VALUES (1, 'beautiful image', lo_import('/etc/motd', 68583)); SELECT lo_export(image.raster, '/tmp/motd') FROM image -- need superuser permission. WHERE name = 'beautiful image';

DATALINK

huomaa: PostgreSQL: ssä ei ole tällä hetkellä toteutusta sille. Se on vain standardin SQL ’SQL/MED’määrittely.

DATALINK-tyyppi tallentaa tiedostojen URL-osoitteet tietokantasarakkeisiin ja asettaa siihen rajoituksia.

  • ylläpitää linkkiä tiettyyn tiedostoon ulkoisessa tallennustilassa.
  • tietokantajärjestelmä ottaa hallintaansa ulkoiset tiedostot (Nimeä uudelleen, poista, käyttöoikeudet tehdään SQL: llä), jos niin on määritelty.
  • Tiedoston koko on rajoittamaton, vastaavasti ulkoisen tallennustilan rajoittama. Ei tarvitse tallentaa tiedoston sisältöä tietokantajärjestelmään.

DATALINKKIPARAMETRIT:

  • ei LINK CONTROL Datalink arvo ei tarvitse viitata olemassa olevaan tiedostoon / URL.
  • FILE LINK CONTROL Datalink value on viitattava olemassa olevaan tiedostoon / URL.
  • eheys kaikki viitatut tiedostot voidaan nimetä uudelleen tai poistaa vain SQL: n kautta.
  • INTEGRITY SELECTIVE Referenced files can be renamed or deleted through SQL or directly.
  • INTEGRITY NONE (implisiittinen ei LINK CONTROL)
  • on UNLINK DELETE File is deleted from file system when deleted from database.
  • on UNLINK palauta tiedoston alkuperäiset oikeudet palautetaan, kun ne poistetaan tietokannasta.
  • on UNLINK NONE Ei muutoksia tiedoston käyttöoikeuksissa, kun tiedostoviite poistetaan tietokannasta.
  • RECOVERY YES PITR koskee viitattuja tiedostoja.
  • RECOVERY NO PITR ei koske viitattuja tiedostoja.

tila ja asennus:

  • epäselvää.

esimerkki:

 CREATE TABLE image ( id integer, name text, picture DATALINK ); INSERT INTO persons VALUES ( 1, 'Jon Doe', DLVALUE('file://some/where/1.jpg') );

linkit:

  • DATALINK wiki page
  • Presentation of Peter Eisentraut, PGCon 2009:
  • MSE-Seminar Thesis (2011) from Florian Schwendener about ”SQL/MED and More – Management of External Data in PostgreSQL and Microsoft SQL Server”:

Vastaa

Sähköpostiosoitettasi ei julkaista.