2011-07-27 8 views
21

Me parece que la funcionalidad del tipo de datos de matriz PostgreSQL se superpone mucho con las relaciones estándar de uno a muchos y de muchos a muchos.¿Cuáles son los casos de uso adecuados para el tipo de datos de matriz PostgreSQL?

Por ejemplo, una tabla llamada usuarios podría tener un campo de matriz llamado "favorite_colors", o podría haber una tabla separada llamada "favorite_colors" y una tabla de unión entre "users" y "favorite_colors".

¿En qué casos es correcto utilizar el tipo de datos de matriz en lugar de una combinación completa?

Respuesta

18

Una matriz no debe usarse de forma similar a una relación. Más bien debería contener valores indexados que se relacionan con una fila muy estrechamente. Por ejemplo, si tiene una tabla con los resultados de un partido de fútbol, ​​de lo que no tendría que hacer

id team1 team2 goals1 goals2 

pero haría

id team[2] goals[2] 

Debido a que en este ejemplo, la mayoría también consideraría la normalización de este en dos mesas sería tonto.

Así que, en general, lo usaría en casos en los que no esté interesado en hacer relaciones y en los que usted agregaría campos como field1 field2 field3.

+1

que le daría dos upvotes de esta respuesta si era posible ;-) Otra – Arsen7

+0

ejemplo, relacionado con la traducción basada en máquina. (Más o menos.) Http://stackoverflow.com/q/4967012/562459 –

+0

Si se utiliza un tipo de datos de matriz, ¿cómo extraería fácilmente los datos del rendimiento de un equipo en todas las coincidencias? – hllau

1

The Postgresql documentation gives good examples:

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

El comando anterior creará un SAL_EMP llamado tabla con una columna de texto tipo (nombre), una matriz unidimensional de tipo entero (pay_by_quarter), que representa la el salario del empleado por trimestre, y una matriz bidimensional de texto (programación), que representa el horario semanal del empleado .

O, si lo prefiere:

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

Un caso de uso increíblemente útil está etiquetando:

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

-- Select all posts with tag 'kitty' 
SELECT * FROM posts WHERE tags @> '{kitty}'; 
Cuestiones relacionadas