【问题标题】:How to implement a disjoint contraint on 1:1 relation in PostgreSQL?如何在 PostgreSQL 中实现 1:1 关系的不相交约束?
【发布时间】:2018-02-16 07:03:34
【问题描述】:

我需要实现一个实体的特化,使用一对一的关系,让我们这样说:

create table vehicles (
  vehicle_id int primary key,
  ...
)

create table cars (
  car_id int primary key,
  vehicle_id int references vehicles(vehicle_id),
  ...
)

create table bikes (
  bike_id int primary key,
  bike_id int references vehicles(vehicle_id),
  ...
)

现在,我想强制执行脱节约束,以确保车辆既可以是汽车也可以是自行车,可能两者都不是,但绝不可能两者兼而有之。据我了解,通过 RDBM 本身实现并不容易,因此我决定在应用程序(Ruby on Rails)中验证这一点。在这种情况下,我认为如果我反过来做关系会更容易验证,因为它在插入期间不需要任何额外的选择和锁定:

create table vehicles (
  vehicle_id int primary key,
  car_id int references cars(car_id),
  bike_id int references bikes(bike_id),
  ...
)

create table cars (
  car_id int primary key,
   ...
)

create table bikes (
  bike_id int primary key,
  ...
)

现在,我发现没有一个不相交的约束实现使用这种方式。它有什么我看不到的缺点吗?

【问题讨论】:

    标签: sql database postgresql database-design


    【解决方案1】:

    只需添加一个 CONSTRAINT CHECK,这样的答案应该可以回答

    ALTER TABLE ONLY vehicles
        ADD CONSTRAINT cars_or_bikes  CHECK (car_id IS NULL OR bike_id IS NULL);
    

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多