“天文学家发现恒星”的关系是m:n,因为天文学家可以发现许多恒星,一颗恒星也可以从许多天文学家那里发现。
无论如何,每颗恒星都会有一个发现日期。如果有许多天文学家在研究它,他们应该同时做,否则,只有第一个得到了这个发现的功劳。
因此,在PostgreSQL中,我们有:
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和条目插入到所发现的表中。
有什么想法吗?谢谢!
发布于 2014-03-09 12:28:01
我只需将discovery_date列移动到discovered表
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)
);现在你遇到了同一颗星的多个日期的问题,但正如你在问题中所说的,只有第一个(或多个)才能得到学分。
https://stackoverflow.com/questions/22278279
复制相似问题