我们正在做一个 ETL 过程。当一切都说完后,有一堆表格应该是相同的。验证这些表(在两个不同的服务器上)实际上相同的最快方法是什么?我说的是架构和数据。
我可以在表上做一个散列,就像我可以在单个文件或文件组上一样 - 将一个与另一个进行比较。我们有 Red-Gate 数据比较,但由于有问题的表每个都包含数百万行,我想要一些性能更高的东西。
一种让我感兴趣的方法是对 union 语句的这种创造性使用。但是,如果可能的话,我想进一步探索散列的想法。
发布答案更新
对于任何未来的访客......这是我最终采取的确切方法。它工作得很好,我们在每个数据库的每个表上都这样做。感谢下面的答案为我指明了正确的方向。
CREATE PROCEDURE [dbo].[usp_DatabaseValidation]
@TableName varchar(50)
AS
BEGIN
SET NOCOUNT ON;
-- parameter = if no table name was passed do them all, otherwise just check the one
-- create a temp table that lists all tables in target database
CREATE TABLE #ChkSumTargetTables ([fullname] varchar(250), [name] varchar(50), chksum int);
INSERT INTO #ChkSumTargetTables ([fullname], [name], [chksum])
SELECT DISTINCT
'[MyDatabase].[' + S.name + '].['
+ T.name + ']' …
Run Code Online (Sandbox Code Playgroud) 假设我有一个表 A,它有两列:一列是 的 ID ThingA
,另一列是 的 ID ThingB
。主键是(ThingA, ThingB)
.
接下来,我有第二个表,但这次它仅限于表A
中具有ThingB = 3
. 主键是ThingA
,因为ThingB
是 3 的常数。
最初,我以为我可以简单地:
FOREIGN KEY (ThingA, 3) REFERENCES A(ThingA, ThingB)
Run Code Online (Sandbox Code Playgroud)
但我了解到事实并非如此,我必须为以下内容创建一个列ThingB
:
ThingB INT NOT NULL DEFAULT(3) CHECK(ThingB = 3)
Run Code Online (Sandbox Code Playgroud)
然后,
FOREIGN KEY (ThingA, ThingB) REFERENCES A (ThingA, ThingB)
Run Code Online (Sandbox Code Playgroud)
有没有不需要额外列的替代方法,或者DEFAULT + CHECK
?一种选择是持久化的计算列,但我也讨厌这个想法,因为它基本上是一种作弊,并且仍然添加了一个具有物理存储的新列。虽然它本身INT
不会很大,但在几个表中有几百万行需要它,我宁愿不维护额外的列。
下面是示例 DDL 来说明这种情况:
CREATE TABLE Test1
(
ThingA INT NOT NULL,
ThingB INT NOT NULL,
PRIMARY …
Run Code Online (Sandbox Code Playgroud) foreign-key database-design sql-server constraint sql-server-2014
我有点困惑,因为我在质疑 OLTP 和 OLAP 中“在线”的定义。我曾经认为,这里的“在线”意味着我们希望在有限的时间内根据某个实例的可用数据获得答案。
但是 OLAP 查询可能需要几个小时来计算 - 这不是离线的吗?
快速搜索表明离线 OLAP 听起来相当混乱(离线在线分析处理)......?
究竟什么是“在线”?
terminology transaction olap database-theory online-operations
我不清楚 IMMUTABLE、VOLATILE 和 STABLE 函数定义中的真正含义。
我阅读了文档,特别是每个文档的定义。
IMMUTABLE 表示函数不能修改数据库并且 在给定相同的参数值时总是返回相同的结果;也就是说,它不进行数据库查找或以其他方式使用不直接出现在其参数列表中的信息。如果给出了这个选项,任何带有全常量参数的函数调用都可以立即替换为函数值。
STABLE 表示该函数不能修改数据库,并且在单个表扫描中,对于相同的参数值,它将始终返回相同的结果,但其结果可能会在 SQL 语句之间发生变化。对于结果取决于数据库查找、参数变量(例如当前时区)等的函数,这是合适的选择。(对于希望查询由当前命令修改的行的 AFTER 触发器是不合适的。)另请注意, current_timestamp 系列函数被认为是稳定的,因为它们的值在事务中不会改变。
VOLATILE 表示即使在单个表扫描中函数值也可以更改,因此无法进行优化。从这个意义上说,相对较少的数据库函数是易变的;一些例子是 random()、currval()、timeofday()。但请注意,任何具有副作用的函数都必须归类为 volatile,即使其结果是可预测的,以防止调用被优化掉;一个例子是 setval()。
我的困惑来自与不可改变的条件,稳定的功能总是或始终返回相同的结果给出了相同的论点。
IMMUTABLE 定义声明该函数不进行数据库查找或以其他方式使用未直接出现在其参数列表中的信息。所以,对我来说,这意味着这些函数用于操作客户端提供的数据,并且不应该有 SELECT 语句......尽管这对我来说听起来有点奇怪。
对于 STABLE,定义类似,因为它说它应该始终如一地返回相同的结果。所以,对我来说,这意味着每次使用相同的参数调用函数时,它都应该返回相同的结果(每次都返回相同的行)。
所以,对我来说......这意味着任何对一个或多个可以更新的表执行 SELECT 的函数应该只是易失性的。
但是,再一次……这对我来说听起来不对。
回到我的用例,我正在编写在不断添加的表上执行带有多个 JOIN 的 SELECT 语句的函数,因此函数调用预计每次调用时都会返回不同的结果,即使使用相同的参数.
那么,这是否意味着我的函数应该是 VOLATILE?即使文档表明相对较少的数据库函数在这个意义上是易变的?
谢谢!
假设我有一个名为 Software 的实体和两个子类型 FreeSoftware 和 NonFreeSoftware。NonFreeSoftware 实体具有购买日期、供应商等属性。 FreeSoftware 实体具有许可证、源代码 url 等属性。
因此,如果我想为另一个实体(OperatingSystem)建模,我应该怎么做?与软件存在“是一种”关系,但与自由软件和非自由软件存在“非此即彼”的关系。
我想我在分析这个层次结构的方式中遗漏了一些东西。
我正在寻找有关存储调查、问题和响应的最佳关系建模方法的建议。
我正在寻找以下两种方法中的哪一种看起来最好,或者另一种方法。
我至少有这些实体:
至少有这些关系:
这就是我遇到麻烦的地方:如何对一个人对调查问题的回答进行建模。
这是我考虑过的两种方法,对我来说似乎都不是很好。此处的图表已大大简化以说明问题。
我不喜欢这种方法的地方:
survey_person_question_response
表有两个不同的列引用调查:survey_question_survey_id
和survey_person_survey_id
survey_id
在这两列的一行中引用不同的是错误的。survey_question 必须与该人在survey_person 中进行的调查来自同一个调查。我看不出有什么好的方法来强制执行此操作。方法二:
尽量避免方法 1 中的两个 FK 应该引用相同的值......
我不喜欢这种方法的地方:
question_id
和survey_id
FK 来自有效的survey_question
对survey_id
和person_id
FK 来自有效的survey_person
对任何建议:
将不胜感激!
在 Postgres 列上创建唯一约束是否不需要对其进行索引?
我希望自动需要一个索引来有效地维护约束。
假设我有一个名为 的表User_FriendList
,它具有以下特征:
CREATE TABLE User_FriendList (
ID ...,
User_ID...,
FriendList_IDs...,
CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)
让我们假设该表包含以下数据:
+----+---------+---------------------------+ | 身份证| 用户 ID | 好友 列表_ID | +----+---------+---------------------------+ | 1 | 102 | 2:15:66:35:26:17: | +----+---------+---------------------------+ | 2 | 114 | 1:12:63:33:24:16:102 | +----+---------+---------------------------+ | 3 | 117 | 6:24:52:61:23:90:97:118 | +----+---------+---------------------------+
注:该“:”当(冒号)是分隔符爆炸在PHP成array
。
问题
所以:
这是一个方便的方式来“存储”的IDs
的FriendList
?
或者,相反,我是否应该让FriendId
每一行只有一个值,并且当我需要检索给定列表的所有行时,只需执行如下查询SELECT * FROM UserFriendList WHERE UserId = …
我试图了解逻辑运算的优先顺序并具有以下代码:
declare @T bit ='TRUE'
declare @F bit ='False'
print @T and @F
Run Code Online (Sandbox Code Playgroud)
它返回一个错误
关键字“and”附近的语法不正确。
我用“&”替换了“and”,代码再次运行。为什么以前的代码不起作用?我正在使用 SQL 服务器。
假设我正在为存在一对零或一 (1-0..1) 关系的场景设计数据库。例如:
因此,我创建了两个对应的表,users
和customers
,但是……
…在给定的 SQL 平台中表示和实现这种情况的最佳方法是什么?我考虑了两种可能的解决方案:
在里面 users
表中,添加customer
可能是 FOREIGN KEY 引用customers
或NULL
标记的列。
在customers
表中,包括一个user
UNIQUE
指向users
表格列(设置有约束)。
我已经在一些论坛上问过类似的问题,但答案基本上是“你需要什么”,“你觉得方便什么”。我不喜欢这种回答。我想要一个严肃的 DB 理论,一个有根据的答案。我在哪里可以读到 1-0..1 关系?
foreign-key ×3
sql-server ×3
postgresql ×2
terminology ×2
constraint ×1
erd ×1
etl ×1
except ×1
index ×1
olap ×1
subtypes ×1
t-sql ×1
transaction ×1