normalizacion
Puedes ayudarme a crear las siguientes tablas, pero quiero que cuando quiera vaciar(trucar ) la catabla
carpetas no tenga problemas con las recctriciones con las llaves foraneas de las tablas relacionadas
-- Tabla principal de carpetas
CREATE TABLE carpetas (
id INT PRIMARY KEY AUTO_INCREMENT,
carpeta VARCHAR(200),
distrito VARCHAR(200),
fecha_carpeta DATE,
num_inv VARCHAR(20),
tipo_solicitud VARCHAR(200),
juez VARCHAR(200)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Tabla para intervinientes (víctimas e imputados)
CREATE TABLE carpeta_intervinientes (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(200),
tipo VARCHAR(20),
carpeta_id INT,
FOREIGN KEY (carpeta_id) REFERENCES carpeta(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Tabla para delitos asociados a cada carpeta
CREATE TABLE carpeta_delitos (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(200),
carpeta_id INT,
FOREIGN KEY (carpeta_id) REFERENCES carpeta(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Me diante un escript deseo caragar los datos de un archivo .csv . La tabla carpeta_interviniente almacenará tanto los nombres de los intervinientes (ya sea víctima o imputado) como un campo tipo que indicará el rol de cada interviniente. A continuación, detallo los pasos para la normalización y el script de carga.
Para estructurar la base de datos siguiendo la normalización , podemos utilizar dos tablas: carpetas, carpeta_delitos y carpeta_intervinientes.
Paso 1: Estructura de las tablas normalizadas
- Tabla
carpetas: Almacena los datos de la carpetas, sin víctimas, imputados ni delitos (ya que estos estarán en sus tablas correspondientes).
-- Tabla principal de carpetas
CREATE TABLE carpetas (
id INT PRIMARY KEY AUTO_INCREMENT,
carpeta VARCHAR(200),
distrito VARCHAR(200),
fecha_carpeta DATE,
num_inv VARCHAR(20),
tipo_solicitud VARCHAR(200),
juez VARCHAR(200)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb
2.-Tabla carpeta_intervinientes: Almacena los intervinientes (ya sea víctima o imputado) y el tipo de interviniente.
La tabla carpeta_intervinientes almacenará tanto los nombres de los intervinientes (ya sea víctima o imputado) como un campo tipo que indicará el rol de cada interviniente(víctima o imputado). A continuación, detallo los pasos para la normalización y el script de carga.
-- Tabla para intervinientes (víctimas e imputados)
CREATE TABLE carpeta_intervinientes (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(200),
tipo VARCHAR(20),
carpeta_id INT,
FOREIGN KEY (carpeta_id) REFERENCES carpeta(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.-Tabla carpeta_delitos: Almacena los delitos asociados a cada carpeta.
-- Tabla para delitos asociados a cada carpeta
CREATE TABLE carpeta_delitos (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(200),
carpeta_id INT,
FOREIGN KEY (carpeta_id) REFERENCES carpeta(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Paso 1: Estructura de las tablas normalizadas
- Tabla
carpeta: Almacena los datos de la carpeta, sin víctimas, imputados ni delitos (ya que estos estarán en sus tablas correspondientes). - Tabla
carpeta_interviniente: Almacena los intervinientes (ya sea víctima o imputado) y el tipo de interviniente. - Tabla
carpeta_delito: Almacena los delitos asociados a cada carpeta.
carpeta, y luego procesar los campos de intervinientes (victima e imputado) y delito, separándolos y asignándolos a las tablas correspondientes.- Los delitos se guarden en la tabla
carpeta_delito. - Los intervinientes se guarden correctamente en la tabla
carpeta_interviniente(exclusivamente los valores de las columnasvictimaeimputado). - El juez se mantenga sin normalización en la tabla
carpetas.
Ajustes al Código
- El campo
juezse almacenará solo en la tablacarpeta. - Los intervinientes se identificarán y guardarán en
carpeta_intervinientesegún el tipo (víctima o imputado). - Los delitos se almacenarán exclusivamente en la tabla
carpeta_delito.
Código PHP Ajustado
Aquí está el código ajustado para reflejar las correcciones:
<?php
// Configuración de la base de datos
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "dbaudiencias";
// Conexión a la base de datos
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Conexión fallida: " . $conn->connect_error);
}
// Ruta del archivo CSV
$csvFile = 'CARPETAS.csv';
// Función para convertir fechas en formato DD/MM/YYYY a YYYY-MM-DD
function convertirFecha($fecha) {
$fechaPartes = explode('/', $fecha);
return (count($fechaPartes) === 3) ? $fechaPartes[2] . '-' . $fechaPartes[1] . '-' . $fechaPartes[0] : null;
}
// Abrir el archivo CSV
if (($handle = fopen($csvFile, 'r')) !== FALSE) {
// Saltar la primera fila si tiene encabezados
fgetcsv($handle, 1000, ',');
// Preparar la consulta para insertar datos
while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {
// Insertar la carpeta en la tabla principal
$carpeta = $conn->real_escape_string($data[0]);
$distrito = $conn->real_escape_string($data[1]);
$fecha_carpeta = convertirFecha($data[2]);
$num_inv = $conn->real_escape_string($data[3]);
$tipo_solicitud = $conn->real_escape_string($data[4]);
$juez = $conn->real_escape_string($data[5]); // Juez se guarda únicamente en la tabla carpeta
$sqlCarpeta = "INSERT INTO carpeta (carpeta, distrito, fecha_carpeta, num_inv, tipo_solicitud, juez)
VALUES ('$carpeta', '$distrito', '$fecha_carpeta', '$num_inv', '$tipo_solicitud', '$juez')";
if ($conn->query($sqlCarpeta)) {
$carpeta_id = $conn->insert_id;
// Insertar los intervinientes (víctimas e imputados) en `carpeta_interviniente`
$intervinientes = [
['tipo' => 'victima', 'nombres' => explode(',', $data[8])],
['tipo' => 'imputado', 'nombres' => explode(',', $data[6])]
];
foreach ($intervinientes as $interviniente) {
foreach ($interviniente['nombres'] as $nombre) {
$nombre = trim($conn->real_escape_string($nombre));
if (!empty($nombre)) {
$sqlInterviniente = "INSERT INTO carpeta_interviniente (nombre, tipo, carpeta_id)
VALUES ('$nombre', '{$interviniente['tipo']}', $carpeta_id)";
if (!$conn->query($sqlInterviniente)) {
echo "Error al insertar interviniente: " . $conn->error;
}
}
}
}
// Insertar los delitos en `carpeta_delito`
$delitos = explode(',', $data[7]);
foreach ($delitos as $delito) {
$delito = trim($conn->real_escape_string($delito));
if (!empty($delito)) {
$sqlDelito = "INSERT INTO carpeta_delito (nombre, carpeta_id) VALUES ('$delito', $carpeta_id)";
if (!$conn->query($sqlDelito)) {
echo "Error al insertar delito: " . $conn->error;
}
}
}
} else {
echo "Error al insertar carpeta: " . $conn->error;
}
}
fclose($handle);
echo "Los datos se han cargado correctamente.";
} else {
echo "No se pudo abrir el archivo CSV.";
}
// Cerrar la conexión
$conn->close();
?>
Comentarios
Publicar un comentario