簡體   English   中英

引用非唯一外鍵的聯接表

[英]join table referencing non unique foreign key

我在數據庫中有以下表格。 phrases允許存儲重復的短語。

CREATE TABLE phrases (
    id INTEGER PRIMARY KEY,
    phrase VARCHAR(1000),
    creation_date TIMESTAMP WITH TIME ZONE NOT NULL,
);

CREATE TABLE intents (
    id INTEGER PRIMARY KEY,
    name VARCHAR(10) UNIQUE
);

我想在短語和意圖之間創建一個聯接表。 我要強制執行:

  • 每個短語都存在於短語表中
  • 每個短語只出現一次

由於phrases的外鍵不是唯一的,因此以下操作失敗。

CREATE TABLE phrases_intents (
    phrase VARCHAR(1000) REFERENCES phrases (phrase),
    intent VARCHAR(10) REFERENCES intents (name),
    PRIMARY KEY (phrase),
);

允許此功能的最佳實踐是什么?

修改短語表以具有用於外鍵關系的唯一鍵。 也許:

CREATE TABLE phrases (
    id INTEGER PRIMARY KEY,
    phrase VARCHAR(1000),
    creation_date TIMESTAMP WITH TIME ZONE NOT NULL,
    unique (phrase, id)
);

然后在phrase_intents使用此鍵:

CREATE TABLE phrase_intents (
    phrase_intents_id serial primary key,
    phrase varchar(1000) not null,
    phrase_id int not null, 
    intent_id int references intents (id),
    foreign key (phrase, phrase_id) references phrases(phrase, id),
    unique (phrase)
);

您的條件得到滿足:

  1. 每個phrase都在phrases表中,因為它not null和外鍵引用。
  2. 每個不同的短語最多在此表中出現一次。 這是由於對phrase的唯一約束。

對於每一個短語准確出現一次需要填充表。 然后,您將需要在表上使用觸發器,以確保在創建新短語時會插入一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM