考虑以下2个查询:
select tblA.a,tblA.b,tblA.c,tblA.d
from tblA
where tblA.a not in (select tblB.a from tblB)
select tblA.a,tblA.b,tblA.c,tblA.d
from tblA left outer join tblB
on tblA.a = tblB.a where tblB.a is null
Run Code Online (Sandbox Code Playgroud)
哪个会表现更好?我的假设是,一般情况下,连接会更好,除非子选择返回非常小的结果集.
对于像stackoverflow这样的高流量网站,数据库设计和规范化的最佳实践是什么?
是否应该使用标准化数据库进行记录保存或标准化技术或两者的组合?
将规范化数据库设计为记录保存的主数据库以减少冗余并同时维护数据库的另一种非规范化形式以便快速搜索是否合理?
要么
主数据库是否应该非规范化,但在应用程序级别使用标准化视图来进行快速数据库操作?
或其他一些方法?
performance database-design high-availability denormalization database-normalization
我对事实表进行了一些研发,无论它们是标准化还是非标准化.我遇到了一些令我困惑的发现.
根据Kimball的说法:
维度模型结合了规范化和非规范化表格结构.描述性信息的维度表在同一个表中具有高度非规范化,具有详细和分层的汇总属性.同时,具有性能指标的事实表通常是标准化的.虽然我们建议不要在单独的表中使用snowflaked维度属性进行完全规范化(为业务用户创建类似暴雪的条件),但是在同一个表中同时包含度量和描述的单个非规范化大型宽表也是不明智的.
我认为另一个发现,我认为是好的,来自GeekInterview的fazalhp:
DW的主要基础是对数据进行去规范化,以便报告工具更快地访问...因此,如果你构建一个DW ..90%,它必须被去规范化,当然事实表必须被规范化. ..
所以我的问题是,事实表是规范化的还是非规范化的?如果这些中的任何一个如何以及为什么?
reporting data-warehouse database-normalization business-intelligence
假设我有一个带有人员ID和其他东西ID的表T1,如下所示
Table: T1
personID | stuffID
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
2 | 4
3 | 1
3 | 2
Run Code Online (Sandbox Code Playgroud)
另一个表T2只有一列stuffID
Table: T2
stuffID
1
2
3
Run Code Online (Sandbox Code Playgroud)
我得到的结果是,一个SELECT与所有T2的所有stuffID连接的peopleID表.
在该示例之后,结果将仅是id 1(即使所关联的所有stuffID都包含在T2.stuffID中,personID 3也不会出现).
员工被组织成团队。每个团队可以有多个员工,每个员工可以属于多个团队。这种多对多关系由team_membership表表示。
每个项目分配给一个团队。项目细分为任务,每个任务分配给一名员工。
是否可以保证任务的员工是相应项目团队的成员,而不添加触发器或冗余列?
CREATE TABLE employee
(
employee_id bigserial PRIMARY KEY,
employee_name text
);
CREATE TABLE team
(
team_id bigserial PRIMARY KEY,
team_name text
);
CREATE TABLE team_membership
(
team_id bigint NOT NULL REFERENCES team,
employee_id bigint NOT NULL REFERENCES employee,
PRIMARY KEY (team_id, employee_id)
);
CREATE TABLE project
(
project_id bigserial PRIMARY KEY,
team_id bigint NOT NULL REFERENCES team,
project_name text
);
CREATE TABLE task
(
task_id bigserial PRIMARY KEY,
task_name text,
project_id bigint NOT …Run Code Online (Sandbox Code Playgroud) vanilla MySQL是否有表名长度限制?
(我已经在我修改的MySQL上测试了100个chrs - 到目前为止没有限制..但是我没有很容易访问vanilla MySQL,但是我想知道我的动态创建的表模式是否会在默认的MySQL上运行)
问题:如果在默认MySQL上超过64个chrs会发生什么?你可以测试这个并粘贴MySQL错误或结果吗?
nb使用场景,其中每个用户永远不会选择其他用户的数据集.
假设关系R( K, L, M, N, P)和持久的功能依赖关系R是:
- L -> P
- MP -> K
- KM -> P
- LM -> N
Run Code Online (Sandbox Code Playgroud)
假设我们将其分解为3个关系,如下所示:
- R1(K, L, M)
- R2(L, M, N)
- R3(K, M, P)
Run Code Online (Sandbox Code Playgroud)
我们如何判断这种分解是否无损? 我用过这个例子
R1∩R2= {L,M},R2∩R3= {M},R1∩R3= {K,M}我们使用函数依赖,在我看来这不是无损的,但有点混淆.
join relational-algebra lossless database-normalization functional-dependencies
我正在制作一个Web应用程序并使用mongodb作为我的数据库.但我是mongodb的新手,我只想知道我是否还需要像其他人在使用RDBMS时那样规范化我的数据库.在制作表或数据库之前,它是规范化的.
关系代数和关系演算之间的确切区别是什么?在大多数参考文献中,它将是
Relational algebra is procedural and calculus is non procedural.
那么,这些代表什么呢.但是,我们可以使用关系代数解决所有问题.那么为什么我们要使用关系演算.除了定义,用例子解释非常感谢.
rdbms relational-algebra relational-database tuple-relational-calculus domain-calculus
如果我有 NOT ( 1 <> 1 AND NULL <> 1 )
我可以看到SQL将其转化为执行计划XML: ( 1 = 1 OR NULL = 1)
如果你真的要评估前面的表达式,那么True AND Null它将是Null并将消除该行.但是,由于OR,编译后的表达式可以返回一行.
我可以假设这种类型的编译始终保证会发生吗?SQL Server永远不会尝试将复杂的逻辑推进到编译计划中?有关于此的一些文件吗?
这篇文章非常有用,但我只是错过了一个难题:https: //www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -逻辑/
这是一个SQL示例
SELECT 1
FROM T T
LEFT JOIN T2 T2 --t2 has zero rows
ON T.id = t2.t_id
WHERE NOT ( T.id <> 99 AND T2.id <> 99 )
Run Code Online (Sandbox Code Playgroud)
根据我的SQL经验,我知道在正常情况下(没有短路评估)T2.id <> 99有效地将左连接转换为内连接.这是我的行为是最初预期.当这个过滤器实际工作时我很惊讶.
sql ×5
database ×2
mysql ×2
performance ×2
sql-server ×2
foreign-keys ×1
join ×1
left-join ×1
lossless ×1
mongodb ×1
null ×1
postgresql ×1
rdbms ×1
reporting ×1