2011-07-27 12 views
21

Wydaje mi się, że funkcjonalność typu danych z PostgreSQL nakłada się na wiele ze standardowymi relacjami jeden do wielu i wiele do wielu.Jakie są właściwe przypadki użycia dla Postaty danych PostgreSQL?

Na przykład tabela o nazwie użytkownicy może mieć pole tablicy o nazwie "ulubione kolory" lub może istnieć oddzielna tabela o nazwie "ulubione kolory" i tabela łączenia między "użytkownikami" i "ulubionymi kolorami".

W jakich przypadkach typ danych tablicy jest w porządku, aby użyć zamiast pełnego łączenia?

Odpowiedz

18

Tablicy nie należy używać podobnie jak relacji. Powinien raczej zawierać indeksowane wartości, które bardzo ściśle odnoszą się do jednego wiersza. Na przykład, jeśli miał tabelę z wynikami meczu piłkarskiego, niż nie musiałby robić

id team1 team2 goals1 goals2 

ale zrobi

id team[2] goals[2] 

Ponieważ w tym przykładzie najbardziej byłoby również rozważyć normalizowanie to na dwie tabele byłoby głupio.

W sumie użyłbym go w przypadkach, gdy nie jesteś zainteresowany nawiązywaniem kontaktów i gdzie inni dodaliby takie pola, jak field1 field2 field3.

+1

dałbym dwa upvotes do tej odpowiedzi, czy to możliwe ;-) – Arsen7

+0

Another przykład dotyczący tłumaczenia maszynowego. (Sort of.) Http://stackoverflow.com/q/4967012/562459 –

+0

Jeśli używany jest typ danych tablicowych, w jaki sposób można łatwo wyodrębnić dane dotyczące wydajności jednego zespołu we wszystkich meczach? – hllau

1

The Postgresql documentation gives good examples:

CREATE TABLE sal_emp (
    name   text, 
    pay_by_quarter integer[], 
    schedule  text[][] 
); 

Powyższe polecenie tworzenia tabeli nazwie sal_emp z kolumną typu tekst (Name), jednowymiarową tablicę typu całkowitą (pay_by_quarter), który reprezentuje pensja pracownika według kwartału, oraz dwuwymiarowa tablica tekstów (harmonogram), która reprezentuje tygodniowy harmonogram pracowniczy dla pracowników .

Lub, jeśli wolisz:

CREATE TABLE tictactoe (
    squares integer[3][3]); 
3

Jeden niezwykle poręczny przypadek użycia jest tagowanie:

CREATE TABLE posts (
    title TEXT, 
    tags TEXT[] 
); 

-- Select all posts with tag 'kitty' 
SELECT * FROM posts WHERE tags @> '{kitty}'; 
Powiązane problemy