sql - 创建 PostgreSQL 表 + 关系 - 关系问题 - 一对一

标签 sql postgresql one-to-many database-schema one-to-one

所以我应该完全按照这个 ERD 描述的方式创建这个模式 + 关系。在这里我只显示我遇到问题的表:

I am supposed to have ONE TO ONE but I get ONE TO MANY

所以我试图让它成为一对一,但出于某种原因,无论我改变什么,我都会在任何有外键的表上得到一对多。

这是我对这两个表的sql。

        CREATE TABLE lab4.factory(

            factory_id      INTEGER         UNIQUE,
            address         VARCHAR(100)    NOT NULL,
            PRIMARY KEY ( factory_id )

        );

        CREATE TABLE lab4.employee(

            employee_id     INTEGER         UNIQUE,
            employee_name   VARCHAR(100)    NOT NULL,
            factory_id      INTEGER         REFERENCES      lab4.factory(factory_id),
            PRIMARY KEY ( employee_id )

        );

在这里我得到了同样的东西。我没有得到一对一的关系,而是一对多的关系。 Invoiceline 是一个弱实体。

it needs to be ONE TO ONE

这是我对第二张图片的代码。

        CREATE TABLE lab4.product(

            product_id      INTEGER     PRIMARY KEY,
            product_name    INTEGER     NOT NULL

        );


        CREATE TABLE lab4.invoiceLine(

            line_number     INTEGER     NOT NULL,
            quantity        INTEGER     NOT NULL,
            curr_price      INTEGER     NOT NULL,
            inv_no          INTEGER     REFERENCES      invoice,
            product_id      INTEGER     REFERENCES      lab4.product(product_id),
            PRIMARY KEY ( inv_no, line_number )

        );

如果有任何帮助,我将不胜感激。谢谢。

最佳答案

一对一在标准 SQL 中不能很好地表示为一流的关系类型。与使用连接器表和两个一对多关系实现的多对多非常相似,SQL 中没有真正的“一对一”。

有几个选项:

  • 创建一个普通的外键约束(“一对多”样式),然后在引用的 FK 列上添加一个 UNIQUE 约束。这意味着在引用列中只能出现一个引用值,使其成为一对一可选的。这是一种相当简单且相当宽容的方法,效果很好。

  • 使用可以模拟 1:m 的正常 FK 关系,并让您的应用确保它在实践中永远只是 1:1。我不推荐这样做,添加 FK 唯一索引只会对写入性能造成很小的负面影响,它有助于确保数据有效性、查找应用程序错误并避免混淆稍后需要修改架构的其他人。

  • 创建互惠外键 - 仅当您的数据库支持可延迟外键约束时才有可能。这对代码来说有点复杂,但允许您实现一对一的强制关系。每个实体在唯一列中都有一个对其他实体 PK 的外键引用。一个或两个约束必须是 DEFERRABLEINITIALLY DEFERRED 或与 SET CONSTRAINTS 调用一起使用,因为您必须推迟其中一个约束检查以设置循环依赖。这是一项相当先进的技术,对于绝大多数应用程序来说并不是必需的。

  • 如果您的数据库支持,请使用预提交触发器,这样您就可以验证在插入实体 A 时是否恰好也插入了一个实体 B,反之亦然,并进行相应的更新和删除检查。这可能很慢并且通常是不必要的,而且许多数据库系统不支持预提交触发器。

关于sql - 创建 PostgreSQL 表 + 关系 - 关系问题 - 一对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15037349/

相关文章:

SQL group by count where count 大于

sql - 如何在查询中合并两个表

postgresql - 基于另一个属性的自动增量属性

1 月和 12 月日期的 Postgresql 周数相同

sql-server - 当我添加 sql 脚本时,Spring Boot 不起作用

java - JPA 引用表映射

具有索引匹配较少 WHERE 列的 MySQL 查询比索引匹配所有列更快

ruby-on-rails - Ruby on Rails - 帮助向应用程序添加徽章

java - JPA一对多过滤

mysql - 如何从 csv 文件插入表格的选定列