我偶然发现了一个我不擅长的数据库设计问题,而我的首选 DBA 大师正在进行消防演习。
本质上,我有一个包含以下主键的表(为简洁起见,PK):
child_id integer
parent_id integer
date datetime
Run Code Online (Sandbox Code Playgroud)
child_id
和parent_id
是实体表的外键。“子”表本身也包含一个到“父”表的外键,而且,每个表child_id
总是引用与parent_id
上表预期相同的外键。事实上,事实证明有一些额外的代码使两者保持同步。
这使得这个过度热情的规范化新手说“我应该删除冗余!”
我分解为以下内容:
Table_1 PK:
child_id integer
date datetime
Table_2 PK:
parent_id integer
date datetime
Table_3: (already exists)
child_id integer PRIMARY KEY
parent_id integer FOREIGN KEY
Run Code Online (Sandbox Code Playgroud)
瞧,当我以自然的方式将这些人连接在一起时,我恢复了原始表。这是我的理解,使这个 5NF。
然而,现在我意识到有一个隐藏的商业规则。
通常,与给定关联的日期child_id
必须是与相应parent_id
. 您可以看到第一个表强制执行此规则。
我的分解不强制执行规则,因为您可以自由添加到表 1,直到日期变得太大。
这使我来到这里,有以下问题:
这是分解5NF吗?虽然我会说它允许插入异常,但它似乎也遵循 Wiki 示例,该示例本身遵循本指南。短语(强调我的)“我们可以从由三种不同记录类型组成的规范化形式重建所有真实事实”给了我特别的停顿,因为无论我注入多少垃圾Table_1
,自然连接仍然会忽略它。
假设我不喜欢这种分解(我不喜欢)。我坦率地承认,实际的解决方案是让表格和代码保持原样。但是,从理论上讲,有没有办法分解和/或添加约束,以便我摆脱第一个表并保留我的业务规则?
schema normalization database-design best-practices relational-theory
我正在为一个类分配创建一个 ER 图,我想知道是否有可能创建一个与任何其他实体没有直接关系的实体,并简单地使用外键来连接它们。下图说明了我想做的事情
基本上,我的图表开始变得非常复杂,如果我不必在每个实体之间保持连接就好了。
FWIW,如果有帮助的话,我正在使用 Chen 和 Crow's Foot 符号。
比较两个大型结果/行集的最有效方法的当前建议似乎是使用EXCEPT
运算符。随着行大小的增加(更改@last 值),下面这个自包含的 SQL 脚本变得非常低效。我试图在组合表中找到唯一的条目,但没有任何改进。
DECLARE @first AS INT, @step AS INT, @last AS INT;
-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible
-- Compare 100 to 110 rows - 0 seconds
-- Compare …
Run Code Online (Sandbox Code Playgroud) 我正在审查我们公司的 DR 程序,当我在网上查找 Always On 群集丢失仲裁的解决方案时,进行比较。在找到关于集群与事务复制与可用性组主题的第一篇 SE 帖子之前,我在谷歌搜索结果中翻了三页,该帖子仅略微涉及丢失法定人数的主题。
虽然每个人都同意失去法定人数是糟糕的,并且有一些降低潜力的建议,但它仍然可能发生。我正在寻找一个经过同行评审的良好答案,以了解从 Always On 集群仲裁丢失中恢复的最佳途径。
对于我之前在 SO 上提出的问题,我有一个后续问题。
我想将以下内容转换为关系代数,而不是我最初的问题中的查询:
列出并非总是受双重投标影响的投标人的姓名和电话号码。
注意:当两个不同的投标人对同一件商品出价相同时,就会出现双重投标。
我有一些关于如何进行的想法:
从这里,我可以得到(1)和(2)的交集并将(3)加到这个交集上得到最终答案。(这是我的思考过程,如有不对请指正)
我可以找到所有双重出价的投标人,但随之而来的想法让我很困惑。这就是我对“所有双重出价的投标人”的看法:
投标?项目 - (Q1)
问题1?? 出价?出价',iid?iid',价格?价格'(Q1)-(Q2)
? 出价(?出价!=出价'(Q2)??价格=价格'(Q2)??iid = iid'(Q2))-(Q3)
我如何使用它来找到不总是受双重投标影响的投标人?
顺便说一句,粗体文本仅用于标记目的,而不是答案的一部分。
背景:
我们正在尝试为我们的一个支持团队创建一个 AG“是主要的”测试工具。不知道在任何给定时间哪些服务器将是主服务器,它们被指示对注册的服务器组执行 TSQL。注册服务器组由AG中的所有服务器组成。目标是只在当前主服务器上执行 TSQL:
当前测试线束:
IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id
WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END
Run Code Online (Sandbox Code Playgroud)
问题:
如果响应多服务器查询的第一台服务器没有返回任何结果,SSMS 将假定正确的结果集没有结果集,即使其他服务器稍后返回结果集也是如此。因此,在这种情况下,不会返回任何结果……这是不正确的,也不是预期的功能。
谁能想出一种方法,使用 SSMS(这是 CS 团队最熟悉的工具),仅在当前主服务器上强制执行?
我正在考虑使用图形数据库管理系统(简称 DBMS)作为我的单用户桌面应用程序的应用程序文件格式。
是否有基于单文件的图形 DBMS(图形 DBMS的 SQLite 的“等价物”)?
在一次讲座中,我的讲师向我们展示了一张没有主键的表格。经询问,他说在 3NF 中,当您删除传递依赖项时,可以使用没有主键的表。
然而,没有主键意味着没有函数依赖——但是 3NF 是去除传递依赖,我被教导每个表都需要有一个主键来规范化,因为它完全是关于函数依赖的。
我知道完全有可能创建一个没有主键的表,但是如果该表存在,该数据库是否被认为是规范化的?
我应该补充一点,该表没有任何“唯一键”,没有主键,没有复合键,没有外键。
显示的表具有三个属性,其中没有一个被标记为主要或唯一的。我问是不是搞错了,他说没有也没关系。我对这句话提出了质疑,因为表格中的所有信息都无法唯一标识,他声称可以这样。这与我学到的关于规范化的内容背道而驰。
我们有一个整数列,目前仅包含 0 或 1 个值。此列现在已被开发人员用于在某些情况下存储唯一的 32 位标识符,我们需要能够有效地提取包含这些标识符中的任何一个的行。
鉴于该值在 99% 的情况下是 0 或 1(我还没有数字),如何最好地索引以查询少数情况?我认为共同价值的数量将成为一个问题是否正确?
Column | Type | Modifiers
----------------------------+---------+--------------------
event_value | integer | not null
Run Code Online (Sandbox Code Playgroud)
此列当前没有索引。而且我不认为需要定期只选择 0 或 1 值。
该表大小合理,目前有 3000 万行并且增长很快。
我很欣赏这不是该专栏的最佳用途,但在短期内不会改变。
所以我们有一个带有错字的子查询的查询。它缺少 FROM 子句。但是当你运行它时,它不会出错!为什么!?
SELECT
1
,r.id
,'0D4133BE-C1B5-4141-AFAD-B171A2CCCE56'
,GETDATE()
,1
,'Y'
,'N'
,oldItem.can_view
,oldItem.can_update
FROM Role r
JOIN RoleObject oldReport
ON r.customer_id = oldReport.customer_id
JOIN RoleItem oldItem
ON oldReport.id = oldItem.role_object_id
AND r.id = oldItem.role_id
WHERE r.id NOT IN (SELECT
role_id
WHERE role_object_id = '0D4133BE-C1B5-4141-AFAD-B171A2CCCE56')
AND oldReport.id = '169BA22F-1614-4EBA-AF45-18E333C54C6C'
Run Code Online (Sandbox Code Playgroud) sql-server ×4
t-sql ×2
erd ×1
except ×1
graph ×1
graph-dbms ×1
index ×1
postgresql ×1
schema ×1
ssms ×1