Vamos supor que temos o seguinte banco de dados:
Ou no formato pseudo sql (todas as colunas não são nulas):
create table road (
id int PK
)
create table item_on_road (
id int PK
road_id int FK road.id
position_order int
UNIQUE (road_id, position_order)
)
create table rock (
id int PK FK item_on_road.id
size float
)
// and so on
Temos um road
no qual podemos viajar em uma direção.
Ao longo da estrada podemos encontrar coisas diferentes item_on_road
para encontrá-las position_order
como1,2,3
As coisas que encontramos na estrada podem ser diferentes, de sign
a gas_station
.
Agora gostaria de fazer uma pergunta:
Este design de banco de dados corresponde às formas normais do 1º ao 5º banco de dados? Eu diria que não, porque podemos criar
item_on_road
entradas sem correspondênciarock
Se não corresponder à 5ª forma normal, como fazer?
Perguntas opcionais:
Se a resposta a uma pergunta for sim, como garantir a existência do
rock
casoitem_on_road
criado?Se a resposta a uma pergunta for sim, como garantir que não podemos criar
rock
esign
apontar para o mesmo ID?
A Quinta Forma Normal trata da definição do conjunto de combinações válidas, se você precisar impor isso no design do banco de dados.
Não se trata de exigir que exista uma linha em uma tabela de referência. Não conheço nenhuma forma normal que faça isso.
Por exemplo, se você precisasse fazer o design do banco de dados impor que as rochas só podem ocorrer nas estradas 12 e 34, você decomporia em outra tabela para representar combinações válidas.
Seu design atual permite que pedras apareçam em qualquer estrada. Se essa for sua intenção, então ela está em conformidade com a Quinta Forma Normal.
Questões 3 e 4: como garantir que exista uma linha filha e que um item possa ser apenas um tipo de item?
Você precisaria reverter a referência:
Adicione uma coluna de chave estrangeira para rock in
item_on_road
, que faz referência àrock
tabela:Esta coluna de chave estrangeira é anulável. Se o item for uma pedra, preencha o valor. Se o item não for uma pedra, deixe-o nulo.
Adicione mais colunas para os outros tipos de itens.
Em seguida, adicione uma restrição CHECK para garantir que exatamente uma dessas colunas de chave estrangeira não seja nula.