Quando estamos a criar uma base de dados, é crucial ter em consideração a integridade de entidade e referência. Para garantir um funcionamento eficiente, é essencial estar atento às relações entre as diversas entidades do sistema.
Ao editar o ficheiro da tabela que estamos a preparar para migrar, é importante, após definir os campos, identificar e estabelecer corretamente as relações existentes com outras entidades. Este passo é vital para assegurar a coerência e a integridade dos dados no contexto do sistema.
Vamos considerar um exemplo onde temos três tabelas: Produto, Encomenda e ItemsEncomenda. Vamos supor que cada encomenda pode ter vários produtos e que um produto pode estar presente em várias encomendas. Neste caso, estamos a lidar com uma relação muitos-para-muitos, o que significa que podemos ter vários produtos numa encomenda e, inversamente, um produto pode pertencer a várias encomendas. Vamos utilizar um relacionamento de tabela pivot para representar esta relação.
Aqui está um exemplo de migração para essas tabelas usando o Laravel:
- Migração da Tabela
Produto:
- Migração da Tabela
Encomenda:
- Migração da Tabela
ItemsEncomenda:
Neste exemplo, a tabela items_encomenda serve como uma tabela pivot para as tabelas produtos e encomendas. Os campos produto_id e encomenda_id são chaves estrangeiras que referenciam os IDs das tabelas produtos e encomendas, estabelecendo assim a relação muitos-para-muitos. A coluna quantidade poderia representar a quantidade de um determinado produto na encomenda.
É crucial criar as tabelas mestre antes das tabelas que fazem uso de chaves estrangeiras. Deve ter em mente que os ficheiros de migração são criados e ordenados pela data de criação, sendo executados seguindo essa ordem. Portanto, não é possível estabelecer relações entre campos de tabelas que ainda não foram criadas. Esta ordem de execução é fundamental para garantir a integridade referencial e o correto funcionamento do sistema.
Vejamos mais um exemplo:
- Migração da Tabela
posts
A linha $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); nas migrações de Laravel define uma chave estrangeira para o campo user_id que faz referência ao campo id da tabela users e estabelece uma regra específica para o que acontece quando o registo relacionado na tabela users é eliminado.
$table->foreign('user_id'):- Cria uma chave estrangeira na coluna
user_id. - Esta chave estrangeira será usada para garantir que os valores inseridos em
user_idexistam na colunaidda tabela relacionada (users), criando assim um relacionamento entre a tabela atual e a tabelausers.
- Cria uma chave estrangeira na coluna
references('id'):- Especifica que o campo
user_idfaz referência ao campoidda tabela relacionada. - O valor de
user_iddeve corresponder a um valor existente na colunaidda tabelausers.
- Especifica que o campo
on('users'):- Indica que a coluna
user_idfaz referência à tabelausers. - Este é o nome da tabela onde está a chave primária
idque é referenciada.
- Indica que a coluna
onDelete('set null'):- Define a ação que ocorrerá quando um registo associado na tabela
usersfor eliminado. - O comportamento
set nullindica que, se um utilizador for eliminado da tabelausers, o campouser_idnos registos relacionados será atualizado para null. - Isto é útil quando queremos manter os registos na tabela atual (por exemplo,
posts), mas não precisamos manter a referência ao utilizador eliminado.
- Define a ação que ocorrerá quando um registo associado na tabela