首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制同时存在多对多和一对一的信息(PostgreSQL)

强制同时存在多对多和一对一的信息(PostgreSQL)
EN

Stack Overflow用户
提问于 2014-03-09 04:09:44
回答 1查看 81关注 0票数 0

“天文学家发现恒星”的关系是m:n,因为天文学家可以发现许多恒星,一颗恒星也可以从许多天文学家那里发现。

无论如何,每颗恒星都会有一个发现日期。如果有许多天文学家在研究它,他们应该同时做,否则,只有第一个得到了这个发现的功劳。

因此,在PostgreSQL中,我们有:

代码语言:javascript
复制
CREATE TABLE astronomer ( 
    astronomer_id serial PRIMARY KEY,
    astronomer_name text NOT NULL UNIQUE
);

CREATE TABLE star ( 
    star_id serial PRIMARY KEY,
    star_name text NOT NULL UNIQUE,
    discovery_date date
);

CREATE TABLE discovered ( 
    star_id integer NOT NULL REFERENCES star,
    astronomer_id integer NOT NULL REFERENCES astronomer,
    CONSTRAINT pk_discovered PRIMARY KEY (star_id, astronomer_id) 
);

刁钻的问题:我想要执行的是,无论何时有恒星的发现日期,发现的表中至少会有一个条目,反之亦然。

我可以在表星型中创建一个唯一的键( star_id,discovery_date),然后将该组合用作表中发现的外键,而不是star_id。这将解决一半的问题,但仍然有可能有一个没有天文学家的discovered_date。

除了使用触发器进行检查之外,我看不到任何简单的解决方案,或者只允许通过存储过程输入数据,而存储过程同时会将discovery_date和条目插入到所发现的表中。

有什么想法吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-09 12:28:01

我只需将discovery_date列移动到discovered

代码语言:javascript
复制
CREATE TABLE astronomer ( 
    astronomer_id serial PRIMARY KEY,
    astronomer_name text NOT NULL UNIQUE
);

CREATE TABLE star ( 
    star_id serial PRIMARY KEY,
    star_name text NOT NULL UNIQUE
);

CREATE TABLE discovered ( 
    star_id integer NOT NULL REFERENCES star,
    astronomer_id integer NOT NULL REFERENCES astronomer,
    discovery_date date not null,
    CONSTRAINT pk_discovered PRIMARY KEY (star_id, astronomer_id) 
);

现在你遇到了同一颗星的多个日期的问题,但正如你在问题中所说的,只有第一个(或多个)才能得到学分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22278279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档