我们定义了一系列配置,其中,在 RESTful API 的驱动下,最终用户可以构建新的修订版本。配置的某些组件可以有多个值;修订涉及具有一对多关系的多个表。
因为配置被运往别处,修订被标记为已部署,并且变得不可变。如果用户想对配置进行更改,他们必须创建一个新修订(可以从现有修订中克隆)。每个配置的一个 修订版可以标记为“当前”;这允许用户随意在过去的修订之间切换,或者通过不选择任何修订来完全禁用配置。当前版本已部署,当将不同版本标记为“当前”时,您将替换已部署的配置。
我们已经准备好了一切来强制部署修订的不变性;当您第一次使用修订作为当前修订时,该deployed
列会自动转换为TRUE
,并且所有进一步的INSERT
,UPDATE
和DELETE
与修订相关表中部署的修订 ID 匹配的行的操作都将被阻止。
但是,用于公共名称表中的name
列的任何值在所有当前配置的所有“当前”修订中都必须是唯一的。我正在尝试找出执行此操作的最佳策略。
如果这是从配置到公共名称的简单一对多关系,则可以通过对name
列使用唯一约束来解决。相反,这是一种一对多模式,revision
充当桥接表,并将current_revision_id
一对多对多关系“折叠”为从配置到虚拟的一对多关系公共名称。
这是一组简化的表格,用于说明我们的情况:
Run Code Online (Sandbox Code Playgroud)-- Configurations CREATE TABLE config ( id INT PRIMARY KEY, name VARCHAR(100), current_revision_id INT ); -- Have multiple revisions CREATE TABLE revision ( id INT PRIMARY KEY, config_id INT NOT NULL REFERENCES config(id), created_at TIMESTAMP WITH TIME ZONE …
我一直在阅读有关 Hash Join 以及它在物理层面上是如何工作的。但是,有些事情我不明白(因为我缺乏知识)。
这是我找到的Hash Join算法;
for each row R1 in the build table
begin
calculate hash value on R1 join key(s)
insert R1 into the appropriate hash bucket
end
for each row R2 in the probe table
begin
calculate hash value on R2 join key(s)
for each row R1 in the corresponding hash bucket
if R1 joins with R2
return (R1, R2)
end
Run Code Online (Sandbox Code Playgroud)
这对于诸如"TABLE1.NAME == TABLE2.NAME"
等的连接条件似乎是足够的。但是,当连接条件为"TABLE1.NAME == TABLE2.NAME" && "TABLE1.AGE > TABLE2.AGE"
.
我只是无法找到并理解他们如何生成或比较需要相等运算符和其他一些关系运算符(例如大于等)的哈希值。
在我的 MySQL 数据库上,我想使用TINYINT (Unsigned)
?
你会Byte
在 SQL Server 上使用吗?
If an index has more than one attribute in it, is there any speed gained in a select
statement whose where
clause uses one of the attributes in the index?
例如,拿一个T
带有属性索引的表a
和b
。索引是否对查询有用:
select * from T where a='foo'
Run Code Online (Sandbox Code Playgroud)
我问是因为我正在阅读的书有以下陈述,我无法理解:
如果多属性索引的键确实是按某种顺序连接的属性,那么我们甚至可以使用此索引在第一个属性中查找具有给定值的所有元组。
我的应用程序中有列的值始终为 4 位数字,例如“0100”或“1230”。示例之一可能是Merchant Category Code。
暂时,我已经将这个列的类型设置为char (4)
. 我有很多这种类型的专栏。这些类型的列之一也包含在非聚集UNIQUE
索引中。我想为这种类型的专栏建立一种方法。
通过在应用程序中添加或 添加到开头来使用char (4)
或可能更好吗?smallint
' '
0
包含这些列的表已分区,将包含大约 3 亿条记录。UPDATE
可能不会在这种类型的列上执行。它们也不会出现在WHERE
(有时可能出现在临时报告中)。
我应该选择哪种数据类型?
它就像一个邮政编码,它可以是数字,但你必须存储前导零
确切地。我在考虑在性能方面什么是更好的方法。还必须考虑到,如果我将其存储为smallint
,应用程序代码必须将其解析为字符串并添加前导零。