如何指定PostgreSQL表上的关系也有枚举属性设置为特定值?

py49o6xq  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(106)

我正在使用kysely,一个用于Node.js的SQL生成工具,来进行PostgreSQL查询。现在我正在进行生成基表的迁移工作。我不是一个真正的SQLMaven,我过去主要做Ruby on Rails ORM的东西。
很抱歉,如果这个问题以前被问过,我试着做了很多搜索,但我的搜索词是模糊的,很难确定(“如何添加约束,第二个表属性有一个特定的值,当做一个关联”,等等)。
我想完成的是,如何说我的关系列也应该验证关联的记录具有特定的属性。所以我有这个:

await db.schema
  .createTable('key')
  .addColumn('id', 'uuid', c => c.primaryKey())
  .addColumn('name', 'varchar(32)', c => c.notNull())
  .addColumn('category', 'varchar(32)', c => c.notNull())
  .execute()

await db.schema
  .createTable('event')
  .addColumn('id', 'uuid', c => c.primaryKey())
  .addColumn('action_type_id', 'uuid', c =>
    c.references('key.id').notNull(),
  )

我很确定在原始SQL中会是这样的:

create table key {
  id uuid primary key,
  name varchar(32),
  category varchar(32),
};

create table event (
  id uuid primary key,
  action_type_id references key(id)
);

我想做的是这样的(伪代码):

create table key {
  id uuid primary key,
  name varchar(32),
  category varchar(32),
};

create table event (
  id uuid primary key,
  action_type_id references key(id) where key(category) == 'category1'
);

我怎么能在普通的PostgreSQL语法中做这样的事情呢?在那之后我大概能想出如何将它应用到kysely图书馆。
key表将有许多category/name对(unique(category, name)),其中category是一些小的值集合,name也是。

eyh26e7m

eyh26e7m1#

没有办法直接做到这一点,虽然有(至少)3种方法可以间接做到这一点
1.在插入/更新时在事件表上添加一个触发器,它查找action_type_id的类别并对其进行验证。
1.修改表以在key(id,category)上创建多列FK关系,然后在事件表中添加要求category为“category 1”的check约束
1.向模式中添加一个中间表,如“category 1 s”,它包含key(id,category)和对所需类别的检查约束,但也包含自己的单独id主键列,然后由events表引用。
可能还有其他一些方法来解决这个问题,但请记住,“最佳”解决方案将取决于许多因素,例如您希望每个表中有多少行,每个表中的行被修改的频率,以及最重要的是哪个为您提供了一个您满意的心理模型。
哦,值得一提的是,这不是Postgres的限制,而是一个一般的关系建模问题。如果你想进一步研究它,你正在寻找的术语是“条件外键”。

相关问题