Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dinamičko unošenje tipova

[es] :: Baze podataka :: Dinamičko unošenje tipova

[ Pregleda: 2297 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.252.119.*



+2790 Profil

icon Dinamičko unošenje tipova24.09.2007. u 14:22 - pre 201 meseci
Zamislite da treba da napravite bazu podataka u kojoj korisnik može u okviru aplikacije da unosi nove (paskalolike) tipove podataka koje će da skladišti. Kako biste to rešili?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.simex-su.co.yu.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: Dinamičko unošenje tipova24.09.2007. u 15:09 - pre 201 meseci
Uzme se drvo parsiranja za definisanje Pascal tipova i za svaki čvor tog drveta se napravi po jedna tabela.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: Dinamičko unošenje tipova25.09.2007. u 00:57 - pre 201 meseci
Da nebude da sam lupio i ostao živ, daću razradu mog predloga.

(Razumevanju onoga što ću prezentovati može da pomogne literatura iz oblasti konstrukcije kompajlera, a pogotovo deo sintaksnog analizatora.)

Znači, korisnik definiše svoje tipove. Definisanje tih novih tipova se mora odvijati po nekim pravilima (Nadam se da nema potrebe objašnjavati zašto pravila moraju da postoje).

Recimo da hoću da dozvolim korisniku da definiše nove nabrojive tipove i nove subrange (ne mogu da se setim srpske reči) tipove. Primer:
Code:

ocene = 1..5
fakultetske_ocene = 6 ..  10
opisne_ocene = (nedovoljan, dovoljan, dobar, vrlo_dobar, odlican)

Moramo formalno postaviti gramatiku (pravila) za pisanja tipova. Pa evo jedne proste EBNF gramatike:
Code:

type-definition = identifier , "=" , type
type            = subrange-type | enumerated-type
subrange-type   = lower-bound , ".." , upper-bound
enumerated-type = "(" , identifier-list , ")" 
identifier-list = identifier { "," , identifier }
lower-bound     = number
upper-bound     = number
identifier      = letter { letter | digit }
number          = [ sign ] digit { digit }
sign            = "+" | "-"
letter          = "_" | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
digit           = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
Ova gramatika je zaista prosta i dozvoljava samo celobrojni prost tip podataka, ali će poslužiti kao primer.

Uvidom u gramatiku pobrojaću sve neterminalne simbole:
type-definition
type
subrange-type
enumerated-type
identifier-list

Izostavio sam simbole koji su isključivo sastavljeni od terminalnih simbola (cifra i slova u ovom slučaju). Izostavio sam ih zato što se oni jasno mogu predstaviti ugrađenim tipovima podataka (identifier je VARCHAR, a number je INTEGER).

Za svaki od pobrojanih neterminalnih simbola pravim po jednu tabelu. Zbog jednostavnosti ću svakoj tabeli dodeliti prost identifikator kao primarni ključ. Dobio sam sliku broj 1. (Slike su prikačene na kraju posta)

Modelu ću dodati one VARCHAR-ove i INTEGER-e od malopre i dobijam sliku broj 2.

Sve te tabele ispovezujem po produkcionim pravilima gramatike i dobijam model na slici broj 3, odnosno dobijamo skriptu:
Code:

CREATE TABLE type_definition (
    tyd_id INTEGER NOT NULL,
    identifier VARCHAR(20) NOT NULL,
    typ_id INTEGER NOT NULL,
  PRIMARY KEY (tyd_id)
);

CREATE TABLE type (
    typ_id INTEGER NOT NULL,
    sut_id INTEGER,
    ent_id INTEGER,
  PRIMARY KEY (typ_id)
);

CREATE TABLE subrange_type (
    sut_id INTEGER NOT NULL,
    lower_bound INTEGER NOT NULL,
    upper_bound INTEGER NOT NULL,
  PRIMARY KEY (sut_id)
);

CREATE TABLE enumerated_type (
    ent_id INTEGER NOT NULL,
  PRIMARY KEY (ent_id)
);

CREATE TABLE identifier_list (
    idl_id INTEGER NOT NULL,
    position INTEGER NOT NULL CHECK (position > 0),
    identifier VARCHAR(20) NOT NULL,
    ent_id INTEGER NOT NULL,
  PRIMARY KEY (idl_id)
);

ALTER TABLE type_definition ADD FOREIGN KEY (typ_id) REFERENCES type (typ_id) ON UPDATE CASCADE;
ALTER TABLE type ADD FOREIGN KEY (sut_id) REFERENCES subrange_type (sut_id) ON UPDATE CASCADE;
ALTER TABLE type ADD FOREIGN KEY (ent_id) REFERENCES enumerated_type (ent_id) ON UPDATE CASCADE;
ALTER TABLE identifier_list ADD FOREIGN KEY (ent_id) REFERENCES enumerated_type (ent_id) ON UPDATE CASCADE;

Ovde treba dodati još nekoliko CHECK ograničenja.
Code:

-- tip je ili prebrojiv ili subrange
ALTER TABLE type ADD CHECK (   (sut_id IS NULL AND ent_id IS NOT NULL)
                            OR (sut_id IS NOT NULL AND ent_id IS NULL));

-- donja granica nesme biti veca od gornje granice kod subrange tipa
ALTER TABLE subrange_type ADD CHECK (lower_bound <= upper_bound);

-- identifikator mora početi sa slovom i da sadrzi samo slova i cifre
-- donji CHECK-ovi koriste regularne izraze i specificni su za PostgreSQL
ALTER TABLE type_definition ADD CHECK (identifier ~ '^[A-Za-z_][A-Za-z0-9_]*$');
ALTER TABLE identifier_list ADD CHECK (identifier ~ '^[A-Za-z_][A-Za-z0-9_]*$');

Ostalo je još da početni primer korisnički definisanih tipova ubacim u ovu strukturu:
Code:

-- ocene = 1..5
INSERT INTO subrange_type (sut_id, lower_bound, upper_bound)
  VALUES (1, 1, 5);
INSERT INTO type (typ_id, sut_id, ent_id)
  VALUES (1, 1, NULL);
INSERT INTO type_definition (tyd_id, identifier, typ_id)
  VALUES (1, 'ocene', 1);

-- fakultetske_ocene = 6 ..  10
INSERT INTO subrange_type (sut_id, lower_bound, upper_bound)
  VALUES (2, 6, 10);
INSERT INTO type (typ_id, sut_id, ent_id)
  VALUES (2, 2, NULL);
INSERT INTO type_definition (tyd_id, identifier, typ_id)
  VALUES (2, 'fakultetske_ocene', 2);
  
-- opisne_ocene = (nedovoljan, dovoljan, dobar, vrlo_dobar, odlican)
INSERT INTO enumerated_type (ent_id)
  VALUES (1);
INSERT INTO identifier_list (idl_id, position, identifier, ent_id)
  VALUES (1, 1, 'nedovoljan', 1);
INSERT INTO identifier_list (idl_id, position, identifier, ent_id)
  VALUES (2, 2, 'dovoljan', 1);
INSERT INTO identifier_list (idl_id, position, identifier, ent_id)
  VALUES (3, 3, 'dobar', 1);
INSERT INTO identifier_list (idl_id, position, identifier, ent_id)
  VALUES (4, 4, 'vrlo_dobar', 1);
INSERT INTO identifier_list (idl_id, position, identifier, ent_id)
  VALUES (5, 5, 'odlican', 1);
INSERT INTO type (typ_id, sut_id, ent_id)
  VALUES (3, NULL, 1);
INSERT INTO type_definition (tyd_id, identifier, typ_id)
  VALUES (3, 'opisne_ocene', 3)

Normalno, da bi se tip kojeg korisnik unosi u Edit kontroli na formi prebacio u ove tabele mora postojati nekakav parser koji to radi. Pisanje ovakvog parsera nije ni malo naivan posao.


Napomena: Imena tabela i kolona nisu baš najsretnije izabrana jer se u njima koristi dosta ključnih reči, ali poenta je prikazana.



[Ovu poruku je menjao chachka dana 25.09.2007. u 02:23 GMT+1]
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
Prikačeni fajlovi
 
Odgovor na temu

mm2000

Član broj: 149978
Poruke: 7
*.bredband.comhem.se.



Profil

icon Re: Dinamičko unošenje tipova25.09.2007. u 18:52 - pre 201 meseci
Serializuj podatke i eventualno enkriptuj sa base64 da bi ih prebacio u tekst. Posle smesti tako "sredjene podatke" u neko text/blob/image polje (zavisi koju bazu koristis).
Losa strana ovoga je sto ne mozes da poredis podatke. Ali posto ce podaci biti razlicitih tipova, nema smisla porediti ih.
 
Odgovor na temu

[es] :: Baze podataka :: Dinamičko unošenje tipova

[ Pregleda: 2297 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.