Modelagem de banco

Oii queridos!
Estou com dificuldades para montar um banco. Se trata de um agendamento de serviços,
tenho as seguintes tabelas: cliente, funcionario, serviço, produto, fornecedor e agendamento.

Bom, minhas dúvidas:

1)Tem como fazer uma tabela endereço e associar com cliente, funcionarário e fornecedor? Isso pq eu tinha defiinido o endereço com um campo de 30 posições mais ou menos,
mas ai me dei conta que endereço, tem cep, número, bairro etc.

2)Determinei que um funcionário pode realizar vários serviços, então eu teria uma tabela tipo serviço_funcionario com as fk delas dentro, certo?

3)Como faço para que cada agendamento possa ter mais que um serviço? Pois a pessoa pode agendar vários serviços.

O SQL está assim:

[code]CREATE TABLE cliente (
codc serial NOT NULL,
nomec character varying(30) NOT NULL,
fonec character varying(9) NOT NULL,
endc character varying(50),

CONSTRAINT pk_cod_cliente PRIMARY KEY (codc)
)
WITH (
OIDS=FALSE
);

CREATE TABLE funcionario (
codf serial NOT NULL,
nomef character varying(30) NOT NULL,
fonef character varying(9) NOT NULL,
endf character varying(50),

CONSTRAINT pk_cod_funcionario PRIMARY KEY (codf)
)
WITH (
OIDS=FALSE
);

CREATE TABLE produto (
codp serial NOT NULL,
nomep character varying(30) NOT NULL,
descp character varying(50) NOT NULL,
precop decimal(4,2) NOT NULL, --VERIFICAR TIPO
qtdp int NOT NULL, --quantidade no estoque

CONSTRAINT pk_cod_produto PRIMARY KEY (codp)
)
WITH (
OIDS=FALSE
);

CREATE TABLE fornecedor (
codforn serial NOT NULL,
nomeforn character varying(30) NOT NULL,
cnpjfor character varying(15), --verifica quantidade
foneforn character varying(9) NOT NULL,
emailfor character varying(25),
endforn character varying(50),

CONSTRAINT pk_cod_fornecedor PRIMARY KEY (codf)
)
WITH (
OIDS=FALSE
);

CREATE TABLE servico (
cods serial NOT NULL,
nomes character varying(15) NOT NULL,
precop decimal(4,2) NOT, NULL,

CONSTRAINT pk_cod_servico PRIMARY KEY (cods)
)
WITH (
OIDS=FALSE
);

CREATE TABLE servico_funcionario (
CONSTRAINT fk_cod_servico FOREIGN KEY (cods)
REFERENCES servico (cods),

CONSTRAINT fk_cod_funcionario FOREIGN KEY (codf)
REFERENCES funcionario (codf)
)
WITH (
OIDS=FALSE
);

CREATE TABLE agenda (
coda serial NOT NULL,
horaa time(4) NOT NULL, --rever formato
dataa date NOT NULL,

CONSTRAINT pk_cod_agenda PRIMARY KEY (coda),

CONSTRAINT fk_cod_cliente FOREIGN KEY (codc)
REFERENCES cliente (codc),

CONSTRAINT fk_cod_servico FOREIGN KEY (cods)
REFERENCES servico (cods),

CONSTRAINT fk_cod_funcionario FOREIGN KEY (codf)
REFERENCES funcionario (codf)
)

WITH (
OIDS=FALSE
);[/code]

Gostaria de saber a opinião de vocês pra resolver isso.
Obrigada! beijos!

E aí Mariana blz?

  1. Como funcionario, cliente e fornecedor são pessoas, vc pode fazer uma tabela pessoa, com nome, idade… e daí uma tabela cliente, funcionario e fornecedor e daí com isso o endereço vai ali na tabela pessoa.
  2. Isso mesmo, como é uma ligação de muitos para muitos, tem que fazer uma tabela no meio com as fks.

Oiii, taa! isso tipo como a herança em java? Mas depois ireir fazer a interface em java, isso não iria dificultar muito?

Não, sem grandes problemas.

Olá denovo querido, e quando houver campos que se repetem em duas tabelas somente, não nas três, como faço? Deixo nas duas?

Não entendi, quais campos e quais tabelas?
Explica um pouco melhor.

Olá! Assim:

[code]CREATE TABLE pessoa(
codp serial NOT NULL,
nomep character varying(15) NOT NULL,
telfixo character varying(8) NOT NULL,
endp character varying(50),
emailp character varying(25),

CONSTRAINT pk_cod_pessoa PRIMARY KEY (codp)
)
WITH (
OIDS=FALSE
);

CREATE TABLE cliente (
telcel character varying(8)
)INHERITS (pessoa)
WITH (
OIDS=FALSE
);

CREATE TABLE funcionario (
snome character varying(20),
cpf character varying(11),
rg character varying(10), --no RS são 10 dígitos
nasc date
)INHERITS (pessoa)
WITH (
OIDS=FALSE
);

CREATE TABLE fornecedor (
cnpj character varying(14)
)INHERITS (pessoa)
WITH (
OIDS=FALSE
);[/code]

Quaalquer crítica ou sujestão é bem vinda!