Sistema Web: Estrutura Banco de Dados vs Estrutura Física

17 respostas
felipehts

Sistema Web: Estrutura Banco de Dados vs Estrutura Física

Boa dia pessoal !

Estou planejando um sistema web e tenho dúvida se a estrutura que estou planejando é suficiente…
==> Descrição: O sistema deve atender um limite de 100 empresas no qual poderá ter até 5 usuários cada uma (100x5=500 usuários total), Cada empresa tem em média 1000 itens/produtos (100x1000=100.000 itens/produtos total), e cerca de 1000 clientes (100x1000=100.000 clientes total) e 1000 fornecedores (100x1000=100.000 fornecedores total). O sistema deverá garantir uma disponibilidade de no minimo de 06:00hrs até 20:00hrs, apartir disso pensei nas seguintes estruturas:

  • Sistema Web:
  • Java EE 6
  • Servidor Glassfish 3.1
  • Ubuntu Server 12.04 64Bit
  • Banco de Dados:
  • Mysql 5.1
  • Concorrência: Read committed
  • Tabelas: Pensei em colocar em todas as tabelas uma coluna “ID_EMPRESA”, sendo assim tenho uma unica tabela(clientes, fornecedores, produtos…) para todas as empresas, ou seja a consulta é feita através de restrição pela coluna ID_EMPRESA, EX: select * from produtos where ID_EMPRESA = 1;
  • Framework:
  • Spring
  • PrimeFaces
  • Estrutura Física:
  • Quantidade: 1
  • Processador: Intel i5
  • Memoria: 8 GB
  • HD: 2 TB

Essa estrutura é suficiente ?? performance ??? a estrutura de tabelas seria a melhor opção ??? Qual seria então a melhor estrutura para atender a descrição acima ??? Vlw a todos pela atenção…

17 Respostas

J

Acredito que para armazenamento e acesso a estrutura é suficiente…
Entretanto, vai depender muito da quantidade de acessos simultâneos, bem como da complexidade do aplicativo. Querys complexas podem exigir mais do servidor.

felipehts

vlw… mais alguém ???

drsmachado

Nunca haverá mudança de clientes?
Nunca haverá mudança de fornecedores dos clientes?
Nunca haverá mudança de produtos dos clientes?
Nunca haverá mudança de funcionários dos clientes?

Colocar em todas as tabelas uma coluna id_empresa? Por que não faz a normalização do banco e cria uma tabela empresas que possua uma PK chamada id_empresa, que será usada para relacionar a empresa às demais tabelas?

Outro ponto, você conhece bem do glassfish? Pois ele tem umas manias meio complicadinhas. Vai usar EJB? Senão, por que não usar só o tomcat 7?

Spring e primefaces? E a camada de persistência? Aliás, qual o intento? Primefaces é JSF 2 e os componet-based são lerdos se comparados à action-based como mentawai, Struts 2 e vRaptor.

Qual o nível de proteção do “servidor”? Qual estrutura de firewall e proxy?
Uma coisa que você precisa ter em mente é que máquinas desktop != servidores. Isso pode trazer uma série de problemas para ti. Considere reavaliar a possibilidade de contratar um webhost.

felipehts

drsmachado:
Nunca haverá mudança de clientes?
Nunca haverá mudança de fornecedores dos clientes?
Nunca haverá mudança de produtos dos clientes?
Nunca haverá mudança de funcionários dos clientes?

Colocar em todas as tabelas uma coluna id_empresa? Por que não faz a normalização do banco e cria uma tabela empresas que possua uma PK chamada id_empresa, que será usada para relacionar a empresa às demais tabelas?

Outro ponto, você conhece bem do glassfish? Pois ele tem umas manias meio complicadinhas. Vai usar EJB? Senão, por que não usar só o tomcat 7?

Spring e primefaces? E a camada de persistência? Aliás, qual o intento? Primefaces é JSF 2 e os componet-based são lerdos se comparados à action-based como mentawai, Struts 2 e vRaptor.

Qual o nível de proteção do “servidor”? Qual estrutura de firewall e proxy?
Uma coisa que você precisa ter em mente é que máquinas desktop != servidores. Isso pode trazer uma série de problemas para ti. Considere reavaliar a possibilidade de contratar um webhost.

Eu pensei em criar um id_empresa em cada tabela para relacionar com o “ID” da tabela EMPRESA, ou seja o “id_empresa” seria um FK para relacionar com o campo “ID” que é um PK da tabela EMPRESA… seria isso ??? Obrigado pelas dicas, vou pesquisar um pouco mais…

FernandoFranzini
  1. Seleção de produtos tecnológicos me parece ok.
  2. Esta faltando a arquitetura disso?
  3. Cade a disponibilidade? Com 1 servidor só…se algo acontecer para tudo. Pelo menos um cluster de servidor ou de iaas.
  4. Avalie bem qual a opção arquitetural de banco vc vai usar. veja as formas existentes de mult-tenancy - http://fernandofranzini.wordpress.com/2012/08/16/arquitetura-data-multi-tenant/
  5. Não se esqueça de requisitos de segurança implícitos - Autenticação, Autorização, Integridade e Confidencialidade.
  6. Tome cuidado com os opiniões extremistas com “tal coisa é lerda, tal coisa não funciona”. kkk naõ existe verdade absoluta em nada. Tudo é um mera questão de requisitos X prioridades.
felipehts

FernandoFranzini:
1. Seleção de produtos tecnológicos me parece ok.
2. Esta faltando a arquitetura disso?
3. Cade a disponibilidade? Com 1 servidor só…se algo acontecer para tudo. Pelo menos um cluster de servidor ou de iaas.
4. Avalie bem qual a opção arquitetural de banco vc vai usar. veja as formas existentes de mult-tenancy - http://fernandofranzini.wordpress.com/2012/08/16/arquitetura-data-multi-tenant/
5. Não se esqueça de requisitos de segurança implícitos - Autenticação, Autorização, Integridade e Confidencialidade.
6. Tome cuidado com os opiniões extremistas com “tal coisa é lerda, tal coisa não funciona”. kkk naõ existe verdade absoluta em nada. Tudo é um mera questão de requisitos X prioridades.

Obrigado pelas dicas, para ser sincero não sabia da forma: “mult-tenancy”, vou pesquisar mais…vlw

drsmachado

FernandoFranzini:
1. Seleção de produtos tecnológicos me parece ok.
2. Esta faltando a arquitetura disso?
3. Cade a disponibilidade? Com 1 servidor só…se algo acontecer para tudo. Pelo menos um cluster de servidor ou de iaas.
4. Avalie bem qual a opção arquitetural de banco vc vai usar. veja as formas existentes de mult-tenancy - http://fernandofranzini.wordpress.com/2012/08/16/arquitetura-data-multi-tenant/
5. Não se esqueça de requisitos de segurança implícitos - Autenticação, Autorização, Integridade e Confidencialidade.
6. Tome cuidado com os opiniões extremistas com “tal coisa é lerda, tal coisa não funciona”. kkk naõ existe verdade absoluta em nada. Tudo é um mera questão de requisitos X prioridades.

Concordo contigo, por isso perguntei qual o objetivo.
Quanto ao banco de dados, considere o seguinte:
1 empresa possui vários clientes.
1 cliente pode ser cliente de várias empresas.
1 empresa tem vários fornecedores.
1 fornecedor pode fornecer para várias empresas.
Logo, a relação empresa x cliente e empresa x fornecedor é N : N, ou muitos para muitos.
Dessa forma, só colocar o id_empresa em cliente ou fornecedor pouco adiantará.
Você precisará de uma tabela de relacionamento para empresa e cliente e para empresa e fornecedor, caso contrário, já está fazendo tudo errado e o banco de dados não terá integridade.

felipehts

drsmachado:
FernandoFranzini:
1. Seleção de produtos tecnológicos me parece ok.
2. Esta faltando a arquitetura disso?
3. Cade a disponibilidade? Com 1 servidor só…se algo acontecer para tudo. Pelo menos um cluster de servidor ou de iaas.
4. Avalie bem qual a opção arquitetural de banco vc vai usar. veja as formas existentes de mult-tenancy - http://fernandofranzini.wordpress.com/2012/08/16/arquitetura-data-multi-tenant/
5. Não se esqueça de requisitos de segurança implícitos - Autenticação, Autorização, Integridade e Confidencialidade.
6. Tome cuidado com os opiniões extremistas com "tal coisa é lerda, tal coisa não funciona". kkk naõ existe verdade absoluta em nada. Tudo é um mera questão de requisitos X prioridades.

Concordo contigo, por isso perguntei qual o objetivo.
Quanto ao banco de dados, considere o seguinte:
1 empresa possui vários clientes.
1 cliente pode ser cliente de várias empresas.
1 empresa tem vários fornecedores.
1 fornecedor pode fornecer para várias empresas.
Logo, a relação empresa x cliente e empresa x fornecedor é N : N, ou muitos para muitos.
Dessa forma, só colocar o id_empresa em cliente ou fornecedor pouco adiantará.
Você precisará de uma tabela de relacionamento para empresa e cliente e para empresa e fornecedor, caso contrário, já está fazendo tudo errado e o banco de dados não terá integridade.

Mas porque não posso usar de forma individual, tipo deixa eu tentar explicar melhor:
==> Tabela EMPRESA tem apenas os dados da empresa contratante do serviço, ex:

  • EMPRESA:
  • ID - NOME - CNPJ
    1 - E1 - 123
    2 - E2 - 456
    3 - E3 - 789
  • CLIENTE:
    -ID -ID_EMPRESA -NOME -CNPJ
    1 -1 - C1 -111
    2 - 2 - C1 -111
    3 -3 - C1 -111

  • FORNECEDOR:
    -ID -ID_EMPRESA -NOME -CNPJ
    1 -1 -F1 -111
    2 -2 -F2 -222
    3 -3 -F3 -333

Dessa forma, cada cliente está relacionando com um ID_EMPRESA, ou seja mesmo o cliente tendo o mesmo CNPJ não irá interferir com o cliente de uma outra empresa. Qual seria o problema de fazer dessa forma ?? Tipo queria manter os dados de forma individual, ou seja cada empresa tem seus clientes, mesmo que existam 2 clientes iguais, um não interfere com o outro, pois cada um tem seu ID_EMPRESA distinto …

drsmachado

Integridade.
E se o fornecedor 1 fornecer para as empresas 1, 2 e 3? Como faz?
E se os clientes 1, 2 e 3 forem clientes das empresas 1 e 3? Como faz?
Vai criar N tabelas para as N empresas associadas a fornecedores e a clientes?
Você não pode fazer isso em relações N : N pois precisaria de um número muito grande de colunas para referenciar todas as possibilidades e, mesmo assim, não há garantias de que conseguiria mapear tudo.
Por isso, se você fizer como disse, fica mais fácil.

EMPRESA
ID	NOME	CNPJ
1	A		123
2	B		234
3	C		345

CLIENTE
ID	NOME	CNPJ
1	CA		2123
2	CB		2234
3	CC		2456

FORNECEDOR
ID	NOME	CNPJ
1	FA		3123
2	FB		3234
3	FC		3345

EMPRESA_CLIENTE
ID	ID_EMPRESA	ID_CLIENTE
1	1			1
2	1			2
3	1			3
4	2			1
5	2			3

EMPRESA_FORNECEDOR
ID	ID_EMPRESA	ID_FORNECEDOR
1	1			1
2	2			1
3	2			3
felipehts
drsmachado:
Integridade. E se o fornecedor 1 fornecer para as empresas 1, 2 e 3? Como faz? E se os clientes 1, 2 e 3 forem clientes das empresas 1 e 3? Como faz? Vai criar N tabelas para as N empresas associadas a fornecedores e a clientes? Você não pode fazer isso em relações N : N pois precisaria de um número muito grande de colunas para referenciar todas as possibilidades e, mesmo assim, não há garantias de que conseguiria mapear tudo. Por isso, se você fizer como disse, fica mais fácil.
EMPRESA
ID	NOME	CNPJ
1	A		123
2	B		234
3	C		345

CLIENTE
ID	NOME	CNPJ
1	CA		2123
2	CB		2234
3	CC		2456

FORNECEDOR
ID	NOME	CNPJ
1	FA		3123
2	FB		3234
3	FC		3345

EMPRESA_CLIENTE
ID	ID_EMPRESA	ID_CLIENTE
1	1			1
2	1			2
3	1			3
4	2			1
5	2			3

EMPRESA_FORNECEDOR
ID	ID_EMPRESA	ID_FORNECEDOR
1	1			1
2	2			1
3	2			3
me desculpa mas ainda não consegui entender pq não terá integridade da forma que citei acima, pois EXEMPLO: CLIENTE1 pertence a EMPRESA1, e se esse CLIENTE1 for cliente da EMPRESA2????? simples, os dados são separados, ou seja o cadastro da EMPRESA1 não interfere na EMPRESA2, a EMPRESA2 nem sabe que existe o CLIENTE1, ela simplesmente vai cadastrar o CLIENTE1 que na verdade terá os mesmos dados porém com ID e ID_EMPRESA diferente, tendeu ???
FernandoFranzini

Multi-tenancy ja documenta tudo isso…é só ler e ver os pros e contras de cada estrategia diferente.

felipehts

Conhece algum bom material em português para indicar ?

FernandoFranzini

Assunto muito batido ja…http://imasters.com.br/artigo/19067/cloud/entendendo_o_modelo_multi-tenancy/
Pesquisa ai q vc acha facil…

felipehts

FernandoFranzini:
Assunto muito batido ja…http://imasters.com.br/artigo/19067/cloud/entendendo_o_modelo_multi-tenancy/
Pesquisa ai q vc acha facil…

vlw

drsmachado
felipehts:
drsmachado:
Integridade. E se o fornecedor 1 fornecer para as empresas 1, 2 e 3? Como faz? E se os clientes 1, 2 e 3 forem clientes das empresas 1 e 3? Como faz? Vai criar N tabelas para as N empresas associadas a fornecedores e a clientes? Você não pode fazer isso em relações N : N pois precisaria de um número muito grande de colunas para referenciar todas as possibilidades e, mesmo assim, não há garantias de que conseguiria mapear tudo. Por isso, se você fizer como disse, fica mais fácil.
EMPRESA
ID	NOME	CNPJ
1	A		123
2	B		234
3	C		345

CLIENTE
ID	NOME	CNPJ
1	CA		2123
2	CB		2234
3	CC		2456

FORNECEDOR
ID	NOME	CNPJ
1	FA		3123
2	FB		3234
3	FC		3345

EMPRESA_CLIENTE
ID	ID_EMPRESA	ID_CLIENTE
1	1			1
2	1			2
3	1			3
4	2			1
5	2			3

EMPRESA_FORNECEDOR
ID	ID_EMPRESA	ID_FORNECEDOR
1	1			1
2	2			1
3	2			3
me desculpa mas ainda não consegui entender pq não terá integridade da forma que citei acima, pois EXEMPLO: CLIENTE1 pertence a EMPRESA1, e se esse CLIENTE1 for cliente da EMPRESA2????? simples, os dados são separados, ou seja o cadastro da EMPRESA1 não interfere na EMPRESA2, a EMPRESA2 nem sabe que existe o CLIENTE1, ela simplesmente vai cadastrar o CLIENTE1 que na verdade terá os mesmos dados porém com ID e ID_EMPRESA diferente, tendeu ???

Não entendeu por que não quer ou está com preguiça.
Pensando da forma que você pensou, como você vai fazer para associar o id das empresas 1, 2, 3, 4, 5, 6, 10, 100 ao cliente 2 se o teu cliente só tem 1 coluna para id_empresa?
Se e somente se um cliente fosse exclusivo de uma empresa, aí a coisa seria diferente, mas isso não irá ocorrer, tanto quanto para fornecedor ou produto.

Veja a diferença do que eu disse para o que você está falando.
Da forma como pensa, para associar um único cliente a 40 empresas eu terei que ter 40 cadastros do mesmo cliente, cada um associado a uma empresa.
É isso que me refiro quando digo que o banco não terá integridade.

Agora, você está querendo fazer uma grande gambiarra, sem qualquer conhecimento mais aprofundado sobre isso.
Me desculpe, mas, sem estudar corretamente, estará fadado ao fracasso ou, no mínimo, a grandes problemas por bobeira.

drsmachado

Aliás, até a abordagem de ter 1 único banco e nas tabelas deste controlar a estrutura de cada empresa, produtos e clientes me parece infeliz.
Qual a flexibilidade para isto?
O ideal seria manter um banco de dados diferente para cada empresa, onde você poderia flexibilizar o conteúdo que cada empresa poderia ter.

felipehts

100 bancos de dados, com a mesma estrutura ??? tem certeza disso ???
Eu citei por várias vezes que cada empresa terá um cadastro individual, não quero que compartilha a mesma informação, isso é uma REGRA.
No inicio do tópico informei que estava com dúvida e perguntei se tinha alguém disposto a ajudar e explicar, se você acha que minha dúvida é “IDIOTA”, “INÚTIL” , dispenso sua “ajuda”. Obrigado.

Criado 14 de agosto de 2012
Ultima resposta 16 de ago. de 2012
Respostas 17
Participantes 4