Clé étrangère POSTGRESQL référençant les clés primaires de deux tables différentes
J'ai deux tables Livres et des livres audio, qui ont tous deux ISBN que leurs clés primaires. J'ai une table writtenby qui a un isbn attribut qui a une contrainte de clé étrangère pour des Livres et des livres audio ISBN. Le problème vient quand je l'insérer dans writtenby est que postgresql veut le ISBN-je insérer dans writtenby à être à la fois des Livres et des livres audio. Il fait sens pour moi d'avoir un tableau writtenby qui stocke les auteurs et les livres/livres audio qu'ils ont écrit, mais cela ne se traduit pas en un tableau dans postgresql. La solution alternative, je pense à la mise en œuvre a été d'avoir deux nouvelles relations audiobook_writtenby et books_writtenby mais je ne suis pas sûr que c'est une bonne alternative. Pourriez-vous me donner une idée de comment je pourrais mettre en œuvre mon idée originale d'avoir une seule table writtenby de référencement de deux tables différentes ou comment je pourrais mieux la conception de ma base de données. Laissez-moi savoir si vous avez besoin de plus d'informations.
source d'informationauteur Jason Zhu
Vous devez vous connecter pour publier un commentaire.
Il n'y a plus d'un moyen de le faire dans PostgreSQL. Personnellement, je préfère cette façon.
Du SGBDR ne prennent pas en charge polymorphe des contraintes de clés étrangères. Ce que vous voulez faire est raisonnable, mais pas quelque chose de bien logés par le modèle relationnel et l'un des vrais problèmes de l'objet /relationnel d'adaptation d'impédance lors de la prise de la moraine d'oak ridges systèmes. Belle discussion sur ce, dans l'aile du WIki
Une approche à votre problème est peut-être pour faire une table séparée, known_isbns, et de définir des contraintes et/ou des déclencheurs sur des Livres et des livres audio, de sorte que le tableau contient tous les valide les isbn des deux types spécifiques de réserver des tables. Ensuite, votre FK contrainte sur writtenby vérifiera known_isbns.
Vous pouvez utiliser l'héritage de table pour un peu de obtenir le meilleur des deux mondes. Créer le audiobook_writtenby et books_writtenby avec un
INHERITS
clause de référencement du writtenby table. Les clés étrangères pourraient être définis au niveau enfant comme vous le décrivez, mais vous pouvez toujours les données de référence au niveau supérieur. (Vous pouvez aussi le faire avec un point de vue, mais il semble que l'héritage peut être plus propre dans ce cas.)Voir les docs:
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
Notez que vous aurez probablement souhaitez ajouter un AVANT déclencheur d'INSERTION sur le writtenby table si vous faites cela.
Dans cet exemple précis il n'y a absolument pas besoin d'utiliser plusieurs tables. Suffit d'utiliser la table "Livre" et ajouter les colonnes de "Livre audio", le cas échéant. Si tu dois faire la différence sur le niveau de la table avec de très colonnes spécifiques, de créer des vues. Avez-vous vérifié pour voir si un "Livre" et un "Livre Audio" avec le même contenu ont le même ISBN?