La integridad referencial en bases de datos asegura que las relaciones entre los datos sean coherentes. MongoDB, al ser una base de datos NoSQL orientada a documentos, no tiene un sistema de claves foráneas como las bases de datos relacionales, por lo que la integridad referencial debe ser gestionada explícitamente.
En bases de datos tradicionales como MySQL, la integridad referencial se asegura a través de claves foráneas, que son restricciones que indican que una columna en una tabla debe coincidir con el valor de una clave primaria en otra tabla. Sin embargo, MongoDB no impone este tipo de reglas de forma predeterminada.
Para mantener la integridad referencial en MongoDB, puedes utilizar algunas estrategias como la referencia manual entre documentos o aplicar validaciones adicionales a nivel de aplicación.
En MongoDB, puedes mantener la integridad referencial mediante las siguientes estrategias:
Una referencia manual es cuando un documento en una colección contiene un campo que guarda el identificador (_id) de un documento de otra colección. Esto no asegura automáticamente que el documento referenciado exista, por lo que se debe gestionar en la aplicación para garantizar la coherencia.
Supongamos que tenemos dos colecciones: propietarios y propiedades. En este ejemplo, cada propiedad tiene un campo ownerId que hace referencia al identificador de un propietario en la colección propietarios.
{
"_id": { "$oid": "66320aa8c13e5c6cfd000001" },
"name": "John Doe",
"address": "123 Main St",
"photo": "https://example.com/photo.jpg",
"birthday": { "$date": "1990-01-01T00:00:00Z" }
}
Ejemplo de un documento en la colección propiedades que hace referencia al propietario:
{
"_id": { "$oid": "66320aa8c13e5c6cfd000010" },
"name": "Luxury Villa",
"address": "456 Ocean Drive",
"price": 1000000,
"codeInternal": "PROP001",
"year": 2020,
"ownerId": { "$oid": "66320aa8c13e5c6cfd000001" }
}
En este caso, ownerId es una referencia manual que debe coincidir con el _id de un documento en la colección propietarios.
Si el propietario se elimina de la colección propietarios, las propiedades que lo referencian en ownerId quedarán con una referencia rota. Para evitar esto, deberías:
En lugar de almacenar una referencia a otro documento, puedes incluir los datos de otro documento directamente dentro del documento principal. Esta estrategia se utiliza cuando los datos referenciados no cambian frecuentemente y se necesita acceso rápido a toda la información.
En este ejemplo, en lugar de almacenar solo el identificador del propietario, los datos del propietario se incluyen directamente como un subdocumento dentro de la propiedad:
{
"_id": { "$oid": "66320aa8c13e5c6cfd000010" },
"name": "Luxury Villa",
"address": "456 Ocean Drive",
"price": 1000000,
"codeInternal": "PROP001",
"year": 2020,
"owner": {
"name": "John Doe",
"address": "123 Main St",
"photo": "https://example.com/photo.jpg",
"birthday": { "$date": "1990-01-01T00:00:00Z" }
}
}
En este caso, toda la información del propietario se encuentra directamente dentro del documento de la propiedad como un subdocumento.