来自一篇关于https://www.postgresql.org/docs/current/ddl-constraints.html
上外键约束的PostgreSQL文章:
假设您有产品表:
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
我们还假设您有一个存储这些产品订单的表。我们希望确保orders表只包含实际存在的产品订单。因此,我们在orders表中定义一个引用products表的外键约束:
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products (product_no),
quantity integer
);
现在,不可能创建带有非NULL product_no条目的订单,这些条目不会出现在products表中。
这是0对多关系吗?
如何设置一对多关系?
通过这样做?
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products (product_no) NOT NULL,
quantity integer
);
如果是这样的话,那么当我按照上面的方式配置表时,为什么pgadmin4会生成这个表示零到多的乌鸦脚符号呢?
1条答案
按热度按时间jckbn6z71#
该乌鸦脚符号表示零对多关系。
不,它不是。不要混淆基数(有向)和关系类型。圆圈表示
orders
基数的下限(可以省略)-参见软件工程中的"many" vs "zero or many"/"one or many" crowfoot notation?。将
product_no
标记为NOT NULL
只会将 * 零或一 * 对多关系更改为 * 恰好一 * 对多关系。这两种关系通常都称为“一对多”或“1:N”关系。对于products
的基数,这可以表示为虚线-虚线或虚线-圆圈(或者,只是虚线)。现在,鱼尾纹上的圆圈(或破折号)正好在 many 边(
orders
)附近--是... -to-zero-or-many 还是... -to-one-or-many?在您的模式中,它确实是一个zero-or-many基数,因为product
可以有任意数量的orders
--包括0
。请注意,实际的
0,1:1,N
、1:1..N
或1..N:1..N
关系(不是…:0,N
)在SQL中表示起来非常困难,因为您遇到了先有鸡还是先有蛋的问题(请参见How to Create a real one-to-one relationship in SQL Server或1:N relationship where N must be at least one entry)。