2012-03-30 9 views
2

現在、データベースを作成しています。これは、paperという名前のテーブルに格納されているパブリケーションをアップロードすることができ、paper_id、タイトル、抽象ファイル名およびtopic_idを格納します。トピックと呼ばれるtopic_idとtopic_nameというテーブルがあります。これはユーザーがパブリケーションのトピックを選択するために使用します。しかし、私はユーザーが少なくとも3つのトピックを選択できるようにしたい、これはこのシステムを使用して可能ですか?私はそれを行う方法のアイデアを使い果たして、大いに助けになるでしょう。複数の項目をmysqlの列に保持する

答えて

8

paperテーブルにtopic_idを保存しないでください。代わりに、topic_idpaper_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> 

そのような中topic_idのカンマ区切りのリストとして(1列に複数の値を格納しようとするのは良いアイデアだけでは決してありませんpaper表)。その理由は、照会するためには、実行中の複雑さを引き起こし、照会時に列索引を使用できなくするFIND_IN_SET()を使用する必要があるからです。

+0

私はpaper_topicsテーブルに紙とそのトピック/トピックを追加するにはどうすればよい、ありがとう! –

+0

@NickPocock 'INSERT INTO paper_topics(paper_id、topic_id)VALUES()' –

+0

PHPでこれを行う方法はありますか? –

0

問題ありません。JSONのようなシリアル化を使用できます。

+1

私は彼が1つを求めて読んだことはありません... – Shomz

関連する問題