PostgreSQL代码中的0对多和1对多关系

hrirmatl  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(256)

来自一篇关于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会生成这个表示零到多的乌鸦脚符号呢?

jckbn6z7

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,N1:1..N1..N:1..N关系(不是…:0,N)在SQL中表示起来非常困难,因为您遇到了先有鸡还是先有蛋的问题(请参见How to Create a real one-to-one relationship in SQL Server1:N relationship where N must be at least one entry)。

相关问题