gpt4 book ai didi

oracle - 使用唯一约束来实现更简单的连接

转载 作者:行者123 更新时间:2023-12-02 06:37:26 25 4
gpt4 key购买 nike

这是一个概念性问题,因为我正在考虑针对一组频繁连接的表进行数据库设计的两种方法。

这是案例 A:

/*SCHEMA*/
CREATE TABLE SCHEMA (
SCHEMA_ID INTEGER,
CONSTRAINT sch_pk PRIMARY KEY (SCHEMA_ID)
);

/*OBJECTS*/
CREATE TABLE OBJECT (
OBJECT_ID INTEGER,
SCHEMA_ID INTEGER NOT NULL,
CONSTRAINT obj_pk PRIMARY KEY (OBJECT_ID),
CONSTRAINT obj_sch_uniq UNIQUE (OBJECT_ID,SCHEMA_ID),
CONSTRAINT obj_fk FOREIGN KEY (SCHEMA_ID) REFERENCES SCHEMA(SCHEMA_ID)
);

/*COLUMNS*/
CREATE TABLE COL (
COL_ID INTEGER,
OBJECT_ID INTEGER,
CONSTRAINT col_pk PRIMARY KEY (COL_ID),
CONSTRAINT col_obj_uniq UNIQUE (COL_ID,OBJECT_ID),
CONSTRAINT col_fk FOREIGN KEY (OBJECT_ID) REFERENCES OBJECT(OBJECT_ID)
);

这是案例 B:

/*SCHEMA*/
CREATE TABLE SCHEMA (
schema_id INTEGER,
CONSTRAINT schema_pk PRIMARY KEY (schema_ID),
);

/*OBJECTS*/
CREATE TABLE OBJECT (
object_id INTEGER,
schema_id INTEGER,
CONSTRAINT object_pk PRIMARY KEY (object_id,schema_id),
CONSTRAINT object_schema_fk FOREIGN KEY (schema_id) REFERENCES SCHEMA (schema_id)
);

/*COLUMNS*/
CREATE TABLE COL (
column_id INTEGER,
object_id INTEGER,
schema_id INTEGER,
CONSTRAINT column_pk PRIMARY KEY (column_id,object_id,schema_id),
CONSTRAINT column_object_fk FOREIGN KEY (object_id,schema_id) REFERENCES OBJECT (object_id,schema_id)
);

针对这组表运行的常见查询如下:案例A

SELECT *
FROM METADATA_CONTROL.COL
INNER JOIN METADATA_CONTROL.OBJECT ON METADATA_CONTROL.COL.OBJECT_ID = METADATA_CONTROL.OBJECT.OBJECT_ID
WHERE OBJECT.SCHEMA_ID = 101;

情况B

SELECT *
FROM METADATA_CONTROL.COL
WHERE SCHEMA_ID = 101;

可以看出,CASE A 需要联接,CASE B 不需要。我的问题:

-这两个表结构强制执行相同的业务需求,我是否正确?-如果这样做,我如何确定实现哪种情况?

我不太了解不同关系表结构的性能增益/损失。这是在 Oracle 12c 上的。

我很欣赏这种情况下的任何指导,以及我可以遵循的有关查询性能及其与约束和联接的关系的一些附加资源或规则。

谢谢!

最佳答案

这些不是等效的模型。

考虑表 OBJECT 中的以下 2 行:

OBJECT_ID    SCHEMA_ID
1 1
1 2

您可以在 CASE B 中插入两行。您不能在 CASE A 中插入两行。毕竟主键是唯一的 - 因此 PRIMARY_KEY(OBJECT_ID) 意味着 OBJECT_ID 在 OBJECT 表中是唯一的。

现在,如果您愿意让应用程序强制执行“OBJECT_ID 是唯一的”约束,那么您可以使用 CASE B 来存储满足 CASE A 要求的数据。你可能不应该,但你可以。也就是说,您可以在 CASE A 中放入数据库的所有内容都可以在 CASE B 中放入数据库。反之则不然。

因此,主要根据正确性在案例 A 和 B 之间进行选择。

在情况 A 中 - 唯一约束是多余的 - 再次查看 OBJECT 表 OBJECT_ID 已经是唯一的。所以你的 table 上不需要这种限制。

您可能想要的是一个索引,其中前导列是 SCHEMA_ID。这可能只是 SCHEMA_ID 或 SCHEMA_ID 和 OBJECT_ID 上的索引。这为数据库提供了针对您提供 SCHEMA_ID 的典型查询的良好访问路径。 COL 表也是如此 - 为了获得最佳性能,您可能需要一个带有前导列 OBJECT_ID 的索引。

如果情况 B 正确,您可以添加索引来支持您的查询,或者颠倒主键中字段的顺序 - 如果您始终按 SCHEMA_ID 进行过滤,则您需要一个第一列为 SCHEMA_ID 的索引。主键始终有一个关联的索引,因此您可以利用它。

基本上根据要求决定什么是正确的,然后优化性能。

关于oracle - 使用唯一约束来实现更简单的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52045689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com