【发布时间】:2019-02-02 08:50:22
【问题描述】:
这是一个概念性问题,因为我正在考虑为一组频繁连接的表设计数据库的两种方法。
这是案例 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 上。
感谢在这种情况下提供的任何指导,以及我可以遵循的一些关于查询性能以及它们与约束和连接的关系的额外资源或规则。
谢谢!
【问题讨论】:
-
您希望每个表中有多少行?
-
表“模式”
-
我希望你的数字除以 100。如果是这样的话,我想你选择A还是B都没关系。有几百万行,呵呵,事情就不同了。我不知道该建议什么,对不起。如果可能,创建示例数据集,填充两种情况,运行查询并检查解释计划的样子。选择一个便宜的。另外,我希望受过教育的人能够提出更好的建议。
-
感谢您抽出宝贵时间发帖。我很感激。我确实计划执行解释计划并看到这一点,但我在概念上想知道并考虑哪种情况最接近“最佳实践”,因为它与关系数据库建模有关。
-
没问题;我会关注这个问题,因为我很想知道人们会怎么说。
标签: oracle performance join relational-database