Técnicas de Normalização
Relacionomento de Dados
Antes de definirmos a Quarta Forma Normal, vamos dar uma olhada nos 3 tipos básicos de relacionomento; um-para-um, um-para-muitos e muitos-para-muitos. Observe a tabela de usuários na Primeira Forma Normal acima. Por um instante vamos imaginar que colocamos os campos de url em uma tabela separada, e toda vez que nós inserimos um registro na tabela de usuários nós iríamos inserir uma linha na tabela url. Nós teríamos então um relacionomento um-para-um: cada linha na tabela de usuários teria exatamente uma linha correspondente na tabela de urls. Para os propósitos da nossa aplicação isso não seria nem útil nem normalizado.
Agora olhe para as tabelas no exemplo da Segunda Forma Normal. Nossas tabelas permitem a um usuário ter muitas urls associadas a este registro de usuário. Esta é uma relação uma-para-muitos, o tipo mais comum, e até que alcançássemos o dilema apresentado na Terceira Forma Normal, o uníco tipo que precisaríamos.
O relacionomento muitos-para-muitos, por outro lado, é um pouco mais complexo. Note que no nosso exemplo da Terceira Forma Normal nós temos um usuário relacionado a muitas urls. Como mencionado, nós queremos mudar esta estrutura para permitir que muitos usuários estejam relacionados com muitas urls, dessa forma nós queremos um relacionomento muitos-para-muitos. Vamos dar uma olhada no que isso faria à estrutura das nossas tabelas antes de discutirmos:
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="3" bgcolor="#DDDDDD">usuarios</td></tr><tr align="center"><td bgcolor="#FFCC00">usrId</td><td>nome</td><td bgcolor="#0099CC">relemprId</td></tr><tr align="center"><td>1</td><td>Carlos</td><td>1</td></tr><tr align="center"><td>2</td><td>Flávia</td><td>2</td></tr></table>
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="3" bgcolor="#DDDDDD">empresas</td></tr><tr align="center"><td bgcolor="#0099CC">emprId</td><td>empresa</td><td>empresa_endereco</td></tr><tr align="center"><td>1</td><td>ABC</td><td>Santos Dummont, 100</td></tr><tr align="center"><td>2</td><td>XYZ</td><td>Des. Moreira, 100</td></tr></table>
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="2" bgcolor="#DDDDDD">urls</td></tr><tr align="center"><td bgcolor="#CC9966">urlId</td><td>url</td></tr><tr align="center"><td>1</td><td>abc.com</td></tr><tr align="center"><td>2</td><td>xyz.com</td></tr></table>
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="3" bgcolor="#DDDDDD">url_relacoes</td></tr><tr align="center"><td>relacaoId</td><td bgcolor="#CC9966">relacionadoUrlId</td><td bgcolor="#FFCC00">relacionadousrId</td></tr><tr align="center"><td>1</td><td>1</td><td>1</td></tr><tr align="center"><td>2</td><td>1</td><td>2</td></tr><tr align="center"><td>3</td><td>2</td><td>1</td></tr><tr align="center"><td>4</td><td>2</td><td>2</td></tr></table>
Para diminuir a duplicação de dados (e no processo que nos leva à Quarta Forma de Normalização), nós criamos uma tabela cheia de nada a não ser chaves primárias e estrangeiras em url_relacoes. Nós fomos capazes de remover as entradas duplicadas na tabela urls criando a tabela url_relacoes.
Agora podemos expressar com exatidão o relacionomento que ambos Carlos e Flávia estão relacionados a cada um, e a ambas urls. Então vamos ver exatamente o que diz a Quarta Forma de Normalização:
Antes de definirmos a Quarta Forma Normal, vamos dar uma olhada nos 3 tipos básicos de relacionomento; um-para-um, um-para-muitos e muitos-para-muitos. Observe a tabela de usuários na Primeira Forma Normal acima. Por um instante vamos imaginar que colocamos os campos de url em uma tabela separada, e toda vez que nós inserimos um registro na tabela de usuários nós iríamos inserir uma linha na tabela url. Nós teríamos então um relacionomento um-para-um: cada linha na tabela de usuários teria exatamente uma linha correspondente na tabela de urls. Para os propósitos da nossa aplicação isso não seria nem útil nem normalizado.
Agora olhe para as tabelas no exemplo da Segunda Forma Normal. Nossas tabelas permitem a um usuário ter muitas urls associadas a este registro de usuário. Esta é uma relação uma-para-muitos, o tipo mais comum, e até que alcançássemos o dilema apresentado na Terceira Forma Normal, o uníco tipo que precisaríamos.
O relacionomento muitos-para-muitos, por outro lado, é um pouco mais complexo. Note que no nosso exemplo da Terceira Forma Normal nós temos um usuário relacionado a muitas urls. Como mencionado, nós queremos mudar esta estrutura para permitir que muitos usuários estejam relacionados com muitas urls, dessa forma nós queremos um relacionomento muitos-para-muitos. Vamos dar uma olhada no que isso faria à estrutura das nossas tabelas antes de discutirmos:
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="3" bgcolor="#DDDDDD">usuarios</td></tr><tr align="center"><td bgcolor="#FFCC00">usrId</td><td>nome</td><td bgcolor="#0099CC">relemprId</td></tr><tr align="center"><td>1</td><td>Carlos</td><td>1</td></tr><tr align="center"><td>2</td><td>Flávia</td><td>2</td></tr></table>
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="3" bgcolor="#DDDDDD">empresas</td></tr><tr align="center"><td bgcolor="#0099CC">emprId</td><td>empresa</td><td>empresa_endereco</td></tr><tr align="center"><td>1</td><td>ABC</td><td>Santos Dummont, 100</td></tr><tr align="center"><td>2</td><td>XYZ</td><td>Des. Moreira, 100</td></tr></table>
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="2" bgcolor="#DDDDDD">urls</td></tr><tr align="center"><td bgcolor="#CC9966">urlId</td><td>url</td></tr><tr align="center"><td>1</td><td>abc.com</td></tr><tr align="center"><td>2</td><td>xyz.com</td></tr></table>
<table align="center" border="1" cellpadding="4" cellspacing="0" width="400" bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="font-family: arial; font-size: 10pt;"><tr align="center"><td colspan="3" bgcolor="#DDDDDD">url_relacoes</td></tr><tr align="center"><td>relacaoId</td><td bgcolor="#CC9966">relacionadoUrlId</td><td bgcolor="#FFCC00">relacionadousrId</td></tr><tr align="center"><td>1</td><td>1</td><td>1</td></tr><tr align="center"><td>2</td><td>1</td><td>2</td></tr><tr align="center"><td>3</td><td>2</td><td>1</td></tr><tr align="center"><td>4</td><td>2</td><td>2</td></tr></table>
Para diminuir a duplicação de dados (e no processo que nos leva à Quarta Forma de Normalização), nós criamos uma tabela cheia de nada a não ser chaves primárias e estrangeiras em url_relacoes. Nós fomos capazes de remover as entradas duplicadas na tabela urls criando a tabela url_relacoes.
Agora podemos expressar com exatidão o relacionomento que ambos Carlos e Flávia estão relacionados a cada um, e a ambas urls. Então vamos ver exatamente o que diz a Quarta Forma de Normalização:
estava testando aki, eu programo php com mysql no windows e qundo ta ok testo no linux, tive um problema de campos no mysql, onde os num posso usar maiusculas no nomes dos campos, tem que se rtudo minusculo....alguem ja passou por isso?
25/10/2004 1:46pm
(~20 anos atrás)
isso foi o que eu não entendi, você quis dizer que se eu pegar as chaves estrangeiras de outras tabelas eu consigo reconstituir essa tabela de quinta forma ? :)
17/04/2002 11:36am
(~22 anos atrás)
Opa André, acho que me enganei aqui nos emails, me desculpe.
Bem, quanto a quinta forma como não é algo muito utilizado o autor se restringiu a apenas comentá-la. Na verdade você faz a volta do que você fez, vai destrinchando as tabelas inferiores até chegar a uma tabela principal, na verdade é apenas ler o artigo de trás pra frente. É mais uma forma de se certificar que uma tabela está restringida ao máximo do que uma forma de construir a tabela principal.
[]s
Bem, quanto a quinta forma como não é algo muito utilizado o autor se restringiu a apenas comentá-la. Na verdade você faz a volta do que você fez, vai destrinchando as tabelas inferiores até chegar a uma tabela principal, na verdade é apenas ler o artigo de trás pra frente. É mais uma forma de se certificar que uma tabela está restringida ao máximo do que uma forma de construir a tabela principal.
[]s
17/04/2002 11:28am
(~22 anos atrás)
Olá André...
...quando você vai começar a estruturar um banco de dados com tabelas e etc, você começa estabelecendo uma tabela no Formato Zero, como é mostrado no artigo. Você nunca começa com as tabelas já normalizadas, a não ser que você tenha uma boa experiência já e comece já fazendo uma normalização inicial.
Então, a princípio você estabelece uma tabela na Forma Zero e vai aplicando regras de normalização.
[]s
...quando você vai começar a estruturar um banco de dados com tabelas e etc, você começa estabelecendo uma tabela no Formato Zero, como é mostrado no artigo. Você nunca começa com as tabelas já normalizadas, a não ser que você tenha uma boa experiência já e comece já fazendo uma normalização inicial.
Então, a princípio você estabelece uma tabela na Forma Zero e vai aplicando regras de normalização.
[]s
17/04/2002 11:17am
(~22 anos atrás)
Acho que a Quinta forma ficou muito no "ar", seria interessante se você conseguisse exemplificar, como nas outras formas ! :-)
15/04/2002 10:42am
(~22 anos atrás)