43

Books と Audiobooks の 2 つのテーブルがあり、どちらも主キーとして ISBN を持っています。isbnBooks and Audiobooks ISBN への外部キー制約を持つ属性を持つwrittenby テーブルがあります。

に挿入するときに発生する問題writtenbyは、postgresql が、挿入する ISBN がwrittenbyブックとオーディオブックの両方にあることを望んでいるということです。

著者と著者が書いた本/オーディオブックを格納するテーブルを持つことは理にかなっていますがwrittenby、これは postgresql のテーブルには変換されません。

私が実装を考えている代替ソリューションは、2 つの新しいリレーションを持つことaudiobook_writtenbyでしbooks_writtenbyたが、それが良い代替策であるかどうかはわかりません。

1 つのテーブルで 2 つの異なるテーブルを参照するという当初のアイデアをどのように実装するか、writtenbyまたはデータベースをより適切に設計するにはどうすればよいか教えてください。さらに情報が必要な場合はお知らせください。

4

4 に答える 4

8

テーブルの継承を使用して、両方の世界を最大限に活用できます。writtenby テーブルを参照する句を使用して、audiobook_writtenby および books_writtenby を作成しINHERITSます。説明したように、外部キーは子レベルで定義できますが、より高いレベルでデータを参照することはできます。(ビューでこれを行うこともできますが、この場合は継承の方がクリーンなように思えます。)

ドキュメントを参照してください:

http://www.postgresql.org/docs/current/interactive/sql-createtable.html

http://www.postgresql.org/docs/current/interactive/tutorial-inheritance.html

http://www.postgresql.org/docs/current/interactive/ddl-inherit.html

これを行う場合は、writeby テーブルに BEFORE INSERT トリガーを追加する必要があることに注意してください。

于 2012-04-09T03:04:35.803 に答える
5

RDBMS は多態的な外部キー制約をサポートしていません。あなたがやりたいことは合理的ですが、リレーショナル モデルと ORM システムを作成するときのオブジェクト リレーショナル インピーダンスの不一致の実際の問題の 1 つによってうまく対応できるものではありません。Ward's WIki でのこれに関する素晴らしい議論

問題への 1 つのアプローチは、別のテーブル、known_isbns を作成し、Books と AudioBooks に制約やトリガーを設定して、両方のタイプ固有の book テーブルのすべての有効な isbn がテーブルに含まれるようにすることです。次に、 writtenby の FK 制約が known_isbns に対してチェックされます。

于 2012-04-09T01:48:33.503 に答える
-2

この特定の例では、複数のテーブルを使用する必要はまったくありません。テーブル「Book」を使用し、該当する場合は「AudioBook」の列を追加するだけです。非常に特定の列を使用してテーブル レベルで区別する必要がある場合は、ビューを作成します。同じ内容の「書籍」と「オーディオブック」のISBNが同じかどうか確認しましたか?

于 2012-05-10T13:19:16.597 に答える