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

mysqlの列に複数のアイテムを保持する

    topic_idを保存しないでください paper テーブル。代わりに、topic_idをリンクする別の正規化された(多対多)テーブルを作成します paper_idへ 。

    /* Each paper can exist in this table as many times as necessary for all its topics */
    CREATE TABLE paper_topics (
      paper_id INT NOT NULL,
      topic_id INT NOT NULL,
      FOREIGN KEY (paper_id) REFERENCES paper (paper_id),
      FOREIGN KEY (topic_id) REFERENCES topic (topic_id),
      PRIMARY KEY (paper_id, topic_id)
    );
    

    これにより、論文ごとに必要な数のトピックを保存できます。

    論文のトピックを取得するには、次を使用します:

    SELECT 
      paper.*,
      topic_name
    FROM 
      paper
      LEFT JOIN paper_topics ON paper.paper_id = topic.paper_id
      LEFT JOIN topic ON topic.topic_id = paper_topic.topic_id
    WHERE paper.paper_id = <some paper id value>
    

    1つの列に複数の値を格納しようとすることは決して良い考えではありません(topic_idのコンマ区切りのリストなど)。 paper テーブル)。その理由は、それに対してクエリを実行するには、 FIND_IN_SET() これにより、結合の実行が複雑になり、クエリ時に列インデックスを利用できなくなります。



    1. MySQL:ORなしでcol IN(null、)が可能なテーブルから*を選択します

    2. OracleビッグデータSQL

    3. MySQLユーザー定義変数のストレージ制限

    4. MacOSにXAMPPをインストールした後にMySQLサーバーに接続する方法