Boa noite, tenho pouca experiencia com diagrama ER e modelagem banco de dados (iniciante) e estou com uma duvida a respeito do diagrama que fiz sobre essa questão.
- O diagrama ER que fiz ta certo? Eu coloco o atributo “nome” para antena (ou não precisa)?
- A modelagem que fiz ta certo? Eu tenho que criar uma tabela “localizado”?
- Quando eu tenho e quando não precisa criar tabela para relacionamento das entidades?
Meu Diagrama E-R:
A Modelagem Fisica desse diagrama:
create table antena(
id int not null auto_increment,
latitude tinyint not null,
longitude smallint not null,
primary key (id)
);
create table local(
id int not null auto_increment,
estado varchar(30) not null,
);
Se não pede, não precisa.
Não.
Não.
Depende de como você vai criar o banco.
Basicamente, você pode ter 4 tipos de relacionamento entre tabelas:
- Auto relacionamento: quando um elemento da tabela X se relaciona com algum elemento da mesma tabela X. Exemplo: Um funcionário possui um gestor (que também é um funcionário)
- Relacionamento 1:1: quando um elemento da tabela X se relaciona com no máximo um e apenas um elemento da tabela Y. Exemplo: Cada carro possui uma placa e cada placa está associada a apenas um carro.
- Relacionamento 1:N: é o mais comum, quando um elemento da tabela X se relaciona com nenhum ou vários elementos da tabela Y. Exemplo: Uma mãe tem vários filhos, mas cada filho só tem uma mãe.
- Relacionamento N:M: quando nenhum ou mais elementos da tabela X se relacionam com nenhum ou vários elementos da tabela Y. Exemplo: Cada nota fiscal possui vários produtos. Cada produto pode estar em várias notas fiscais. Cria-se, então, uma tabela chamada ITEM_NF onde se relacionam NF (número NF) e PRODUTO (código produto, quantidade, valor unitário, etc)
Em tese, apenas o último tipo demanda a criação de tabela associativa (de relacionamento). Porém, por questões de modelagem e facilidade, há quem defenda que o terceiro e o quarto tipo utilizem desse recurso.
Ah, sim, mesmo o auto relacionamento pode cair nos demais, exemplo: um ou mais elementos da tabela X se relacionam com vários elementos da mesma tabela. Então, aplicam-se as regras dos demais tipos, da mesma maneira.
Agora, por que o modelo está errado? E por que a modelagem está errada?
Entende-se que tudo o que relativo à uma informação (tabela) seja colocado nela mesma, como coluna.
Assim sendo, se latitude e longitude, que são informações sobre posição (entenda-se localização), ficarão na tabela antena, logo, você não tem por que separar o estado.
Como o script segue o diagrama, o mesmo está errado.
Ah, o tipo de dado decimal não é um tinyint…
Eu faria, simplesmente:
CREATE TABLE ANTENA(
ID INT NOT NULL AUTO_INCREMENT,
LATITUDE DECIMAL NOT NULL,
LONGITUDE DECIMAL NOT NULL,
ESTADO VARCHAR(2) NOT NULL,
PRIMARY KEY(ID)
);
Algo assim.
1 curtida
Obrigado @darlan_machado. Tá ajudando muito.
-
Mas nesse caso o “estado” não seria em outra tabela para não ficar repetindo , já que em um estado pode ter muitas antenas?
-
Considerando a modelagem física que você fez o diagrama ER seria,1 entidade (antena) associada a 4 atributos (id,latitude, longitude e estado) sem relacionamentos ?
Eu coloquei o tamanho do estado com 30 para escrever o nome todo tipo “Rio de Janeiro” em vez de só “RJ”
De novo, depende de como você quer implementar o banco.
Veja, por exemplo, se você cria uma tabela de clientes. Certamente, terá muitos “João da Silva”. Vai criar uma tabela só para o nome João? Ou maria?
Mas, sim, você pode fazer isso, criar uma tabela apenas para o estado, porém, só com a PK e o nome do estado (também pode ser com o nome completo e a sigla)
1 curtida
Então o meu diagrama e a modelagem do BD não está errado de acordo com o enunciado?
No meu ponto de vista, sim, está errado.
Se você for criar uma tabela associativa para estado, chame-a de estado e não de local. Se for chamar de local, então coloque latitude e longitude junto (e daí voltamos ao ponto de repetir os estados).
CREATE TABLE ESTADO(
ID INT NOT NULL AUTO_INCREMENT,
NOME VARCHAR(30) NOT NULL,
SIGLA VARCHAR(2) NOT NULL,
PRIMARY KEY(ID)
);
CREATE TABLE ANTENA(
ID INT NOT NULL AUTO_INCREMENT,
LATITUDE DECIMAL NOT NULL,
LONGITUDE DECIMAL NOT NULL,
ID_ESTADO INT,
PRIMARY KEY(ID)
);
Só não esqueça de criar a constraint referente a FK de estado para antena.
Este é um modo de resolver, porém, eu ficaria com o primeiro modelo. São opções.
1 curtida