当前位置: 首页 > 面试题库 >

如何确保无关表之间的完整性?

龙昊焱
2023-03-14
问题内容

我刚刚开始学习数据库设计,并且我正在与Oracle 11G和SQL Developer一起工作。

我对数据库有以下3条业务规则:

  • 每个官员必须注册一个并且只能注册一个保险公司。每个保险公司可以注册一名或多名官员
  • 每个保险公司必须提供至少五种不同类型的保险类型。每种保险类型最多可以由4个保险公司提供,或者根本不提供
  • 每个保险类型可以由一个或多个官员来订阅。每个官员最多可以订阅同一家公司提供的五种不同的保险盖。

。。。

到目前为止, 一切顺利 ,我提出了五个表( INS_COY,OFFR,INS_TYPE,PROVIDE和SUBSCRIBE
)。由于INS_COY和INS_TYPE之间的关系以及OFFR和INS_TYPE之间的关系都是M:M关系,所以PROVIDE和SUBSCRIBE是组合表。

每个表的PK和FK属性如下:

INS_COY TABLE
coy_id -PK

OFFR TABLE
offr_id -PK
coy_id-(FK引用INS_COY.coy_id)

INS_TYPE TABLE
type_id -PK

PROVIDE
coy_id和TYPE_ID - (复合PK)
coy_id - (FK引用COY.coy_id)
TYPE_ID - (FK引用ins_type.type_id)

SUBSCRIBE
naf_no和TYPE_ID - (复合PK)
naf_no - (FK引用offr.offr_id)
TYPE_ID(FK引用ins_type.type_id)



表已成功创建,并插入了html" target="_blank">示例数据。

因此,问题是- 在订阅表上,我如何确保附在OFFR_ID上的TYPE_ID是由他所迷恋的COY提供的INS_TYPE?

样本数据表

即…从表中,“ offer 4250”被注册到“ coy 1”中,而“ coy 1”不提供“ ins_type
13”,但是,由于没有限制来检查,因此订阅了“ offr 1”订阅表上的“ ins_type 13”。


问题答案:

您可以使用受控冗余和复合FK约束来做到这一点:

CREATE TABLE offr (
    offr_id INT NOT NULL,
    coy_id INT NOT NULL,
    PRIMARY KEY (offr_id),
    FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id),
    UNIQUE KEY (offr_id, coy_id)
);

我添加了一个复合唯一键(offr_id,coy_id)来支持subscribe表上的复合FK约束。

CREATE TABLE provide (
    coy_id INT NOT NULL,
    type_id INT NOT NULL,
    PRIMARY KEY (coy_id, type_id),
    FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id)
);

这里的复合主键非常适合subscribe表上的复合FK约束。

CREATE TABLE subscribe (
    naf_no INT NOT NULL,
    coy_id INT NOT NULL,
    type_id INT NOT NULL,
    PRIMARY KEY (naf_no, type_id),
    FOREIGN KEY (naf_no, coy_id) REFERENCES offr (offr_id, coy_id),
    FOREIGN KEY (coy_id, type_id) REFERENCES provide (coy_id, type_id)
);

重叠的复合FK约束将确保官员只能订阅他/她注册的公司提供的保险。coy_id从逻辑上讲是冗余的,但对于完整性而言是必需的,并且不会因FK约束而存在更新异常的风险。

或者,您可以使用触发器来检查值是否通过内部联接相关:

CREATE TRIGGER check_subscribe BEFORE INSERT OR UPDATE ON subscribe
FOR EACH ROW
WHEN NOT EXISTS (
    SELECT 1
    FROM offr
    INNER JOIN provide ON offr.coy_id = provide.coy_id
    WHERE offr.offr_id = new.naf_no AND provide.type_id = new.type_id
)
RAISE_APPLICATION_ERROR (num => -20000, msg => 'Officers can only subscribe to types provided by their company');

免责声明:我无法在SqlFiddle上进行测试,也没有安装Oracle,但希望它将为您指明正确的方向。



 类似资料:
  • 我有几个switch语句测试。所有<code>enumenum可能会收缩和增长。当<code>枚举 已经存在“如何检测新值已添加到枚举中并且未在开关中处理”的问题,但它不包含答案,而只是与Eclipse相关的工作。

  • 问题内容: 我有几个测试一个的switch语句。所有值必须在语句中由语句处理。在代码重构期间,可能会发生收缩和增长。当收缩时,编译器将引发错误。但是,如果增长,则不会引发任何错误。匹配状态被遗忘并产生运行时错误。我想将此错误从运行时移到编译时。从理论上讲,应该可以在编译时检测到丢失的情况。有什么办法可以做到这一点? 问题答案: 另一种解决方案使用功能方法。您只需要根据下一个模板声明枚举类: 如果尝

  • 问题内容: 有什么方法可以使用WebDriver保存完整的网页吗? 当前,我执行getPageSource(),然后将所有内容放入html本地文件中,但是保存的页面的形状不好(奇怪的字符,没有图像,所有元素向下偏移) 请参阅以下我使用的代码: 有人可以建议我使用WebDriver在Firefox中保存完整网页的方法吗?例如自动? 问题答案: 奇怪的字符可能与写入文件的编码有关。 其他问题可能与以下

  • 问题内容: 我正在学习SQL,并具有一些类似于以下内容的表: (*表示主键,如果是Customer和Employee,则既是PK又是返回给Person的FK) Customer和Employee都是Person的类型,我想确保在将记录插入Person时,也必须将记录插入EITHER Customer或Employee,但不能同时插入两者。在此示例的限制范围内,人员不能同时是雇员和客户。 有人告诉我

  • 问题内容: 我开发了一个在线预订系统。为了简化起见,假设用户可以预订多个项目,而每个项目只能预订一次。物品首先添加到购物车中。 应用使用/ 数据库。根据MySql文档,默认隔离级别为。 这是到目前为止我提出的结帐程序: 开始交易 在购物车中选择项目 (带锁)在此步骤中, 从中获取记录和表格。 检查其他人是否还没有预定商品 基本上检查是否。在实际的应用程序中它更加复杂,因此我将其作为单独的步骤放在这

  • 我有Spring Boot 1.5应用程序,它正在设置与一些Web服务的连接。在所有情况下,这些都是TLS 1.2连接。我通过此JVM参数运行我的应用程序: javax。网ssl。密钥库只是一个jks文件,其中只有一个证书。 我需要回答这个问题:当设置TLS连接时,我如何知道我是否正在检查完整的证书链?或者只是根证书?这仅仅取决于我的信任存储中包含的每个证书中的CA吗? 我使用RestTempla