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

配列をmysqlに保存する方法は?

    次のようにこれに取り組むことをお勧めします:

    CREATE TABLE comments (
        comment_id int, 
        body varchar(100), 
        PRIMARY KEY (comment_id)
    );
    
    CREATE TABLE users (
        user_id int, 
        username varchar(20), 
        PRIMARY KEY (user_id)
    );
    
    CREATE TABLE comments_votes (
        comment_id int, 
        user_id int, 
        vote_type int, 
        PRIMARY KEY (comment_id, user_id)
    );
    

    複合主キー (comment_id, user_id) 交差テーブル comments_votes ユーザーが同じコメントに複数回投票するのを防ぎます。

    上記のスキーマにいくつかのデータを挿入しましょう:

    INSERT INTO comments VALUES (1, 'first comment');
    INSERT INTO comments VALUES (2, 'second comment');
    INSERT INTO comments VALUES (3, 'third comment');
    
    INSERT INTO users VALUES (1, 'user_a');
    INSERT INTO users VALUES (2, 'user_b');
    INSERT INTO users VALUES (3, 'user_c');
    

    それでは、ユーザー1に投票を追加しましょう:

    INSERT INTO comments_votes VALUES (1, 1, 1);
    INSERT INTO comments_votes VALUES (2, 1, 1);
    

    上記は、ユーザー1がコメント1と2にタイプ1の投票をしたことを意味します。

    同じユーザーがこれらのコメントの1つに再度投票しようとすると、データベースはそれを拒否します。

    INSERT INTO comments_votes VALUES (1, 1, 1);
    ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
    

    InnoDB を使用する場合 ストレージエンジンの場合は、外部キー を使用することも賢明です。 comment_idの制約 およびuser_id 交差テーブルのフィールド。ただし、MyISAM に注意してください。 、MySQLのデフォルトのストレージエンジンは、外部キー制約を強制しません:

    CREATE TABLE comments (
        comment_id int, 
        body varchar(100), 
        PRIMARY KEY (comment_id)
    ) ENGINE=INNODB;
    
    CREATE TABLE users (
        user_id int, 
        username varchar(20), 
        PRIMARY KEY (user_id)
    ) ENGINE=INNODB;
    
    CREATE TABLE comments_votes (
        comment_id int, 
        user_id int, 
        vote_type int, 
        PRIMARY KEY (comment_id, user_id),
        FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
        FOREIGN KEY (user_id) REFERENCES users (user_id)
    ) ENGINE=INNODB;
    

    これらの外部キーは、comments_votesの行を保証します comment_idはありません またはuser_id commentsに存在しない値 およびusers それぞれテーブル。外部キーは、機能するリレーショナルデータベースを持っている必要はありませんが、壊れた関係や孤立した行を回避するために絶対に不可欠です(つまり、参照整合性

    実際、参照整合性は、シリアル化された配列を単一のデータベースフィールドに格納する場合、実施するのが非常に困難であったものです。



    1. Laravel不明な列'updated_at'

    2. mysqliクエリは最初の行のみを返します

    3. 主キーSQLチュートリアル–データベースで主キーを定義する方法

    4. CentOS 8 /RHEL8にMySQL8.0をインストールする方法