PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Contraintes de clé étrangère d'association polymorphe. Est-ce une bonne solution?

Le plus gros problème que j'ai avec INHERITS de PostgreSQL l'implémentation est que vous ne pouvez pas définir une référence de clé étrangère à la table parent. Il y en a beaucoup des cas où vous devez le faire. Voir les exemples à la fin de ma réponse.

La décision de créer des tables, des vues ou des déclencheurs en dehors de Rails est cruciale. Une fois que vous avez décidé de le faire, je pense que vous pourriez aussi bien utiliser la meilleure structure que vous puissiez trouver.

J'ai longtemps utilisé une table parent de base, appliquant des sous-types disjoints à l'aide de clés étrangères. Cette structure garantit qu'une seule association peut exister et que l'association se résout dans le bon sous-type dans la table parent. (Dans le diaporama de Bill Karwin sur les antipatterns SQL , cette approche commence à la diapositive 46.) Cela ne nécessite pas de déclencheurs dans les cas simples, mais je fournis généralement une vue pouvant être mise à jour par sous-type et j'exige que le code client utilise les vues. Dans PostgreSQL, les vues pouvant être mises à jour nécessitent l'écriture de déclencheurs ou de règles. (Les versions antérieures à 9.1 nécessitent des règles.)

Dans le cas le plus général, les sous-types disjoints n'ont pas le même nombre ou le même type d'attributs. C'est pourquoi j'aime les vues pouvant être mises à jour.

L'héritage de table n'est pas portable, mais ce type de structure l'est. Vous pouvez même l'implémenter dans MySQL. Dans MySQL, vous devez remplacer les contraintes CHECK par des références de clé étrangère vers des tables à une ligne. (MySQL analyse et ignore les contraintes CHECK.)

Je ne pense pas que vous ayez à vous soucier de la duplication des données. En premier lieu, je suis à peu près sûr que les données ne sont pas dupliquées entre les tables parentes et les tables héritées. Cela apparaît juste comme ça. En second lieu, la duplication ou les données dérivées dont l'intégrité est entièrement contrôlée par le dbms ne sont pas une pilule particulièrement amère à avaler. (Mais incontrôlé la duplication est.)

Réfléchissez à la cascade de suppressions.