sql >> データベース >  >> RDS >> Mysql

この場合、正規化が必要ですか?

    更新に関する質問があれば、更新された回答:

    このテーブルを分割しても何のメリットもありません

    id | some_unique_field | name | sex | university
    

    このテーブルは必ず分割する必要があります:

    id | fundraiser_id | donation_amount | name | sex | university
    

    これに:

    donation
    id | fundraiser_id | donation_amount | donator_id
    
    fundraiser
    id | charity | ....
    
    donator
    id | name | sex | university
    

    これにより、1人あたりの寄付額を簡単に取得できるようになります。

    スプレッドシートをインポートする場合は、次のようにすることをお勧めします:

    ステップ1:次のようなブラックホールテーブルを作成します:

    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;    
    

    idは必要ありません ここにありますが、コードが単純化されている場合は、必ず追加してください。

    ステップ2、ブラックホールテーブルにトリガーを追加して処理します。

    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 ;
    

    ステップ3LOADDATAINFILEを使用してデータをインポートします

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

    これで、ExcelファイルをCSVとして保存することで、Excelの行をブラックホールテーブルに読み込むことができます。
    そしてLOAD DATA INFILEを使用します。 データをブラックホールテーブルに読み込みます。

    参照:ブラックホールテーブル: http://dev。 mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html
    その他のブラックホール:ブラックホールエンジンのクリエイティブな使用法
    トリガー: http://dev.mysql.com /doc/refman/5.5/en/triggers.html
    データをファイルにロード: http:// dev .mysql.com / doc / refman / 5.5 / en / load-data.html

    これがお役に立てば幸いです。



    1. 複数列の外部キー:すべてではなく、削除時に単一の列をNullに設定します

    2. MySQLでDjangoを設定するときの日時の値が正しくありません

    3. JSON列のMySQLクエリの値順

    4. MySQLのエラー1005(外部キー構文から?)