Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:2009:piw09_des [2009/09/08 21:10] piw09 |
pl:miw:2009:piw09_des [2009/09/10 11:07] piw09 |
Taki sposób operowania na trzech językach jednocześnie jest bardzo wygodny i pozwala na wykonywanie różnych czynności w sposób wyjątkowo szybki i wydajny, pozwalając na maksymalną elastyczność w osiągnięciu zamierzonego celu bądź rozwiązaniu jakiegoś problemu, jako że języki SQL oraz Datalog / Prolog cechują się większą elastycznością w trochę innych obszarach, uzupełniając się wzajemnie. | Taki sposób operowania na trzech językach jednocześnie jest bardzo wygodny i pozwala na wykonywanie różnych czynności w sposób wyjątkowo szybki i wydajny, pozwalając na maksymalną elastyczność w osiągnięciu zamierzonego celu bądź rozwiązaniu jakiegoś problemu, jako że języki SQL oraz Datalog / Prolog cechują się większą elastycznością w trochę innych obszarach, uzupełniając się wzajemnie. |
| |
Co więcej, dzięki temu można | Co więcej, dzięki łatwości w przełączaniu się można bardzo szybko poznać wszystkie trzy języki używane w DES. |
| |
=== 2.3. Pomoc === | === 2.3. Pomoc === |
== 3.1.1. Wnioski == | == 3.1.1. Wnioski == |
| |
Jak widać, język Datalog oferuje maksymalny wachlarz możliwości programowania logicznego, od najprostszych i najpopularniejszych elementów do znacznie bardziej wyrafinowanych i rzadziej stosowanych. | Jak widać, język Datalog oferuje maksymalny wachlarz możliwości programowania logicznego, od najprostszych i najpopularniejszych elementów do znacznie bardziej wyrafinowanych i rzadziej stosowanych. Nie ustępuje tutaj znacznie takim implementacjom jak chociażby SWI. |
| |
=== 3.2. SQL === | === 3.2. SQL === |
| |
{{:pl:miw:2009:3_4_5_2.png|}} | {{:pl:miw:2009:3_4_5_2.png|}} |
| |
| === 3.5. Różnice między Datalogiem i Prologiem === |
| |
| Jest tylko jedna różnica - dotyczy sposobu traktowania wyników zapytań w każdym z tych języków. |
| |
| W Datalogu informacja wyjściowa jest traktowana, podobnie jak w SQL, jako zbiór krotek. |
| W Prologu podejście jest zupełnie inne, podobnego do tego, które znamy z innych implementacji tego języka (np. SWI-Prolog). |
| |
| === 3.6. Wnioski === |
| |
| Elementy wspólne w naturalny sposób unifikują używanie trzech języków w systemie DES, pozwalając na szybkie i intuicyjne korzystanie z systemu. |
| |
===== 4. Porównanie na przykładach ===== | ===== 4. Porównanie na przykładach ===== |
| |
{{:pl:miw:2009:4_4_3.png|}} | {{:pl:miw:2009:4_4_3.png|}} |
| |
| === 4.5. Relacje === |
| |
| Zanalizujmy bardziej złożony przykład, pokazujący jak imitować polecenia SQL za pomocą Datalogu. Będzie to |
| |
| przyklad testujący możliwości DES pod kątem współdziałania różnego rodzaju języków, oraz tego, czy faktycznie |
| |
| można je stosować mniej więcej wymiennie. |
| |
| Przedstawmy polecenia SQL razem z analogami w Datalogu: |
| |
| == Tworzenie tabel i wstawianie wartości == |
| |
| <code>% Najpierw tworzymy tabele |
| create or replace table a(a); |
| create or replace table b(b); |
| create or replace table c(a,b); |
| |
| % Listujemy powyższe zależności |
| /dbschema |
| |
| % Dodajemy rekordy do tabeli |
| insert into a values ('a1'); |
| insert into a values ('a2'); |
| insert into a values ('a3'); |
| insert into b values ('b1'); |
| insert into b values ('b2'); |
| insert into b values ('a1'); |
| insert into c values ('a1','b2'); |
| insert into c values ('a1','a1'); |
| insert into c values ('a2','b2');</code> |
| |
| Odpowiednik w Datalogu, łączący tworzenie tabel oraz wstawianie rekordów: |
| |
| <code>a(a1). |
| a(a2). |
| a(a3). |
| |
| b(b1). |
| b(b2). |
| b(a1). |
| |
| c(a1,b2). |
| c(a1,a1). |
| c(a2,b2).</code> |
| |
| == Projekcja == |
| |
| Kod SQL: |
| |
| <code> |
| % Testujemy operację projekcji |
| select a from c;</code> |
| |
| Kod Datalog: |
| |
| <code>projection(X) :- c(X,Y).</code> |
| |
| == Selekcja z kryterium == |
| |
| Kod SQL: |
| |
| <code>% Selekcja z pewnym kryterium |
| select a from a where a='a2';</code> |
| |
| Kod Datalog: |
| |
| <code>selection(X) :- a(X), X=a2.</code> |
| |
| == Iloczyn kartezjański == |
| |
| Kod SQL: |
| |
| <code>% Iloczyn kartezjański |
| select * from a,b;</code> |
| |
| Kod Datalog: |
| |
| <code>cartesian(X,Y) :- a(X), b(Y).</code> |
| |
| == Inner Join == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu inner join |
| select a from a inner join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>inner_join(X) :- a(X), b(X).</code> |
| |
| == Left Join == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu left join |
| select * from a left join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>left_join(X,Y) :- lj(a(X), b(Y), X=Y).</code> |
| |
| == Right Join== |
| |
| Kod SQL: |
| |
| <code>% złączenie typu right join |
| select * from a right join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>right_join(X,Y) :- rj(a(X), b(Y), X=Y).</code> |
| |
| == Full join == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu full foin |
| select * from a full join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>full_join(X,Y) :- fj(a(X), b(Y), X=Y).</code> |
| |
| == Union == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu unia |
| select * from a union select * from b;</code> |
| |
| Kod Datalog: |
| |
| <code>union(X) :- a(X) ; b(X).</code> |
| |
| == Różnica == |
| |
| Kod SQL: |
| |
| <code>% Testujemy operację select z kryterium różnicy |
| select * from a except select * from b;</code> |
| |
| Kod Datalog: |
| |
| <code>difference(X) :- a(X), not(b(X)).</code> |
| |
| == Relacje w Datalog i SQL == |
| |
| Ważnym aspektem systemu DES jest fakt, iż mimo że polecenia w SQL i Datalog można stosowac wymiennie i przeplatać |
| |
| je ze sobą, to jednak relacji utworzonych w Datalog nie można używać od razu jako tabeli w SQL. |
| |
| Przyjrzyjm się powyższemu kodowi. Załóżmy, że utworzyliśmy w Datalogu relacje: |
| |
| <code>a(a1). |
| a(a2). |
| a(a3)</code> |
| |
| Nie możemy po prostu użyć jej w SQL za pomocą, np., polecenia: |
| |
| <code>/sql select * from a;</code> |
| |
| **Musimy WPIERW utworzyć analogiczną tabelę w SQL:** |
| |
| <code>/sql |
| create table a(a)</code> |
| |
| I dopiero teraz spróbować powyższej operacji. Całość obrazuje poniższy przykład. |
| |
| Zakładamy, że wczytaliśmy już całość powyższego kodu do systemu DES. |
| |
| {{:pl:miw:2009:4_5_1.png|}} |
| |
| ===== 5. Wnioski końcowe ===== |
| |
| System DES jest bardzo skutecznym systemem edukacyjnym, posiadającym liczne walory. Zaliczamy do nich: |
| |
| * Efektywny sposób poznania trzech języków: Datalogu, Prologu i SQL, poprzez możliwość rozwiązywania problemów niemal natychmiast w każdym z trzech języków |
| * Prostota użytkowania |
| * Szeroki wachlarz możliwości w przypadku języka Datalog / Prolog |
| |
| Nawet limitowana implementacja SQL ma swoje zalety - DES ma służyć jako system edukacyjny, a nie typowy transakcyjny DBMS, czyli przede wszystkim powinien być mały i szybki, co byłoby niemożliwe w przypadku pełnej implementacji całego standardu SQL. |