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

Трябва ли да добавя колона тип за проектиране на наследяване в postgreSQL?

Разбира се, можете да направите това, например, за да наложите, че само една подтаблица може да препраща към даден ред:

CREATE TABLE Super_Table (
  super_id SERIAL PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  UNIQUE KEY (super_id, sub_type) 
);

CREATE TABLE Sub_Table_A (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'A'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

CREATE TABLE Sub_Table_B (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'B'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

Сега няма начин ред в Super_Table да бъде препратен от ред в двете подтаблици. Редът в Super_Table трябва да има или 'A', или 'B' и така само една от подтаблиците може да удовлетвори препратката към външен ключ.

Re your comment:

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

По принцип, тъй като индексите съществуват само върху една таблица, ако имате уникално ограничение за вашата родителска таблица, тогава как може да наложи тази уникалност върху родителя и всички негови деца? Децата могат да вмъкнат стойности в своите таблици, които вече съществуват в родителя, или родителят може да вмъкне стойност, която вече съществува в едно от децата.

По същия начин външните ключове не могат да препращат към родителската таблица и/или нейните деца, тъй като е двусмислено кой ред е препратен, ако могат да съществуват множество редове в родител/деца със същия първичен ключ или уникална стойност.

Това са известни и неразрешени ограничения на INHERITS в PostgreSQL. Дизайнът, който показах по-горе, разрешава проблема за първичния ключ, но не и за вторичните уникални ключове.

http://archives.postgresql.org/pgsql-hackers/2010 -05/msg00285.php




  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. Какво точно прави/този отчет за данни в SAS? PostgreSQL еквивалент?

  3. Как да затворите пропуските в уязвимостите в PostgreSQL

  4. Python postgreSQL sqlalchemy прави заявка за колона DATERANGE

  5. GREATEST() Функция в PostgreSQL