正如这个问题中的回答:PostgreSQL 中的基数 https://stackoverflow.com/questions/3135206/cardinality-in-postgresql,基数是使用强制执行的限制条件 http://www.postgresql.org/docs/9.1/static/ddl-constraints.html.
基数规则定义了允许的关系数量——一对多、多对多等。多对多是使用连接表实现的,一对多是使用外键实现的。
但是如何实现一对一或多(一对一+)关系。这与问:如何在 PostgreSQL 中强制执行最小基数?
一种实际情况是,需要存储个人(例如用户或客户)必须提供的地址(或电话号码)(但可以不止一个)。
Edit:
上述情况是一般问题的一个特例(基数为一)。一般问题是:如何强制任意数的基数?
As 壶回答了 https://stackoverflow.com/questions/9249660/postgresql-how-to-implement-minimum-cardinality/9251536#9251536 a non-null如果最小基数为 1,则可以使用 FOREIGN KEY 引用作为解决方法。它还将提供一个附加功能来在众多功能中选择默认值。
但考虑另一种情况team of Cricket http://en.wikipedia.org/wiki/Cricket和它的players。每支球队必须至少有 11 名球员才能获得团队资格。这里的最小基数是十一 (11)。
类似地,a 之间的关系course and a student在一所学校中,每个学生必须注册至少 5 门课程,并且每门课程必须至少有 10 名学生。
无法使用 CHECK 约束来指定这一点,所以我认为最好的方法是触发器:
http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html
http://www.postgresql.org/docs/9.1/static/plpgsql-trigger.html http://www.postgresql.org/docs/9.1/static/plpgsql-trigger.html
你最终会得到类似的结果(我还没有测试过它或任何东西):
CREATE TRIGGER at_least_one before INSERT, UPDATE, DELETE ON the_one_table FOR EACH ROW EXECUTE PROCEDURE check_at_least_one();
CREATE OR REPLACE FUNCTION check_at_least_one() RETURNS trigger AS $$
BEGIN
nmany := select count(*) from the_many_table where the_many_table.the_one_id=NEW.id;
IF nmany > 0 THEN
RETURN NEW;
END IF;
RETURN NULL;
END;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)