PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Ограничения на външен ключ на полиморфна асоциация. Това добро решение ли е?

Най-големият проблем, който имам с INHERITS на PostgreSQL реализацията е, че не можете да зададете препратка към външен ключ към родителската таблица. Има много от случаите, в които трябва да направите това. Вижте примерите в края на моя отговор.

Решението за създаване на таблици, изгледи или тригери извън Rails е решаващото. След като решите да направите това, мисля, че можете да използвате най-добрата структура, която можете да намерите.

Отдавна използвам базова родителска таблица, налагайки несвързани подтипове с помощта на външни ключове. Тази структура гарантира, че може да съществува само една асоциация и че асоциацията се разрешава до правилния подтип в родителската таблица. (В слайдшоуто на Бил Карвин за SQL antipatterns , този подход започва на слайд 46.) Това не изисква тригери в простите случаи, но обикновено предоставям един обновяем изглед на подтип и изисквам клиентски код за използване на изгледите. В PostgreSQL актуализираните изгледи изискват писане на тригери или правила. (Версиите преди 9.1 изискват правила.)

В най-общия случай несвързаните подтипове нямат същия брой или вид атрибути. Ето защо харесвам изгледи с възможност за актуализиране.

Наследяването на таблицата не е преносимо, но този вид структура е. Можете дори да го внедрите в MySQL. В MySQL трябва да замените ограниченията CHECK с препратки към външни ключове към таблици с един ред. (MySQL анализира и игнорира ограниченията CHECK.)

Не мисля, че трябва да се притеснявате за дублиране на данни. На първо място, почти съм сигурен, че данните не се дублират между родителските таблици и наследяващите таблици. Просто изглежда така. На второ място, дублиране или извлечените данни, чиято цялост се контролира напълно от dbms, не е особено горчив хап за преглъщане. (Но неконтролирано дублирането е.)

Помислете дали изтриванията трябва да бъдат каскадни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Индекс, обхващащ множество таблици в PostgreSQL

  2. Проблем с подреждането на знаци с ударения в PostgreSQL 8.4

  3. Възстановяване на резервно копие на PostgreSQL и TimescaleDB с помощта на ClusterControl CLI

  4. Решение за ускоряване на бавна SELECT DISTINCT заявка в Postgres

  5. Предимства при използването на URLField пред TextField?