Bazy danych - string?


(Trzusko) #1

Mam taki maly problem Mianowicie mam takie pytania:

"W temacie "Opis modułu, sposób korzystania i definicje podstawowe" w przykładzie schematu relacji w postaci rozszerzonej o typy danych jeden z tych typów to string."

Czy ktoś ktoś mógłby mi tak logicznie wytłumaczyć co to jest ten string - tylko nie żadna definicja z neta tylko własnymi słowami :slight_smile:

I tak przy okazji jeszcze jedno pytanie co do sumy (unia zbiorów), gdy w dwóch zbiorach znajdują się te same elementy albo, gdy w jednym zbiorze są dwa te same to czy w wyniku sumy wypisuje się tylko jeden raz ten element czy tyle razy ile on występuje w tych zbiorach.

I jeszcze jedno pytanko do iloczynu kartezjańskiego ten pierwszy przykład jest dobrze ?? bo patrząc na oba przykłady jakoś wydaje mi się jakby były inaczej robione, chyba że tego dobrze nie rozumiem ;]


(Ryan) #2

string to ciąg znaków. Aby reprezentować tekst należy zarezerwować miejsce na pewną ilość znaków, które tworzą ciąg znaków (właśnie string). "Zarezerwować" jest tutaj słowem kluczowym, gdyż możesz sobie wyobrazić 3 rodzaje rezerwowania miejsca:

  • zarezerwuj dowolną ilość miejsca - nie wiesz jak głubi będzie string: może 1 znak a może milion

  • zarezerwuj na sztywno pewną ilość znaków (np. 20): jeśli ciąg jest krótszy, wypełnisz pustym znakiem albo spacją, jeśli dłuższy, utniesz

  • zarezerwuj zmienną ilość znaków nie większą niż pewna liczba (np. 20): jeśli ciąg jest dłuższy, przytniesz go

Te trzy schematy mają trzy odpowiadające im typy danych reprezentujących stringi w bazie: text (dowolnie długi tekst), char (tekst o stałej długości, varchar (tekst o zmiennej długości z ograniczeniem).

Dlaczego istnieją takie różnice? Bo zarządzanie tekstem jest trudne. Załóżmy, że w bazie trzymane są tylko teksty z jednej kolumny i że baza wygląda jak zwykły plik tekstowy. Jeśli masz dane o stałej szerokości i chcesz dotrzeć do setnego wpisu, wystarczy tą stałą szerokość pomnożyć przez 100 i voila! wiesz gdzie w pliku są Twoje dane. Ma to jednak wadę - jeśli większość stringów jest krótsza niż przeznaczone na nie miejsce, tracisz bardzo dużo miejsca na puste znaki/spacje. Jeśli ciągi są ograniczone, ale zmiennej długości, nie możesz w łatwy sposób skoczyć do właściwego miejsca. Ale wiedząc, że maksymalna długość to (powiedzmy) 20 a minimalna to zero, możesz starać się zgadnąć gdzie jest setny wpis i jeśli nie trafisz - cofnąć się lub skoczyć do przodu. Z kolei jeśli masz nieograniczoną długoś - nie wiesz nic. :wink: Takie dane składuje się zawsze w osobnym pliku (tzn. baza danych zarządza dla tabeli zawierającej takie dane dwoma plikami - jednym z takimi tekstami, drugim ze wszystkimi innymi danymi). Cały proces jest nacznie bardziej złożony, ale tak w przybliżeniu można go przedstawić.

Co do drugiego pytania: moja pamięć już zardzewiała, ale o ile pamiętam suma nie eliminowała duplikatów. Choć najbezpieczniejszą odpowiedzią pewnie jest: zależy od implementacji. :wink:

Co do iloczynu kartezjańskiego: jaki przykład? Jeśli pytasz o różnicę sumy i iloczynu, to jest oczywista:

A = {1, 2}

B = {3, 4}

Suma: {1, 2, 3, 4}

Iloczyn: {13, 14, 23, 24}