sql >> Database >  >> RDS >> PostgreSQL

Beperkingen van polymorfe associaties voor buitenlandse sleutels. Is dit een goede oplossing?

Het grootste probleem dat ik heb met PostgreSQL's INHERITS implementatie is dat u geen refererende sleutelverwijzing naar de bovenliggende tabel kunt instellen. Er zijn veel gevallen waarin u dat moet doen. Zie de voorbeelden aan het einde van mijn antwoord.

De beslissing om tabellen, weergaven of triggers buiten Rails te maken, is de cruciale. Als je eenmaal besluit dat te doen, denk ik dat je net zo goed de allerbeste structuur kunt gebruiken die je kunt vinden.

Ik gebruik al lang een bovenliggende basistabel, waarbij ik disjuncte subtypen afdwing met behulp van externe sleutels. Deze structuur garandeert dat er maar één associatie kan bestaan ​​en dat de associatie wordt omgezet in het juiste subtype in de bovenliggende tabel. (In Bill Karwins diavoorstelling over SQL-antipatterns , deze benadering begint op dia 46.) Dit vereist geen triggers in de eenvoudige gevallen, maar ik geef meestal één bijwerkbare weergave per subtype en heb clientcode nodig om de weergaven te gebruiken. In PostgreSQL vereisen bijwerkbare weergaven het schrijven van triggers of regels. (Voor versies vóór 9.1 zijn regels vereist.)

In het meest algemene geval hebben de onsamenhangende subtypes niet hetzelfde aantal of hetzelfde soort attributen. Daarom hou ik van weergaven die kunnen worden bijgewerkt.

Tabelovererving is niet overdraagbaar, maar dit soort structuur wel. Je kunt het zelfs in MySQL implementeren. In MySQL moet u de CHECK-beperkingen vervangen door refererende sleutelverwijzingen naar tabellen met één rij. (MySQL analyseert en negeert de beperkingen van CHECK.)

Ik denk niet dat je je zorgen hoeft te maken over dataduplicatie. In de eerste plaats ben ik er vrij zeker van dat gegevens niet worden gedupliceerd tussen bovenliggende tabellen en overnemende tabellen. Het lijkt gewoon zo. In de tweede plaats, duplicatie of afgeleide gegevens waarvan de integriteit volledig wordt gecontroleerd door de dbms, is geen bijzonder bittere pil om te slikken. (Maar ongecontroleerd duplicatie is.)

Denk erover na of verwijderingen trapsgewijs moeten worden uitgevoerd.



  1. Hoe de beginwaarde en automatische verhoging in MySQL in te stellen?

  2. Gecorreleerde subquery werkt anders voor Oracle 12c en 11g

  3. Oracle - Probleem bij het maken van een trigger die een andere tabel bijwerkt

  4. Postgresql:Geen toegang tot bestand « $libdir/postgis-2.1 » geen dergelijk bestand of map