簡體   English   中英

這是一對一的例子嗎?

[英]Is this an example of One To One?

我的老師告訴我,以下代碼是一對一關系的示例:

CREATE TABLE PERSON (ID INT AUTO_INCREMENT, NAME VARCHAR(20) UNIQUE NOT NULL,
CONSTRAINT PK_PERSON PRIMARY KEY (ID));

CREATE TABLE PHRASE (ID INT AUTO_INCREMENT, PHRASE VARCHAR(50) UNIQUE NOT NULL, ID_PERSON INT,
CONSTRAINT PK_PHRASE PRIMARY KEY (ID),
CONSTRAINT FK_PHRASE FOREIGN KEY (ID_PERSON) REFERENCES PERSON(ID));

但是通過這種方式,我可以為同一個人設置兩個短語,這使我認為正確的答案如下:

CREATE TABLE PERSON (ID INT AUTO_INCREMENT, NAME VARCHAR(20) UNIQUE NOT NULL,
CONSTRAINT PK_PERSON PRIMARY KEY (ID));

CREATE TABLE PHRASE (ID INT AUTO_INCREMENT, PHRASE VARCHAR(50) NOT NULL UNIQUE, ID_PERSON INT,
CONSTRAINT PK_PHRASE PRIMARY KEY (ID),
CONSTRAINT FK_PHRASE FOREIGN KEY (ID_PERSON) REFERENCES PERSON(ID),
CONSTRAINT FK_PHRASE2 UNIQUE (ID_PERSON));

第二個例子是一對一關系還是第一個?

您的評估是正確的。 強制ID_PERSON唯一的第二個選項是1:1關系。 辛苦了

您在評估中也是正確的,第一種方法允許同一個人使用多個短語,這成為1:1的關系。

替代理論

create table person (id int primary key, name varchar(20) unique);

create table phrase (id int primary key, phrase varchar(20) unique);

create table person_phrase (person_id int primary key, phrase_id int);

上面的內容還會導致人與短語之間的比例為1:1,但是對於人和短語會有單獨的表。 只要一個人只有一個短語,就可以將人和短語組合在一起。

此設計使您可以從1:1開始,並擴展到多對多關系,其中一個人可以有多個短語,而一個短語可以被許多人使用。 您可以通過將person_id + statement_id設置為primary來擴展到many:many。

第二個是一對一關系的示例。 第一個僅保證引用完整性得到維護。 這意味着它將確保PERSON_ID的值應存在於PERSON表中,同時允許您在表中輸入多個PERSON ID。

第二個示例具有外鍵約束以及PERSON ID上的唯一鍵,這維護了PERSON ID在PHRASE表中也應該是唯一的。

暫無
暫無

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

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