[RESOLVIDO] Ajuda com banco de dados - Tabelas


Pessoal, preciso elaborar os relacionamentos e regras de constraint.

Preciso de algumas dicas:

Criando as tabelas, alguém pode me ajudar nas ordem da imagem acima como “Identificá-las” pra começar a fazer as regras de constraint.

CREATE TABLE TAB_BANCO ( ID_BANCO NUMBER(6), NM_BANCO VARCHAR2(60) NOT NULL ); CREATE TABLE TAB_BANCO_AGENCIA ( ID_BANCO NUMBER(6), ID_AGENCIA NUMBER(6), NM_AGENCIA VARCHAR2(60) NOT NULL, NR_DIG_AGENCIA NUMBER(2) NOT NULL, NR_ENDERECO VARCHAR2(15) NOT NULL, ID_CEP CHAR(8) NOT NULL ); CREATE TABLE TAB_CONTA ( ID_CORRENTISTA NUMBER(12), ID_BANCO NUMBER(6), ID_CONTA VARCHAR2(10), ID_AGENCIA NUMBER(6), NR_DIGITO_CONTA CHAR(1 )NOT NULL, ID_TIPO_CONTA NUMBER(6) NOT NULL, CD_TIPO_CORRENTISTA CHAR(1) NOT NULL, VL_SALDO DECIMAL(12,2) NOT NULL ); CREATE TABLE TAB_CORRENTISTA ( ID_CORRENTISTA NUMBER(12), NM_NOME VARCHAR2(90) NOT NULL, DT_NASCIMENTO DATE NOT NULL, DS_SEXO CHAR(1) NOT NULL, NR_NUMERO VARCHAR2(15) NOT NULL, ID_MUNICIPIO NUMBER(6) NOT NULL, ID_CEP CHAR(8) NOT NULL ); CREATE TABLE TAB_ESTADO ( ID_UF CHAR(2), NM_UF VARCHAR2(60) NOT NULL ); CREATE TABLE TAB_LOGRADOURO ( ID_CEP CHAR(8), ID_MUNICIPIO NUMBER(6) NOT NULL, DS_TIPO VARCHAR2(20), DS_TITULO VARCHAR2(20), NM_NOME VARCHAR2(100) NOT NULL ); CREATE TABLE TAB_MUNICIPIO ( ID_MUNICIPIO NUMBER(6), ID_UF CHAR(2) NOT NULL, NM_MUNICIPIO VARCHAR2(60) NOT NULL ); CREATE TABLE TAB_TIPO_CONTA ( ID_TIPO_CONTA NUMBER(6), NM_TIPO_CONTA VARCHAR2(60) NOT NULL );

No seu comando abaixo não vejo nenhuma chave primária.
Para fazer relacionamento é necessário vc definir primeiramente as chaves primárias de sua tabela.
Por exemplo, seguindo a sua ideia na Tabela Banco você terá como chave primária o campo ID_BANCO.
Se sua tabela já estiver criada você poderá usar o comando abaixo para construir suas chaves.
alter table TAB_BANCO
add constraint PK_TAB_BANCO primary key (ID_BANCO).
Assim você pode fazer isso para todas as tabelas.
Entendeu?
Sobre a Foreign Key (Relacionamento) sugiro você primeiramente definir suas chaves primárias antes de relacionar. Pois seguindo sua diagrama acima algumas tabelas não teria como relacionar por não existirem campos em comum.

Olá, steveVai. ótima explicação eu entendi.

Então eu poderia fazer assim sem problema nenhum?

CREATE TABLE TAB_BANCO_AGENCIA ( ID_BANCO NUMBER(6), PRIMARY KEY, ID_AGENCIA NUMBER(6), PRIMARY KEY, NM_AGENCIA VARCHAR2(60) NOT NULL, NR_DIG_AGENCIA NUMBER(2) NOT NULL, NR_ENDERECO VARCHAR2(15) NOT NULL, ID_CEP CHAR(8) NOT NULL );

Não. Primeiro que você não pode possuir duas chaves primarias na mesma tabela.
Caso precise garantir que esses dois campos possuem valores únicos. Você poderá definir um como chave primária e o outro como unique. Segue exemplo:

CREATE TABLE TAB_BANCO_AGENCIA    
  (    
    ID_BANCO       NUMBER(6)  PRIMARY KEY,  
    ID_AGENCIA     NUMBER(6)  UNIQUE,  
    NM_AGENCIA     VARCHAR2(60) NOT NULL,    
    NR_DIG_AGENCIA NUMBER(2) NOT NULL,    
    NR_ENDERECO    VARCHAR2(15) NOT NULL,    
    ID_CEP         CHAR(8) NOT NULL    
  );

O que precisa ficar claro é que chave primária se faz necessário somente quando você precisar garantir a integridade entre as tabelas mãe e filho.
Necessidade para garantir que não ocorra duplicidade de campos pode ser resolvido com o UNIQUE também, assim como você também pode ter tabelas sem nenhuma chave primária, não há nada de errado nisso. Tudo depende do que você precisa alcançar e qual grau de segurança pretende estabelecer no processo.

Abs

Então vamos supor a TAB_CONTA:

Conta
Id_Correntista - Numérico(12) - Campo Chave
Id_Banco - Numérico(6) - Campo Chave
Id_Conta - Varchar2(10) - Campo Chave
Id_Agencia - Numérico(6) - Campo Chave
Nr_Digito_Conta - Char(1) - Obrigatório
Cd_Tipo_Correntista - Char(1) - Obrigatório
Id_Tipo_Conta - Numérico(6) - Obrigatório
Vl_Saldo - Numérico(12,2) - Obrigatório

São quatro campos chaves ? como eu faria ? Essa é minha principal dúvida, já que não pode ter duas chaves primarias na mesma tabela.
E outra dúvida quando uma tabela herda uma chave primária ela é obrigatoriamente chave estrangeira?

Realmente você não pode ter duas chaves primárias na mesma tabela. O que você pode fazer neste caso é relacionar todos esses campos em uma única chave primária. Entendeu?
Porém você não consegue criar da forma como você postou. Você terá que criar primeiramente sua tabela e depois dar um alter table adicionando esses campos em uma única chave. Veja:

create table CONTA
(
  ID_CORRENTISTA      NUMBER(12) not null,
  ID_BANCO            NUMBER(6) not null,
  ID_CONTA            VARCHAR2(10) not null,
  ID_AGENCIA          NUMBER(6) not null,
  NR_DIGITO_CONTA     CHAR(1),
  CD_TIPO_CORRENTISTA CHAR(1),
  ID_TIPO_CONTA       NUMBER(6),
  VL_SALDO            NUMBER(12,2)
)

agora o código para adicionar todos esses campos:

alter table CONTA
  add constraint CONTA_0001 primary key (ID_CORRENTISTA, ID_BANCO, ID_CONTA, ID_AGENCIA)

Você precisa mesmo que todos esses campos pertençam a uma chave? Se estiver certo dessa decisão deverá lembrar que nas tabelas filhos todos esses campos deverão possuir na mesma ordem para conseguir criar algum registro. Geralmente quando você usa esse procedimento perde muito da flexibilidade em lidar com os dados.
Se for isso mesmo o comando acima ajudará nesta questão.
Bem de qualquer forma existem algumas opções que você pode utilizar que são mais corretas, não que esteja errado o que quer fazer, porém como eu disse perderá um pouco da flexibilidade.
De qualquer forma vai postando ai suas dúvidas que no possível tentarei ajudar.

Olá, primeiramente você tem que ver a ORDEM dos relacionamentos, resumindo QUEM depende de QUEM para existir.

ORDEM de criação desse escript:

1º)
tab_estado, tab_tipo_conta, tab_banco.
Note que essas 3 primeira tabelas nao dependem de ninguem para existir pois nao possuem chaves estrangeiras (FK).

create table tab_estado( id_uf char(2), nm_uf varchar(60), primary key(id_uf) );

2º)
tab_municipio
Agora note que esta tabela esta relacionada com tab_estado, portanto contem uma chave estrangeira id_uf, resumindo só depois de criar tab_estado voce pode criar tab_municipio.

create table tab_municipio( id_municipio number(6), id_uf char(2), --Chave estrangeira****** nm_municipio varchar(60), primary key(id_municipio ), foreign key(id_uf) references tab_estado(id_uf) );

e assim por diante…

Agora sobre a sua duvida de criar as chaves primarias.

Como está na modelagem se trata de chave primaria COMPOSTA, ou seja mais de um campo como PK, você deve seguir a ordem de criação das tabelas.

Exemplo da criação da tabela tab_banco_agencia:

create table tab_banco_agencia( id_banco number(6), id_agencia number(6), nm_agencia varchar(60), nr_dig_agencia number(2), nr_endereco varchar(15), id_cep char(8), primary key(id_agencia, id_banco), --Chave primaria composta***** foreign key(id_banco) references tab_banco(id_banco) );

[quote]primary key(id_agencia, id_banco),
foreign key(id_banco) references tab_banco(id_banco)[/quote]

Chave primaria composta.
Uma das chaves vem de um relacionamento, e a outra e inserida na hora de cadastrar uma linha na tabela.

Como pessoal falou acima criar as chaves com alter table também da certo pois todas as entidades estarão criadas e não e mais necessário observar a ordem das tabelas.

[RESOLVIDO]

[code]CREATE TABLE TAB_ESTADO
(
ID_UF CHAR(2),
NM_UF VARCHAR2(60) NOT NULL
);

CREATE TABLE TAB_MUNICIPIO
(
ID_MUNICIPIO NUMBER(6),
ID_UF CHAR(2) NOT NULL,
NM_MUNICIPIO VARCHAR2(60) NOT NULL
);

CREATE TABLE TAB_LOGRADOURO
(
ID_CEP CHAR(8),
ID_MUNICIPIO NUMBER(6) NOT NULL,
DS_TIPO VARCHAR2(20),
DS_TITULO VARCHAR2(20),
NM_NOME VARCHAR2(100) NOT NULL
);

CREATE TABLE TAB_CORRENTISTA
(
ID_CORRENTISTA NUMBER(12),
NM_NOME VARCHAR2(90) NOT NULL,
DT_NASCIMENTO DATE NOT NULL,
DS_SEXO CHAR(1) NOT NULL,
NR_NUMERO VARCHAR2(15) NOT NULL,
ID_MUNICIPIO NUMBER(6) NOT NULL,
ID_CEP CHAR(8) NOT NULL
);

CREATE TABLE TAB_BANCO
(
ID_BANCO NUMBER(6),
NM_BANCO VARCHAR2(60) NOT NULL
);

CREATE TABLE TAB_BANCO_AGENCIA
(
ID_BANCO NUMBER(6),
ID_AGENCIA NUMBER(6),
NM_AGENCIA VARCHAR2(60) NOT NULL,
NR_DIG_AGENCIA NUMBER(2) NOT NULL,
NR_ENDERECO VARCHAR2(15) NOT NULL,
ID_CEP CHAR(8) NOT NULL
);

CREATE TABLE TAB_TIPO_CONTA
(
ID_TIPO_CONTA NUMBER(6),
NM_TIPO_CONTA VARCHAR2(60) NOT NULL
);

CREATE TABLE TAB_CONTA
(
ID_CORRENTISTA NUMBER(12),
ID_BANCO NUMBER(6),
ID_CONTA VARCHAR2(10),
ID_AGENCIA NUMBER(6),
NR_DIGITO_CONTA CHAR(1 )NOT NULL,
ID_TIPO_CONTA NUMBER(6) NOT NULL,
CD_TIPO_CORRENTISTA CHAR(1) NOT NULL,
VL_SALDO DECIMAL(12,2) NOT NULL
);

ALTER TABLE TAB_ESTADO ADD CONSTRAINT TAB_ESTADO PRIMARY KEY (ID_UF);

ALTER TABLE TAB_MUNICIPIO ADD CONSTRAINT TAB_MUNICIPIO PRIMARY KEY (ID_MUNICIPIO);
ALTER TABLE TAB_MUNICIPIO ADD CONSTRAINT TAB_MUNICIPIO_ID_UF_FK FOREIGN KEY(ID_UF) REFERENCES TAB_ESTADO(ID_UF);

ALTER TABLE TAB_LOGRADOURO ADD CONSTRAINT TAB_LOGRADOURO PRIMARY KEY (ID_CEP);
ALTER TABLE TAB_LOGRADOURO ADD CONSTRAINT TAB_LOGRADOURO_ID_MUNICIPIO_FK FOREIGN KEY(ID_MUNICIPIO) REFERENCES TAB_MUNICIPIO(ID_MUNICIPIO);

ALTER TABLE TAB_CORRENTISTA ADD CONSTRAINT TAB_CORRENTISTA PRIMARY KEY (ID_CORRENTISTA);
ALTER TABLE TAB_CORRENTISTA ADD CONSTRAINT ID_MUNICIPIO_FK FOREIGN KEY(ID_MUNICIPIO) REFERENCES TAB_MUNICIPIO(ID_MUNICIPIO);
ALTER TABLE TAB_CORRENTISTA ADD CONSTRAINT TAB_CORRENTISTA_ID_CEP_FK FOREIGN KEY(ID_CEP) REFERENCES TAB_LOGRADOURO(ID_CEP);

ALTER TABLE TAB_BANCO ADD CONSTRAINT TAB_BANCO PRIMARY KEY (ID_BANCO);

ALTER TABLE TAB_BANCO_AGENCIA ADD CONSTRAINT TAB_BANCO_AGENCIA PRIMARY KEY (ID_AGENCIA, ID_BANCO);
ALTER TABLE TAB_BANCO_AGENCIA ADD CONSTRAINT TAB_BANCO_AGENCIA_ID_BANCO_FK FOREIGN KEY(ID_BANCO) REFERENCES TAB_BANCO(ID_BANCO);

ALTER TABLE TAB_TIPO_CONTA ADD CONSTRAINT TAB_TIPO_CONTA PRIMARY KEY (ID_TIPO_CONTA);

ALTER TABLE TAB_CONTA ADD CONSTRAINT TAB_CONTA PRIMARY KEY (ID_CONTA);
ALTER TABLE TAB_CONTA ADD CONSTRAINT TAB_CONTA_ID_CORRENTISTA_FK FOREIGN KEY(ID_CORRENTISTA) REFERENCES TAB_CORRENTISTA(ID_CORRENTISTA);
ALTER TABLE TAB_CONTA ADD CONSTRAINT TAB_CONTA_ID_BANCO_FK FOREIGN KEY(ID_BANCO) REFERENCES TAB_BANCO(ID_BANCO);
ALTER TABLE TAB_CONTA ADD CONSTRAINT TAB_CONTA_FK FOREIGN KEY(ID_AGENCIA,ID_BANCO) REFERENCES TAB_BANCO_AGENCIA (ID_AGENCIA,ID_BANCO);
ALTER TABLE TAB_CONTA ADD CONSTRAINT TAB_CONTA_ID_TIPO_CONTA_FK FOREIGN KEY(ID_TIPO_CONTA) REFERENCES TAB_TIPO_CONTA(ID_TIPO_CONTA);[/code]