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

  1. 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

  1. Tabla carpeta: Almacena los datos de la carpeta, sin víctimas, imputados ni delitos (ya que estos estarán en sus tablas correspondientes).
  2. Tabla carpeta_interviniente: Almacena los intervinientes (ya sea víctima o imputado) y el tipo de interviniente.
  3. Tabla carpeta_delito: Almacena los delitos asociados a cada carpeta.
El script PHP debe leer el archivo CSV, insertar la carpeta en la tabla carpeta, y luego procesar los campos de intervinientes (victima e imputado) y delito, separándolos y asignándolos a las tablas correspondientes.
  1. Los delitos se guarden en la tabla carpeta_delito.
  2. Los intervinientes se guarden correctamente en la tabla carpeta_interviniente (exclusivamente los valores de las columnas victima e imputado).
  3. El juez se mantenga sin normalización en la tabla carpetas.

Ajustes al Código

  1. El campo juez se almacenará solo en la tabla carpeta.
  2. Los intervinientes se identificarán y guardarán en carpeta_interviniente según el tipo (víctima o imputado).
  3. 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

Entradas populares de este blog

Normalizar valores

NORMALIZAR TABLA-audiencia_intervinientes

Listar audiencias