Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-18 Por tôpico Xisberto
2008/7/16 Luigi Castro Cardeles [EMAIL PROTECTED]:

 Olá,

 a sua dúvida não é pra restringir a coluna cores a somente esses cinco
 valores?


Não, a dúvida não é *como* restringir a coluna cores a estes cinco valores.
O próprio mundo real que o sistema representa já limita isso. São só 5
cores possíveis, então cada carta só poderá ter 5 cores no máximo. Este não
é o problema.

O problema é como represento isso. Gostaria de ter tabelas mais ou menos
assim:

Nome da Carta  | Cores da carta
Teste 1| Branco
Teste 2| Branco, Azul
Teste 3| Preto, Verde, Branco
Teste 4| Branco, Azul, Preto, Vermelho, Verde
Teste 5|

Onde este Teste 5 fosse uma carta que não tem cor, o que também é possível.

Creio que isto possa ser encarado como tags, etiquetas, como as que exitem
nos blogs, no flikr e no del.icio.us.

Na minha primeira mensagem eu descrevi como fiz até agora, mas nem sei se o
modelo que utilizei foi o ideal.

-- 
Humberto Xis
[EMAIL PROTECTED]
http://xisberto.blogspot.com
http://ostelematicos.blogspot.com

Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-18 Por tôpico Leandro DUTRA
2008/7/18 Xisberto [EMAIL PROTECTED]:

 Não, a dúvida não é *como* restringir a coluna cores a estes cinco valores.
 O próprio mundo real que o sistema representa já limita isso. São só 5
 cores possíveis, então cada carta só poderá ter 5 cores no máximo. Este não
 é o problema.

Agora ficou mais claro.


 O problema é como represento isso. Gostaria de ter tabelas mais ou menos
 assim:

 Nome da Carta  | Cores da carta
 Teste 1| Branco
 Teste 2| Branco, Azul
 Teste 3| Preto, Verde, Branco
 Teste 4| Branco, Azul, Preto, Vermelho, Verde
 Teste 5|


Veja, esse pode ser um relatório, mas não é uma boa modelagem.  Não
que seja impossível ou proibido, mas o uso de vários valores numa
tupla dificulta a manipulação e torna a consistência declarativa
praticamente impossível.


 Na minha primeira mensagem eu descrevi como fiz até agora, mas nem sei se o
 modelo que utilizei foi o ideal.

A idéia, que me lembre, foi correta: um cadastro de cartas, outro de
cores, e uma relação intermediária relacionando cartas e cores n:m.
Assim, no teu exemplo acima, a carta 1 teria uma tupla nessa relação
intermediária, a 4 teria cinco, e a 5 nenhuma.

Só questiono o uso de identificadores artificiais como chaves, sendo
que há chaves naturais perfeitamente boas; e o esquema de
internacionalização.


-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-18 Por tôpico Xisberto


 A idéia, que me lembre, foi correta: um cadastro de cartas, outro de
 cores, e uma relação intermediária relacionando cartas e cores n:m.
 Assim, no teu exemplo acima, a carta 1 teria uma tupla nessa relação
 intermediária, a 4 teria cinco, e a 5 nenhuma.


Enquanto a isso está ok. Farei as pesquisas com aquela contrib, tem servido
por enquanto. Com o tempo pesquisarei mais e aprenderei mais sobre isso
tudo.



 Só questiono o uso de identificadores artificiais como chaves, sendo
 que há chaves naturais perfeitamente boas; e o esquema de
 internacionalização.


Na verdade usei essas chaves só por costume, de ver os exemplos sempre
mostrarem. Realmente, as cartas nunca repetem seus nomes em inglês e o nome
já é suficiente para torná-la única.

-- 
Humberto Xis
[EMAIL PROTECTED]
http://xisberto.blogspot.com
http://ostelematicos.blogspot.com

Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-18 Por tôpico Johnny Taylor Faria Chaves
Quoting Leandro DUTRA [EMAIL PROTECTED]:

 2008/7/16 Leandro DUTRA [EMAIL PROTECTED]:
 A idéia geral do modelo parece boa.  Além das notas acima, eu
 verificaria se dá para colocar uma CHECK que limite a cinco o número
 de cores por carta -- creio me lembrar que havia uma restrição
 arbitrária quanto a isso.

 Desculpem a auto-resposta, mas não dá: 'Currently, CHECK expressions
 cannot contain subqueries nor refer to variables other than columns of
 the current row'
 http://www.postgresql.org/docs/8.3/interactive/sql-createtable.html.

 Alguém tem outra idéia de como implementar esse limite?  Um gatilho talvez?


Posso estar sendo simplista (e não li o resto das mensagens, culpa do  
webmail de novo), mas, creio que basta usar chaves naturais na  
tabela de relacionamento que resolve, pelo menos enquanto houver  
apenas 5 cores na tabela de cores :) .
Esta restrição do check é muito irritante, deve haver algum motivo  
(dificuldade) *muito* forte para que ela exista. Com a palavra os que  
participam do desenvolvimento do PG.


 --
 skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
 +55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
 +55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
 +55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Johnny Taylor Faria Chaves - LUN 157066
www.brdados.com.br - [EMAIL PROTECTED]
Eu não posso mais, se você pode, doe sangue!!!

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-18 Por tôpico Leandro DUTRA
2008/7/18 Xisberto [EMAIL PROTECTED]:

 Enquanto a isso está ok. Farei as pesquisas com aquela contrib, tem servido
 por enquanto. Com o tempo pesquisarei mais e aprenderei mais sobre isso
 tudo.

Eu não entendi essa do contrib... li e não entendi.  Talvez tenha
perdido uma mensagem necessária a esse entendimento.


-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-18 Por tôpico Dickson S. Guedes
Leandro DUTRA escreveu:
 2008/7/18 Xisberto [EMAIL PROTECTED]:
   
 Enquanto a isso está ok. Farei as pesquisas com aquela contrib, tem servido
 por enquanto. Com o tempo pesquisarei mais e aprenderei mais sobre isso
 tudo.
 

 Eu não entendi essa do contrib... li e não entendi.  Talvez tenha
 perdido uma mensagem necessária a esse entendimento.

   
Dutra,

Há um email de Osvaldo Kussama sugerindo o uso desta contrib:

Citando-o:
  Dê uma olhada no módulo contrib/tablefunc.
  Creio que a função crosstab é exatamente o que procura.
  http://www.postgresql.org/docs/8.3/interactive/tablefunc.html



[]s
Guedes

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-18 Por tôpico Xisberto
On Fri, Jul 18, 2008 at 1:41 PM, Leandro DUTRA [EMAIL PROTECTED]
wrote:

 2008/7/18 Xisberto [EMAIL PROTECTED]:
 
  Enquanto a isso está ok. Farei as pesquisas com aquela contrib, tem
 servido
  por enquanto. Com o tempo pesquisarei mais e aprenderei mais sobre isso
  tudo.

 Eu não entendi essa do contrib... li e não entendi.  Talvez tenha
 perdido uma mensagem necessária a esse entendimento.


Foi o Osvaldo Rosario que me indicou:

Dê uma olhada no módulo contrib/tablefunc.
Creio que a função crosstab é exatamente o que procura.
http://www.postgresql.org/docs/8.3/interactive/tablefunc.html



-- 
Humberto Xis
[EMAIL PROTECTED]
http://xisberto.blogspot.com
http://ostelematicos.blogspot.com

Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-17 Por tôpico Leandro DUTRA
2008/7/16 Luigi Castro Cardeles [EMAIL PROTECTED]:

 a sua dúvida não é pra restringir a coluna cores a somente esses cinco
 valores?
 vc pode criar um tipo enum com as cores que vc quer.

Boa, não tinha pensado que fossem apenas cinco valores possíveis;
achei que fossem muitas cores, mas cada carta podendo ter apenas
cinco.

Se for isso, a sua é uma solução prática e simples.

Ou, para maior dinamismo, a lista de cores como modelada, apenas com
cinco valores.



-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-17 Por tôpico joao.junior
Posso até estar viajando poderia criar uma function que teria a entrada a 
cor, retornando um boolean, relatando se já existem 5 cores por derterminada 
carta e colocava no check.
- Original Message - 
From: Leandro DUTRA [EMAIL PROTECTED]
To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br
Sent: Wednesday, July 16, 2008 4:12 PM
Subject: Re: [pgbr-geral] Um registro, vários valores (não sei um bom nome 
pra isso)


2008/7/16 Leandro DUTRA [EMAIL PROTECTED]:
 A idéia geral do modelo parece boa.  Além das notas acima, eu
 verificaria se dá para colocar uma CHECK que limite a cinco o número
 de cores por carta -- creio me lembrar que havia uma restrição
 arbitrária quanto a isso.

Desculpem a auto-resposta, mas não dá: 'Currently, CHECK expressions
cannot contain subqueries nor refer to variables other than columns of
the current row'
http://www.postgresql.org/docs/8.3/interactive/sql-createtable.html.

Alguém tem outra idéia de como implementar esse limite?  Um gatilho talvez?

-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral 

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-17 Por tôpico Osvaldo Rosario Kussama
William Leite Araújo escreveu:
Na verdade você não precisaria de nenhum /contrib/ para executar 
 essa operação.
 http://www.postgresql.org/docs/8.3/interactive/sql-createaggregate.html
 
Bastaria criar uma função de /agregação/ para concatenar os 
 valores. Um exemplo:
 
 *CREATE AGGREGATE* txtcat(sfunc=textcat, basetype=text,stype=text);
 
 *SELECT* c.name http://c.name as NomeCarta, 
 trim(txtcat(*COALESCE*(d.name http://d.name||', ',''))', ') as Cores
*FROM* cards c *JOIN* colors_for_cards cc on( c.code= cc.cards) 
 *JOIN* colors d on (cc.colors = d.code))
*GROUP BY* c.code
 


Nessa linha considero mais interessante, e mais genérico, o exemplo 
array_accum.
http://www.postgresql.org/docs/current/interactive/xaggr.html

CREATE AGGREGATE array_accum (anyelement)
(
 sfunc = array_append,
 stype = anyarray,
 initcond = '{}'
);

SELECT attrelid::regclass, array_accum(attname)
 FROM pg_attribute
 WHERE attnum  0 AND attrelid = 'pg_tablespace'::regclass
 GROUP BY attrelid;

attrelid|  array_accum
---+---
  pg_tablespace | {spcname,spcowner,spclocation,spcacl}
(1 row)

SELECT attrelid::regclass, array_accum(atttypid)
 FROM pg_attribute
 WHERE attnum  0 AND attrelid = 'pg_tablespace'::regclass
 GROUP BY attrelid;

attrelid|   array_accum
---+-
  pg_tablespace | {19,26,25,1034}
(1 row)

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Xisberto
Obrigado, Osvaldo! Era exatamente isso!

2008/7/15 Osvaldo Kussama [EMAIL PROTECTED]:

 Em 15/07/08, Xisberto[EMAIL PROTECTED] escreveu:
  Olá a todos.
 
  Tenho pouca experiência com SQL em geral, estou querendo aprender. Acabei
 de
  entrar na lista porque não consigo realizar uma consulta. Não sei nem
 como
  procuro no google pela solução do problema (não sei que palavras-chave
  usar).
 
  Explicando melhor:
 
  Estou fazendo um banco para catalogar coleções de cartas de um jogo.
 Neste
  jogo existem 5 cores e cada carta pode ter entre 0 e 5 cores. Para
  representar isso, após alguma pesquisa, fiz 3 tabelas:
 
  _
  mtg_collection=# \d cards
  Table public.cards
 Column   |  Type  |  Modifiers
 
 ++--
   code   | integer| not null default
  nextval('cards_code_seq'::regclass)
   name   | character varying(100) | not null
   portuguese | character varying(100) |
  Indexes:
  cards_pkey PRIMARY KEY, btree (code)
  cards_name_key UNIQUE, btree (name)
  cards_portuguese_key UNIQUE, btree (portuguese)
 
  _
  mtg_collection=# \d colors
 Table public.colors
 Column   | Type  |   Modifiers
 
 +---+---
   code   | integer   | not null default
  nextval('colors_code_seq'::regclass)
   name   | character varying(15) | not null
   portuguese | character varying(15) | not null
  Indexes:
  colors_pkey PRIMARY KEY, btree (code)
  colors_name_key UNIQUE, btree (name)
  colors_portuguese_key UNIQUE, btree (portuguese)
 
  _
  mtg_collection=# \d colors_for_card
Table public.colors_for_card
   Column |  Type   |   Modifiers
 
 +-+---
   code   | integer | not null default
  nextval('color_for_card_code_seq'::regclass)
   color  | integer |
   card   | integer |
  Indexes:
  color_for_card_pkey PRIMARY KEY, btree (code)
  Foreign-key constraints:
  color_for_card_card_fkey FOREIGN KEY (card) REFERENCES cards(code)
  color_for_card_color_fkey FOREIGN KEY (color) REFERENCES
 colors(code)
 
  Esta terceira tabela serve para relacionar as duas principais. Eu
 gostaria
  de saber se existe como em uma única consulta sql retornar cara carta em
 uma
  linha, listando todas as cores dela.
 
  Não precisa escrever o select aqui, gostaria de sugestões de sintaxe a
 usar
  e de onde pesquisar sobre sintaxe sql.
 


 Dê uma olhada no módulo contrib/tablefunc.
 Creio que a função crosstab é exatamente o que procura.
 http://www.postgresql.org/docs/8.3/interactive/tablefunc.html

 Osvaldo
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Humberto Xis
[EMAIL PROTECTED]
http://xisberto.blogspot.com
http://ostelematicos.blogspot.com

Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Osvaldo Rosario Kussama
Osvaldo Kussama escreveu:
 Em 15/07/08, Xisberto[EMAIL PROTECTED] escreveu:
 Olá a todos.

 Tenho pouca experiência com SQL em geral, estou querendo aprender. Acabei de
 entrar na lista porque não consigo realizar uma consulta. Não sei nem como
 procuro no google pela solução do problema (não sei que palavras-chave
 usar).

 Explicando melhor:

 Estou fazendo um banco para catalogar coleções de cartas de um jogo. Neste
 jogo existem 5 cores e cada carta pode ter entre 0 e 5 cores. Para
 representar isso, após alguma pesquisa, fiz 3 tabelas:

 _
 mtg_collection=# \d cards
 Table public.cards
Column   |  Type  |  Modifiers
 ++--
  code   | integer| not null default
 nextval('cards_code_seq'::regclass)
  name   | character varying(100) | not null
  portuguese | character varying(100) |
 Indexes:
 cards_pkey PRIMARY KEY, btree (code)
 cards_name_key UNIQUE, btree (name)
 cards_portuguese_key UNIQUE, btree (portuguese)

 _
 mtg_collection=# \d colors
Table public.colors
Column   | Type  |   Modifiers
 +---+---
  code   | integer   | not null default
 nextval('colors_code_seq'::regclass)
  name   | character varying(15) | not null
  portuguese | character varying(15) | not null
 Indexes:
 colors_pkey PRIMARY KEY, btree (code)
 colors_name_key UNIQUE, btree (name)
 colors_portuguese_key UNIQUE, btree (portuguese)

 _
 mtg_collection=# \d colors_for_card
   Table public.colors_for_card
  Column |  Type   |   Modifiers
 +-+---
  code   | integer | not null default
 nextval('color_for_card_code_seq'::regclass)
  color  | integer |
  card   | integer |
 Indexes:
 color_for_card_pkey PRIMARY KEY, btree (code)
 Foreign-key constraints:
 color_for_card_card_fkey FOREIGN KEY (card) REFERENCES cards(code)
 color_for_card_color_fkey FOREIGN KEY (color) REFERENCES colors(code)

 Esta terceira tabela serve para relacionar as duas principais. Eu gostaria
 de saber se existe como em uma única consulta sql retornar cara carta em uma
 linha, listando todas as cores dela.

 Não precisa escrever o select aqui, gostaria de sugestões de sintaxe a usar
 e de onde pesquisar sobre sintaxe sql.

 
 
 Dê uma olhada no módulo contrib/tablefunc.
 Creio que a função crosstab é exatamente o que procura.
 http://www.postgresql.org/docs/8.3/interactive/tablefunc.html
 


Complementando:
Aproveitando o mote da discussão sobre a preferência que se deve dar
ao uso de chaves naturais nas tabelas pergunto:
Por que utilizar estas chaves artificiais nestas tabelas?
Seu uso fornece algum ganho ou será justamente o contrário, isto é, 
apenas irão complicar suas queries?

Osvaldo

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Xisberto


 Complementando:
 Aproveitando o mote da discussão sobre a preferência que se deve dar
 ao uso de chaves naturais nas tabelas pergunto:
 Por que utilizar estas chaves artificiais nestas tabelas?
 Seu uso fornece algum ganho ou será justamente o contrário, isto é,
 apenas irão complicar suas queries?

 Osvaldo


Aí é que está, Osvaldo. Eu não sei. E isso que você falou de chaves naturais
e artificiais para mim é grego :P

O que eu quero é: tenho elementos (cartas) que podem ser classificados em,
digamos, etiquetas (cores), que neste caso estão limitadas a 5. Cada carta
pode ter zero, uma, duas, até 5 cores. Não tenho certeza se o método que
estou usando é o melhor para representar isso, se alguém puder dar uma dica,
agradecerei muito!


-- 
Humberto Xis
[EMAIL PROTECTED]
http://xisberto.blogspot.com
http://ostelematicos.blogspot.com

Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Leandro DUTRA
2008/7/16 Osvaldo Rosario Kussama [EMAIL PROTECTED]:
 Por que utilizar estas chaves artificiais nestas tabelas?

Há algumas razões, umas mais, outras menos controversas.

Talvez o uso menos controverso seja a ausência de boas chaves
naturais.  O problema é decidir o que são boas chaves naturais; em
princípio, todas as chaves naturais são boas, e todas as artificiais
são ruins.

O caso é que tem muita gente, principalmente usuários de ORMs, que não
gosta de chaves compostas.  Acha que fica difícil programar.  Eu nunca
usei ORM, nunca senti na pele, e daí vem minha impressão de que muitos
ORMs criam tantos problemas quanto resolvem.

Uma razão válida é, em casos extremos, economia de armazenamento em
chaves estrangeiras.  Imagine uma relação pai com uma chave natural
composta razoável, digamos mais de três atributos; e uma relação filha
com muito mais tuplas, digamos milhões ou dezenas de milhões a mais,
isso rodando num sistema que é gargalo de desempenho.  Nesse caso,
pode ser que, após testes, valha a pena uma chave primária artificial
para emagrecer a tabela filha.

Uma vez cheguei num acordo interessante com uma equipe apaixonada pelo
Hybernate: eu deixava criar chaves artificiais quando as naturais
tinham mais de três atributos.  Doutra vez, tive de aceitar as chaves
artificiais mas lavei as mãos quanto a desempenho e manutenabilidade
(essa palavra existe?) do modelo e da aplicação, e ainda impus chaves
alternativas naturais.

-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Leandro DUTRA
2008/7/16 Xisberto [EMAIL PROTECTED]:
 Aí é que está, Osvaldo. Eu não sei. E isso que você falou de chaves naturais
 e artificiais para mim é grego :P

Puxa, aprenda, ou terá dificuldades sérias para coisas mais sérias!

Basicamente, seus 'code's são chaves artificiais e desnecessárias.
Você poderia deixar os nomes das cartas como chaves primárias e
estrangeiras, assim como os nomes das cores.

Outra coisa é com as traduções.  O correto (pode não lhe ser
conveniente) seria ter tabelinhas à parte com os nomes traduzidos e os
códigos ISO de língua, para dar mais flexibilidade na
internacionalização da base.


 O que eu quero é: tenho elementos (cartas) que podem ser classificados em,
 digamos, etiquetas (cores), que neste caso estão limitadas a 5. Cada carta
 pode ter zero, uma, duas, até 5 cores. Não tenho certeza se o método que
 estou usando é o melhor para representar isso, se alguém puder dar uma dica,
 agradecerei muito!

A idéia geral do modelo parece boa.  Além das notas acima, eu
verificaria se dá para colocar uma CHECK que limite a cinco o número
de cores por carta -- creio me lembrar que havia uma restrição
arbitrária quanto a isso.


 Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1

Gn xi:1 em esperanto?


-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Leandro DUTRA
2008/7/16 Leandro DUTRA [EMAIL PROTECTED]:
 A idéia geral do modelo parece boa.  Além das notas acima, eu
 verificaria se dá para colocar uma CHECK que limite a cinco o número
 de cores por carta -- creio me lembrar que havia uma restrição
 arbitrária quanto a isso.

Desculpem a auto-resposta, mas não dá: 'Currently, CHECK expressions
cannot contain subqueries nor refer to variables other than columns of
the current row'
http://www.postgresql.org/docs/8.3/interactive/sql-createtable.html.

Alguém tem outra idéia de como implementar esse limite?  Um gatilho talvez?

-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Xisberto
2008/7/16 Leandro DUTRA [EMAIL PROTECTED]:

 2008/7/16 Leandro DUTRA [EMAIL PROTECTED]:
  A idéia geral do modelo parece boa.  Além das notas acima, eu
  verificaria se dá para colocar uma CHECK que limite a cinco o número
  de cores por carta -- creio me lembrar que havia uma restrição
  arbitrária quanto a isso.

 Desculpem a auto-resposta, mas não dá: 'Currently, CHECK expressions
 cannot contain subqueries nor refer to variables other than columns of
 the current row'
 http://www.postgresql.org/docs/8.3/interactive/sql-createtable.html.

 Alguém tem outra idéia de como implementar esse limite?  Um gatilho talvez?



Se alguém tiver uma idéia de como implementar, e for simples o suficiente
para dizer aqui, diga. Mas no ambiente em questão este limite de 5 cores não
precisa ser implementado por código, pois neste ambiente só existem 5 cores.




  Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1

 Gn xi:1 em esperanto?


Sim, é a passagem que inicia a história da Torre de Babel.


-- 
Humberto Xis
[EMAIL PROTECTED]
http://xisberto.blogspot.com
http://ostelematicos.blogspot.com

Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico William Leite Araújo
   Na verdade você não precisaria de nenhum *contrib* para executar essa
operação.
http://www.postgresql.org/docs/8.3/interactive/sql-createaggregate.html

   Bastaria criar uma função de *agregação* para concatenar os valores.
Um exemplo:

*CREATE AGGREGATE* txtcat(sfunc=textcat, basetype=text,stype=text);

*SELECT* c.name as NomeCarta, trim(txtcat(*COALESCE*(d.name||', ',''))',
') as Cores
   *FROM* cards c *JOIN* colors_for_cards cc on( c.code= cc.cards)
*JOIN*colors d on (cc.colors = d.code))
   *GROUP BY* c.code


2008/7/16 Leandro DUTRA [EMAIL PROTECTED]:

 2008/7/16 Xisberto [EMAIL PROTECTED]:
   Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
 
  Gn xi:1 em esperanto?
 
  Sim, é a passagem que inicia a história da Torre de Babel.

 Percebi!


 --
 skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
 +55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED][EMAIL PROTECTED]
 +55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
 +55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
William Leite Araújo
Analista de Banco de Dados - QualiConsult
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Leandro DUTRA
2008/7/16 William Leite Araújo [EMAIL PROTECTED]:
Bastaria criar uma função de agregação para concatenar os valores.

Mas para que concatenar valores?

-- 
skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191 ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219 MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-16 Por tôpico Luigi Castro Cardeles
Olá,

a sua dúvida não é pra restringir a coluna cores a somente esses cinco
valores?
vc pode criar um tipo enum com as cores que vc quer.
ou então colocar uns constrains na sua tabela.


[]'s

-- 
Luigi Castro Cardeles
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-15 Por tôpico Xisberto
Olá a todos.

Tenho pouca experiência com SQL em geral, estou querendo aprender. Acabei de
entrar na lista porque não consigo realizar uma consulta. Não sei nem como
procuro no google pela solução do problema (não sei que palavras-chave
usar).

Explicando melhor:

Estou fazendo um banco para catalogar coleções de cartas de um jogo. Neste
jogo existem 5 cores e cada carta pode ter entre 0 e 5 cores. Para
representar isso, após alguma pesquisa, fiz 3 tabelas:

_
mtg_collection=# \d cards
Table public.cards
   Column   |  Type  |  Modifiers
++--
 code   | integer| not null default
nextval('cards_code_seq'::regclass)
 name   | character varying(100) | not null
 portuguese | character varying(100) |
Indexes:
cards_pkey PRIMARY KEY, btree (code)
cards_name_key UNIQUE, btree (name)
cards_portuguese_key UNIQUE, btree (portuguese)

_
mtg_collection=# \d colors
   Table public.colors
   Column   | Type  |   Modifiers
+---+---
 code   | integer   | not null default
nextval('colors_code_seq'::regclass)
 name   | character varying(15) | not null
 portuguese | character varying(15) | not null
Indexes:
colors_pkey PRIMARY KEY, btree (code)
colors_name_key UNIQUE, btree (name)
colors_portuguese_key UNIQUE, btree (portuguese)

_
mtg_collection=# \d colors_for_card
  Table public.colors_for_card
 Column |  Type   |   Modifiers
+-+---
 code   | integer | not null default
nextval('color_for_card_code_seq'::regclass)
 color  | integer |
 card   | integer |
Indexes:
color_for_card_pkey PRIMARY KEY, btree (code)
Foreign-key constraints:
color_for_card_card_fkey FOREIGN KEY (card) REFERENCES cards(code)
color_for_card_color_fkey FOREIGN KEY (color) REFERENCES colors(code)

Esta terceira tabela serve para relacionar as duas principais. Eu gostaria
de saber se existe como em uma única consulta sql retornar cara carta em uma
linha, listando todas as cores dela.

Não precisa escrever o select aqui, gostaria de sugestões de sintaxe a usar
e de onde pesquisar sobre sintaxe sql.

Obrigado pela paciência quem leu até aqui!

-- 
Humberto Xis
[EMAIL PROTECTED]
http://xisberto.blogspot.com
http://ostelematicos.blogspot.com

Sur la tuta tero estis unu lingvo kaj unu parlomaniero. - Gn 11,1
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Um registro, vários valores (n ão sei um bom nome pra isso)

2008-07-15 Por tôpico Osvaldo Kussama
Em 15/07/08, Xisberto[EMAIL PROTECTED] escreveu:
 Olá a todos.

 Tenho pouca experiência com SQL em geral, estou querendo aprender. Acabei de
 entrar na lista porque não consigo realizar uma consulta. Não sei nem como
 procuro no google pela solução do problema (não sei que palavras-chave
 usar).

 Explicando melhor:

 Estou fazendo um banco para catalogar coleções de cartas de um jogo. Neste
 jogo existem 5 cores e cada carta pode ter entre 0 e 5 cores. Para
 representar isso, após alguma pesquisa, fiz 3 tabelas:

 _
 mtg_collection=# \d cards
 Table public.cards
Column   |  Type  |  Modifiers
 ++--
  code   | integer| not null default
 nextval('cards_code_seq'::regclass)
  name   | character varying(100) | not null
  portuguese | character varying(100) |
 Indexes:
 cards_pkey PRIMARY KEY, btree (code)
 cards_name_key UNIQUE, btree (name)
 cards_portuguese_key UNIQUE, btree (portuguese)

 _
 mtg_collection=# \d colors
Table public.colors
Column   | Type  |   Modifiers
 +---+---
  code   | integer   | not null default
 nextval('colors_code_seq'::regclass)
  name   | character varying(15) | not null
  portuguese | character varying(15) | not null
 Indexes:
 colors_pkey PRIMARY KEY, btree (code)
 colors_name_key UNIQUE, btree (name)
 colors_portuguese_key UNIQUE, btree (portuguese)

 _
 mtg_collection=# \d colors_for_card
   Table public.colors_for_card
  Column |  Type   |   Modifiers
 +-+---
  code   | integer | not null default
 nextval('color_for_card_code_seq'::regclass)
  color  | integer |
  card   | integer |
 Indexes:
 color_for_card_pkey PRIMARY KEY, btree (code)
 Foreign-key constraints:
 color_for_card_card_fkey FOREIGN KEY (card) REFERENCES cards(code)
 color_for_card_color_fkey FOREIGN KEY (color) REFERENCES colors(code)

 Esta terceira tabela serve para relacionar as duas principais. Eu gostaria
 de saber se existe como em uma única consulta sql retornar cara carta em uma
 linha, listando todas as cores dela.

 Não precisa escrever o select aqui, gostaria de sugestões de sintaxe a usar
 e de onde pesquisar sobre sintaxe sql.



Dê uma olhada no módulo contrib/tablefunc.
Creio que a função crosstab é exatamente o que procura.
http://www.postgresql.org/docs/8.3/interactive/tablefunc.html

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral