Qual a melhor forma de criar esta tabela?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
givams
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 10 Abr 2012 2:31 pm

Boa tarde, caros colegas,
preciso criar um tabela com os campos ano, mês e valor.
qual a melhor forma de criar esta tabela? de qual forma vou ganhar em desempenho?
assim:

Selecionar tudo

create table RADAR.SAZONALIDADE
(
  ano   VARCHAR2(4) not null,
  mês   VARCHAR2(2) not null,
  valor NUMBER(4,2)
)
add constraint PKANOMES primary key (ANO, mês)
ou

Selecionar tudo

create table RADAR.SAZONALIDADE
(
  ano   VARCHAR2(4) not null,
  janeiro   NUMBER(4,2), 
  fevereiro NUMBER(4,2),
  marco   NUMBER(4,2), 
  abril NUMBER(4,2),
  maio   NUMBER(4,2), 
  junho NUMBER(4,2),
  julho   NUMBER(4,2), 
  agosto NUMBER(4,2),
  setembro   NUMBER(4,2), 
  outubro NUMBER(4,2),
  novembro   NUMBER(4,2), 
  dezembro NUMBER(4,2)
)
add constraint PKANO primary key (ANO)
Lembro que esta tabela será alimentada apenas uma vez por ano, porem seus valores mensais serão utilizados para calculo de metas.

Obrigado,
Givanildo
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5018
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eu certamente não usaria a segunda opção.
Motivo:
* pra somar todo ano ia dar um trabalhão. (teria que somar JANEIRO+FEVEREIRO+MARÇO+etc).
A primeira forma, basta somar tudo pelo ano.
* A linha fica toda bloqueada se alguém está alterando um mês, ou seja, bloqueia o ano inteiro. (você citou que isso não seria problema, pois raramente vai ter alterações). Mesmo assim, é um problema que pode acontecer.
* A primeira tabela funciona pra qualquer idioma, pois os meses são números. É facil de entender seja pra um indiano, chines ou brasileiro. Já a segunda, vai ser meio complicado explicar pra eles o que significa esses nomes "janeiro fevereiro".

E por aí vai.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Givanildo,

Você poderia simplesmente criar ela como:

Selecionar tudo

-- Cria a tabela
CREATE TABLE SAZONALIDADE
(
  DT_SAZONAL DATE NOT NULL,
  VALOR NUMBER(4,2)
);
-- Cria a PK
ALTER TABLE SAZONALIDADE ADD CONSTRAINT PKANOMES PRIMARY KEY (DT_SAZONAL);

-- Cria a CK, que so permite adicionar datas do dia 01 de cada mês/ano
ALTER TABLE SAZONALIDADE ADD CONSTRAINT CK_DIA CHECK (TO_NUMBER(TO_CHAR(DT_SAZONAL,'DD'))=1);
Com isso, você consegue carregar a tabela somente com as datas começando no dia 01 de cada mês/ano;

At.

Coutinho
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes