假设我正在为存在一对零或一 (1-0..1) 关系的场景设计数据库。例如:
因此,我创建了两个对应的表,users
和customers
,但是……
…在给定的 SQL 平台中表示和实现这种情况的最佳方法是什么?我考虑了两种可能的解决方案:
在里面 users
表中,添加customer
可能是 FOREIGN KEY 引用customers
或NULL
标记的列。
在customers
表中,包括一个user
UNIQUE
指向users
表格列(设置有约束)。
我已经在一些论坛上问过类似的问题,但答案基本上是“你需要什么”,“你觉得方便什么”。我不喜欢这种回答。我想要一个严肃的 DB 理论,一个有根据的答案。我在哪里可以读到 1-0..1 关系?
我无权访问 Postgres 安装,因此无法检查。
我是一名安全人员,我在日志中看到了明文密码:
create user user1 with password 'PLAINTEXT PASSWORD'
Run Code Online (Sandbox Code Playgroud)
在日志中没有明文密码的情况下,DBA 如何更改或创建他们的密码?
我见过这个,它指出您可以使用密码的 md5 散列,但散列也是明文。有没有更好的办法?
有人可以解释一下数据库术语中的膨胀是什么意思吗?例如,说索引膨胀是什么意思。我试图寻找它,但没有解释什么是腹胀,只有它引起了什么或它是由什么引起的。
我有一个助手,它正在生成一些代码来为我进行批量更新,并生成如下所示的 SQL:
( active 和 core 字段都是 type boolean
)
UPDATE fields as t set "active" = new_values."active","core" = new_values."core"
FROM (values
(true,NULL,3419),
(false,NULL,3420)
) as new_values("active","core","id") WHERE new_values.id = t.id;
Run Code Online (Sandbox Code Playgroud)
但是它失败了:
ERROR: column "core" is of type boolean but expression is of type text
我可以通过添加::boolean
空值来让它工作,但这看起来很奇怪,为什么 NULL 被认为是类型TEXT
?
此外,转换有点棘手,因为它需要对代码进行大量修改才能知道它应该将 NULL 转换为什么类型(列和值的列表目前是从一个简单的 JSON 对象数组自动生成的) .
为什么这是必要的,是否有更优雅的解决方案,不需要生成代码知道 NULL 的类型?
如果相关,我将在Node.JS上使用sequelize来执行此操作,但在 Postgres 命令行客户端中也得到相同的结果。
显示按(1, 2, 3, 4, 5)的顺序输入带有键的记录到一个初始为空的B+-阶m = 3的树的结果。 如果溢出,将节点拆分,不要重新分配邻居的钥匙。是否可以以不同的顺序使用键输入记录以获得较低高度的树?
我不擅长这个但我尝试过吗?左侧和 > 右侧:
直到插入 1,2 :
然后,就我们必须拆分节点而不是将密钥重新分配给邻居(我将其理解为子节点)而言,我只在单元格的右侧插入了 2 :
我在插入 5 时继续做同样的事情:
但这很奇怪,我从未见过这样的空节点......而且我不知道它是否尊重一些非常基本的 B 树属性:
一开始我误解了“顺序”是什么(每个节点的最大子节点数)。所以我认为一个节点可以有三个空间(因此有 4 个孩子。我正在创建一个 4 阶树,我认为:
直到插入 1,2,3 :
插入 4,只要我们必须拆分节点而不是将密钥重新分配给邻居(这似乎是矛盾的),我会让 1,2,3 和 4,5 在 3 之后的右叶上:
我遇到过这样的脚本:
set @sum = sum = (case when somecol1 is null then DATEDIFF(d,[somecol2],somecol3) else 0 end)
Run Code Online (Sandbox Code Playgroud)
我无法理解第二个关键字 sum 后面的等号 (=) 的含义。当我运行查询时,它没有显示任何带有等号和不带等号的错误。
我想知道在关键字后面放一个等号的目的sum
。这是错误还是错误?
谢谢
我偶然发现了一个我不擅长的数据库设计问题,而我的首选 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
我希望能够轻松检查查询中提供的表中不存在哪些唯一标识符。
为了更好地解释,这是我现在要做的,以检查表中不存在列表“1、2、3、4”的哪些 ID:
SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')
,假设该表不包含 ID 为 2 的行。#N/A
都在表中没有出现的值上。我认为必须有更好的方法来做到这一点。理想情况下,我正在寻找类似的东西
要检查的列表 -> 查询要检查的表 -> 不在表中的列表成员
我不确定这是否可能,但我希望它是 - 我目前正在运行 SSMS 并且有一个数据库,它的数据全部“存放”在 DBO 模式中。我收到了建议(并且完全同意),最佳实践是创建与我们的业务功能相匹配的其他模式,我将继续推进。
我想知道是否有任何方法 - 即使是通过安装某种加载项,让架构崩溃,以便我可以隐藏所有 DBO 和 RPT 对象,直到我扩展架构 - 很多就像表格和其他文件夹被折叠一样。
如果这个问题不是本网站的“主题”,我深表歉意 - 但我认为这是最有可能知道答案的地方。
在我下面的屏幕截图中 - 我正在寻找要折叠的红色轮廓的位,现在只有 2 行 DBO - 以及我目前请求创建的 RPT:
sys.dm_repl_tranhash
包含有关交易散列的信息,但我很难理解这些术语。什么是“哈希交易”?
sql-server ×4
postgresql ×3
terminology ×2
aggregate ×1
btree ×1
cast ×1
dmv ×1
except ×1
foreign-key ×1
logs ×1
null ×1
password ×1
replication ×1
schema ×1
ssms ×1
syntax ×1
t-sql ×1