Mysql
 sql >> Base de données >  >> RDS >> Mysql

La normalisation est-elle nécessaire dans ce cas ?

Compte tenu de votre question sur les mises à jour, une réponse mise à jour :

Je ne vois vraiment aucun avantage à diviser cette table

id | some_unique_field | name | sex | university

Vous devez absolument scinder ce tableau :

id | fundraiser_id | donation_amount | name | sex | university

Dans ceci :

donation
id | fundraiser_id | donation_amount | donator_id

fundraiser
id | charity | ....

donator
id | name | sex | university

Cela facilitera l'obtention du montant donné par personne.

Si vous souhaitez importer votre feuille de calcul, je vous recommande de procéder comme suit :

Étape 1 :créez une table de trous noirs comme suit :

DROP TABLE IF EXISTS `test`.`bh_donations`;
CREATE TABLE  `test`.`bh_donations` (
  `fundraiser_name` varchar(45) NOT NULL,
  `donation_amount` decimal(10,2) NOT NULL,
  `name` varchar(45) NOT NULL,
  `sex` char(1) NOT NULL,
  `university` varchar(45) NOT NULL
) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1;    

Vous n'avez pas besoin d'un id ici, mais si cela simplifie votre code, n'hésitez pas à l'ajouter.

Étape 2, ajoutez un déclencheur à la table blackhole pour le traiter.

DELIMITER $$

CREATE TRIGGER bi_bh_donations BEFORE INSERT ON bh_donations FOR EACH ROW
BEGIN
  DECLARE mydonater_id integer;
  DECLARE myfundraiser_id integer;

  SELECT f.id INTO myfundraiser_id FROM fundraiser f 
    WHERE f.name = new.fundraiser_name LIMIT 1;

  IF f.id IS NULL THEN BEGIN
    SELECT error_fundraiser_is_unknown FROM table_error;
  END; END IF;

  SELECT d.id INTO mydonator_id FROM donator d
    WHERE d.name = new.name AND d.sex = new.sex AND d.university = new.university
  LIMIT 1;

  IF mydonator_id IS NULL THEN BEGIN 
    INSERT INTO donator (name, sex, university)
    VALUES (new.name, new.sex, new,university);
  END; END IF;

  SELECT LAST_INSERT_ID() INTO mydonator_id;

  INSERT INTO donation (fundraiser_id, donation_amount, donator_id)
    VALUES (myfundraiser_id, new.amount, mydonater_id); 
END$$

DELIMITER ;

Étape 3, utilisez LOAD DATA INFILE pour importer les données

LOAD DATA INFILE 'data.csv' INTO TABLE bh_donations
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Maintenant, vous pouvez simplement lire les lignes Excel dans la table blackhole en enregistrant le fichier Excel au format CSV.
Et en utilisant LOAD DATA INFILE pour lire les données dans la table blackhole.

Voir :tables blackhole :http://dev. mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html
plus de blackhole :Utilisations créatives du moteur de blackhole
déclencheurs :http://dev.mysql.com /doc/refman/5.5/en/triggers.html
charger le fichier de données :http://dev .mysql.com/doc/refman/5.5/en/load-data.html

J'espère que cela vous aidera.