# Ćwiczenia bazy danych - RFE- 27.05
## Zadanie 2
T(Gang, Miasto, Proceder)
`n*m`
T1(Gang, Proceder), T2(Gang, Miasto)
`n+m`
## Zadanie 3
### Rozwiązanie
---
**Proponowany rozkład bazy**
$(Gang,\ Szef)$
$(Gang,\ Dochód)$
$(Proceder,\ ROI)$
$(Gang,\ Miasto)$
$(Gang,\ Proceder)$
---
**Dlaczego rozkład jest odwracalny**
#### Lemat nr 1 z wykładu
Niech $R$ będzie relacją i $F$ jej zbiorem zależności funkcyjnych. Jeżeli zależność $(\alpha → \beta) \in F^{+}$ jest nietrywialna, to rozkład $R$ na $R_{1} = \alpha\beta$ i $R_{2} = R\setminus\beta$ jest odwracalny.
#### Lemat nr 2 z wykładu
Rozkład $R$ na $R_{1},\ ...\ ,\ R_{k}$ jest odwracalny, jeśli dla każdego poprawnego stanu $r$ zachodzi:
$r=r_{1}⋈r_{2}⋈···⋈r_{k}$
gdzie $r_{i}$ to stan kolumn relacji $R_{i}$
#### Rozkład bazy na podstawie lematu nr 1
$(Miasto,\ Gang,\ Proceder,\ Szef,\ Dochod,\ ROI)$
--- rozkład przez $(Gang→Szef)$ ---
$(Gang,\ Szef)$ i $(Miasto,\ Gang,\ Proceder,\ Dochod,\ ROI)$
--- rozkład przez $(Gang→Dochod)$ ---
$(Gang,\ Szef)$, $(Gang,\ Dochod)$ i $(Miasto,\ Gang,\ Proceder,\ ROI)$
--- rozkład przez $(Proceder→ROI)$ ---
$(Gang,\ Szef)$, $(Gang,\ Dochod)$, $(Proceder,\ ROI)$ i $(Miasto,\ Gang,\ Proceder)$
Teraz zastanówmy się nad relacją $(Miasto,\ Gang,\ Proceder)$. Ponieważ wiemy, że "jeśli gang uprawia jakiś proceder to uprawia go we wszystkich miastach, w których jest obecny, a jeśli jest obecny w jakimś mieście to uprawia w nim wszystkie procedery, które uprawia gdziekolwiek", to na mocy lematu nr 2 $(Miasto,\ Gang,\ Proceder)$ można rozłożyć na $(Miasto,\ Gang)$ oraz $(Proceder,\ Gang)$, bowiem $(Miasto,\ Gang,\ Proceder) = (Miasto,\ Gang) ⋈ (Proceder,\ Gang)$, niezależnie od stanu relacji.
Zatem zaproponowany rozkład jest odwracalny.
---
**Czy w proponowanym rozkładzie jest redundancja?**
Zależy, jaka jest interpretacja atrybutów.
Jeśli atrybuty Gang oraz Proceder reprezentują niezmienne ID, proponowany rozkład nie ma redundancji.
Jeśli natomiast atrybuty te reprezentują nazwy gangów/procederów, nie ma takiego rozkładu, bo potrzebowalibyśmy jeszcze niezmiennych ID dla gangów i procederów.
## Zadanie 4
**Napisz zapytanie algebry relacji zwracające niepustą odpowiedź wtedy i
tylko wtedy gdy w relacji Mafia naruszona jest zależność funkcyjna Proceder → ROI.**
$$A = \pi_{Proceder,ROI}(Mafia)$$
$$\sigma_{ROI\neq{ROI2}}\biggl(A\bowtie \rho_{Proceder, ROI2}\bigl(A\bigl)\biggl)$$
## Zadanie 5
1.
`Tweet(id, author_id, creation_date, text, retweeted_tweet_id, in_reply_to_tweet_id)`
`User(Id, name, location, description)`
`Hashtag(tag, tweet_id)`
`Mention(tweet_id, mentioned_user_id)`
2.
`Users(id, name, location, description)`
`Tweets(id, author_id, created_at, text)`
`Hashtags(tweet_id, hashtag)`
`Mentions(tweet_id, user_id)`
`Retweets(tweet_id, retweeted_tweet_id)`
`Replies(tweet_id, in_reply_to_tweet_id)`
3.
Authors:
| *author_id* | author_name | author_description |
| -------- | -------- | -------- |
| int | text | text |
Tweets:
| *tweet_id* | author_id | created_at | text | author_location |
| ---------- | --------- | ---------- | ---- | --------------- |
| int | int | timestamp | text | text |
Replies:
| *tweet_id* | in_reply_to_tweet_id |
| -------- | -------- |
| int | int |
Retweets:
| *tweet_id* | retweeted_tweet_id |
| -------- | -------- |
| int | int |
Mentioned:
| *tweet_id* | *mentioned* |
| -------- | -------- |
| int | text |
Hashtags:
| *tweet_id* | *hashtag* |
| -------- | -------- |
| int | text |
Zależność funkcyjna: {author_id} -> {author_name, author_description}
Kluczem jest tweet_id zatem podana baza jest w BCNF-ie. Jednak jest kilka rzeczy, które należałoby zmienić. Informacje o autorach przenosimy do osobnej tabeli, żeby nie trzymać ich niepotrzebnie po kilka razy(i wynika to też zależności funkcyjnej). Zakładam, że author_location może być różne dla różnych postów tego samego autora.Tworzymy tabele Replies i Retweets - nie każdy post musi nimi być - tym samym unikamy Nulli. Hashtagi i wspominki są przechowywane w formie tabeli - na takich wartościach atrybutów nie pracuje się szybko i wygodnie. Możemy te informacje przechowywać w tablicach tak jak teraz lub (co chyba jest lepszą opcją)- rozbić do wartości atomowych - zgodne z 1NF, powinniśmy stworzyć trigery, które będą pilnowały przechowywanych tam wartości. Wtedy kluczami będą odpowiednio {tweet_id, mentioned} i {tweet_id, hashtag} (zakładam że nikt nie dodaje kilkukrotnie takiego samego hashtagu i nie wspomina jednej kilka razy w tym samym poście).
# Zadanie 6 #
**6.1**
S(F,M,R)
Założenie: $F→→M$
W tabeli S, która spełnia $F→→M$ są:
$(x,m,r)$
$(x,m',r')$
$(x, m, r')$
$(x, m', r)$
Kontrprzykład :+1: :+1:
$T_{1}$: $F_{1}$, M$_{1}$, R
$T_2$ : $F_{1}$, M$_{2}$, R
T : $F_{1}$, $M_{1}$, R
**6.2**
Założenie : $F → M$
Weźmy dwie dowolne krotki T$_{1}$ i T$_{2}$ które zgadzają się na F. Zgodnie z założeniem będą się też zgadzały na M. Zatem nasze T$_{1}$ będzie wyglądać tak:
T$_{1}$ : F$_{1}$, M$_{1}$, R$_{1}$ natomiast T$_{2}$ : F$_{1}$,M$_{1}$, R$_{2}$. Teraz widzimy że naszą krotką T która będzie spełniała zadanie jest po prostu T$_{2}$. c