Можно ли добиться безопасного соединения типов в Postgres, где я не могу объединить два разных типа идентификаторов?Я планировал создать новый домен для каждого типа идентификатора (например, типа user_id
, типа settings_id
и предотвратить недопустимые объединения, такие как присоединение к users.user_id = settings.settings_id
. Я пытался сделать это с доменами, но он все еще позволял объединениепройти путь. Есть ли способ достичь этого?
db-name=# CREATE DOMAIN uuid1 AS uuid;
CREATE DOMAIN
db-name=# CREATE TABLE foo(id uuid1 PRIMARY KEY DEFAULT uuid_generate_v1mc());
CREATE TABLE
db-name=# CREATE DOMAIN uuid2 AS uuid;
CREATE DOMAIN
db-name=# CREATE TABLE bar(id uuid2 PRIMARY KEY DEFAULT uuid_generate_v1mc());
CREATE TABLE
db-name=# SELECT * FROM foo INNER JOIN bar ON foo.id = bar.id;
(0 rows)
В настоящее время мы получаем безопасность этого типа на уровне ORM с помощью Haskell Persistent / Esqueleto, но мы бы хотели, чтобы он существовал на уровне SQLтоже, если возможно.