2010/8/19 Hugo Sacramento <[email protected]>:
> Olá,
> Estou na dúvida na modelagem de uma tabela que precisa de um campo onde
> possa guardar vários "nomes" pra cada item da tabela.

Não sei exatamente o que quis dizer com "nomes", mas enfim ..

> Normalmente faria uma tabela separada só com os nomes daquele item com uma
> FK como todo mundo já conhece.

s/Normalmente/Corretamente.

Vetores não inutilizam a normalização relacional de dados. Voce
deveria utiliza-los com cautela, em casos específicos.

> Mas percebi que tenho opção de usar array: varchar [ ]
> O legal de usar array é algumas facilidades na query, sem precisar fazer
> join, etc...

Utilizar tipos de dados array podem e vão complicar um pouco a vida do
seu desenvolvedor, dependendo de qual interface ele utiliza para
programar, visto que algumas implementações de frameworks não suportam
a s'ntase de arrays e a utilização de operadores é limitada para este
tipo de dados também.

Restringir esses dados também não é uma operação trivial como seria
com atributos unidimensionais.

> por ex. posso fazer "select nome[0], bla, ble, bli from blablabla..."
> Porém fico na dúvida se isto é realmente aconselhável. Se é certo ou se é
> errado, enfim... o que teriam a me dizer?

Não é errado. Este tipo de dados tem algum uso, embora boa parte,
senão todos, são substituíveis por modelagem relacional, utilizando
operadores relacionais para obtenção dos dados.

Quer um exemplo de uso?

Veja a estrutura de pg_catalog.pg_auth_id, em especial o atributo
rolconfig[]. Percebe que ele é to tipo text array? Nós não temos
nenhuma restrição de unicidade naquele atributo, portanto a minha
aplicação poderia erroneamennte executar o seguinte SQL:

UPDATE pg_authid SET rolconfig = '{work_mem=20MB, work_mem=20MB}';

No caso da modelagem do catálogo do PostgreSQL, este procedimento
realmente não traria conseqüências graves, embora eu desencoraje
realizar qualquer alteração no catálogo do ambiente de produção. No
entanto, dependendo da regra de negócio da sua aplicação, este
comportamento pode ser inesperado e vc pode ter problemas para
contornar isto. Então, eu desaconselharia utilizar tipos dimensionais
nestes casos.

Compreendendo o problema, substituíriamos o array no caso citado pelo
seguinte esquema:

pg_authid {#oid, rolname, ...}

pg_rolconfig {FK pg_authid, name, setting}

PS.: Este exemplo não tem intenção alguma de propor tal alteração no
catálogo do postgres. Foi criado apenas com fins didáticos.

Abraço!

-Leo
-- 
Leonardo Cezar
http://www.aslid.org.br
http://postgreslogia.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a