2017-01-31 1 views
0

私は記事とその著者をモデリングしています。各記事は複数の著者を持ち、各著者は複数の記事を持つことができます。特定の記事の作者の順序を保持することが重要です(特定の記事の作者のリストの1番目は最後の作者とは大きく異なります)。著者の順番を維持するにはどうすればよいですか? (私はpostgres、9.4を使用しています)SQL(postgres)の多対多リレーションシップは「順序付け」されていますか?

"author_id、article_id"の中間テーブルを介して古典的な多対多は、特定の記事の作者の順序を保持しません。 articleテーブルに「author_ids」列を追加し、それを「AUTHOR_ID、のarticle_id、author_rank」

  • スクラップ中間テーブルを作り、

    1. がauthor_articlesテーブルにauthor_rank列を追加します。私は2つのソリューションを参照してくださいそこに著者IDの配列を保持します。 (参照整合性の自動チェックが失われてもシンプルさを失う)

    他の解決方法はありますか? 2つの解決策のいずれかの理由はずっと悪いですか?ありがとう!

  • 答えて

    0

    ほとんどの場合、最初のソリューションを使用することを強くお勧めします。私はPostgresでは、この決定は他のほとんどのデータベースよりも難しいと言います。 Postgresは、配列を強力にサポートしています。おそらく、第2の解決策では、あなたが望むものの大半を行うことができます。おそらく最も重要なのは、あなたが明示的に外部キー関係を宣言することができます

    1. 上記、最初のソリューションは、あなたはおそらくやりたい多くのことを行うことができます。これにより、データベースはデータの整合性を保証できます。

    2. 最初の方法は、「著者が書いた本がいくつあるか」などの質問に簡単に答えることができます。
    3. 最初の方法は、「2人の著者が最も多くの書籍を一緒に書いている」などの質問に簡単に答えることができます。
    4. 最初の方法は、「どの書籍が著者を共有しているか」などの質問に簡単に答えることができます。

    など。 (私は配列以外のものはすべて配列を使って問い合わせることができると認識しています)。

    2番目の方法(配列を使用する)は "単純な"方法ではないと思います。参照整合性の欠如は、データベースが使用されるにつれて大きな問題です。 「標準ではない」配列機能(標準SQLとは対照的)を理解する必要があるため、データベースを直接照会できるユーザーが制限されます。

    すべては、配列が良い選択であるいくつかの状況があります。私はこれがこれらのユースケースの1つであることを疑うだけです。

    +0

    広告4)「どの著者が2人の著者を共有していますか? – joop

    1

    好ましいオプションは、author_rankの列です。

    だから、あなたが持っているでしょう:

    1. この表に必要なすべての列を含むArticleテーブルと各記事の一意のID(article_id

    2. はあなたが必要とするすべての列を含むAuthor表このテーブルには、各著者のユニークなID(author_id

    3. 第3テーブルauthor_articlesテーブルの両方を接続するあなたが提案し、追加の列(author_rank

    article_idauthor_idによってRこれは、ユーザーインターフェイスの面でimplimentする最も簡単かつ最も簡単です。

    クエリは簡単に記述できます。

    記事の著者になるには、author_rankからauthor_articlesの順に入力してください。article_id

    関連する情報のみを1つのテーブルにまとめておくことをお勧めします。 このようにして、別のテーブルにリンクしたいと思った場合、レビューアテーブルを読んでください:記事をレビューした人の集合。デザイン記事テーブルに戻ることはありません。

    私は2番目の選択肢には全く行きません。

    あなたは実際に単純さを増やすわけではありません。実際にはもっと複雑にしています。例えば1つの列にすべてのauthor_Idsを配置する:togather author_Idsを配置し、表示するときにそれらを区切るコードを記述する必要があります。 あなたは、単にクエリを使用するのではなく、ソフトウェアの断片を書くことになります。

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

    関連する問題