什么是防止具有2列的表(a(唯一)和b)的任何记录,其中列b等于列a中的任何值?这将用于这样的更正表,
MR -> Mr
Prf. -> Prof.
MRs -> Mrs
Run Code Online (Sandbox Code Playgroud)
我可以看到如何使用触发器和子查询来完成它,假设没有并发活动,但更多的声明性方法更可取.
这是应该预防的一个例子,
Wing Commdr. -> Wing Cdr.
Wing Cdr. -> Wing Commander
Run Code Online (Sandbox Code Playgroud)
理想情况下,该解决方案适用于并发插入和更新.
我有几个带代码测试代码的文件(使用"unittest"类).
后来我发现测试数据库完整性也很好.我把它放到一个单独的目录树中.(像键的格式正确,父节点和子节点指向正确等等.编辑:这是一个nosql项目,我不能依赖数据库级别检查谎言参照完整性等.)
我使用相同的unittest类进行完整性测试.
现在我想知道保持这种分离是否真的有意义.为了测试数据的完整性,我经常复制用于测试处理数据的代码的代码部分.
但它不一样.代码测试使用测试数据库(在每次测试后删除),完整性测试连接到实时数据并进行分析.我想从cron调用的完整性测试,如果实时数据库中发生了某些事情,则发送警报.
你会怎么处理?这样的设置有标准吗?你有什么经历?
我倾向于将所有内容放在同一个文件中,这将导致代码测试也由生产环境中的cron执行.
编辑:推动我的是,尝试保持项目简单,不要让单个任务或工作流程触及太多文件.没有所有的测试,我已经有了一个类文件,一个子类,一个相关的类,一些库(帮助器)文件和主代码.测试添加一个文件.它有助于我在编码时保持注意力集中,压力更小,我相信我减少了错误,我可以更快地记住并找到一个受影响的文件较少的特定代码部分.每个工作流程只有一个测试文件可以帮到这里 如果我保持它是单独的,有2个文件(数据完整性测试和代码测试),也许3个(两者的公共库).抽象会增加复杂性.
Edit2:我现在正在重构一点,只是将数据测试文件移动到代码测试所在的同一目录树中,但保留名称为"完整性"或"测试"的不同文件.我不会(还)合并这些文件,因为2个人建议反对它,我相信他们现在的经验和建议.我现在将使用代码重复.
编辑3:我忘了提到每次运行的测试选择不是由这种情况下的树结构决定的.测试在主文件中枚举,因此我目前有2个主文件"完整性"和"代码测试",并且测试可以存在于相同的直接结构中.
也许会有更多人回答.到目前为止,感谢您提供宝贵的意见,这已经帮助我开发了最终的结构!
编辑4:我现在做了更多的重构.我似乎应该保留2个文件,但目的略有修改.一个针对生产服务器上的计划监视.另一个用于开发.但在这两个文件中都可以进行完整性测试或代码测试.在两个文件中,可以在测试数据库(在测试之后擦除)和永久数据库(每个都有永久数据库,生产服务器和开发服务器)上执行操作.还有一件重要的事情:我发现自己将大量常用代码从测试文件移到了类文件中.所以这些课程也获得了仅用于测试的能力.到目前为止我喜欢这个,感觉很干净.我还没有(还)创建一个在两个测试前端之间共享的测试库,这段代码已经转到了现在正在考虑的obejct的类文件中.
请注意,我在下面的评论是用"user89021"签名的,但是我是karlthorwald.我无能为力.
我经常调用层次结构,因为所有方法都需要相同的参数.如果我不想把它们放在实例级别(类的成员)那么我总是问我是否有意义检查每种方法中它们的有效性.
例如:
public void MethodA(object o){
if(null == o){
throw new ArgumentNullException("o");
}
// Do some thing unrelated to o
MethodB(o);
// Do some thing unrelated to o
}
public void MethodB(object o){
if(null == o){
throw new ArgumentNullException("o");
}
// Do something with o
}
Run Code Online (Sandbox Code Playgroud)
如果MethodA使用参数,那么它清楚,我必须检查那里的有效性以及MethdoB.但只要方法A没有做任何事情而o不是给予它MethodB,那么检查有效性也是好的做法MethodA.
同样检查的优势MethodA可能是被调用者调用的方法中的异常抛出,这很好,但是有必要吗?调用堆栈也会说明这一点.也许它有意义的公共,内部,受保护但不是私人方法?
我以null检查为例,但索引验证或范围验证也属于自我问题,但我认为由于冗余代码的危险性存在限制.你怎么看?
UPDATE
通过AakashM的回答,我看到我的确很精确.MethodA不仅是电话MethodB,还有其他事情但与之无关o.我添加了一个例子来澄清这一点.谢谢AakashM.
我在Google App Engine中遇到一些麻烦,确保在使用没有键名的祖先关系时我的数据是正确的.
让我再解释一下:我有一个父实体类,我想创建一个子实体项.我想创建一个带有类别名称和项目名称的函数,如果它们不存在则创建它们.最初我创建了一个事务,如果需要使用密钥名称在事务中创建,这很好.但是,我意识到我不想使用名称作为密钥,因为它可能需要更改,我在我的事务中尝试执行此操作:
def add_item_txn(category_name, item_name):
category_query = db.GqlQuery("SELECT * FROM Category WHERE name=:category_name", category_name=category_name)
category = category_query.get()
if not category:
category = Category(name=category_name, count=0)
item_query = db.GqlQuery("SELECT * FROM Item WHERE name=:name AND ANCESTOR IS :category", name=item_name, category=category)
item_results = item_query.fetch(1)
if len(item_results) == 0:
item = Item(parent=category, name=name)
db.run_in_transaction(add_item_txn, "foo", "bar")
Run Code Online (Sandbox Code Playgroud)
我试图运行它时发现的是App Engine拒绝这个,因为它不会让你在事务中运行查询:Only ancestor queries are allowed inside transactions.
查看Google提供的示例,了解如何解决此问题:
def decrement(key, amount=1):
counter = db.get(key)
counter.count -= amount …Run Code Online (Sandbox Code Playgroud) 在我目前的项目中,我将PostgreSQL作为我的主数据库,Redis作为一种奴隶,例如,当某个用户将另一个用户添加为朋友时,首先将关系存储在PostgreSQL中,然后更新Redis中的朋友列表.当请求某个用户的好友列表时,它将被拉出Redis而不是PostgreSQL.
问题是:当我更新Redis中的好友列表时,我应该从PostgreSQL中获取一份新的副本,并用新的列表替换Redis中的旧列表,还是应该保留旧列表,只需将用户ID SADD到列表中?后者当然最适合性能,但直观地说前者在保持数据完整性方面做得更好?如果使用像Celery这样的东西,第二种方法是否值得冒险?
根据MSDN,REAL值的范围是 - 3.40E + 38到-1.18E - 38,0和1.18E - 38到3.40E + 38.但是,我的表中有很多超出该范围的值.
以下查询返回许多非常小的值,而不是很大的值:
SELECT MyColumn ,
*
FROM data.MyTable
WHERE MyColumn <> 0
AND ( MyColumn < CONVERT(REAL, 1.18E-38)
OR MyColumn > CONVERT(REAL, 3.40E+38)
)
AND ( MyColumn < CONVERT(REAL, -3.40E+38)
OR MyColumn > CONVERT(REAL, -1.18E-38)
)
Run Code Online (Sandbox Code Playgroud)
很容易显示这些值如何在表中结束.我不能直接插入它们:
CREATE TABLE a(r REAL NULL);
GO
INSERT INTO a(r) VALUES(4.330473E-39);
GO
SELECT r FROM a
GO
DROP TABLE a;
----
0.0
Run Code Online (Sandbox Code Playgroud)
但是我可以划分两列并且超出范围值:
CREATE TABLE a
(
r1 REAL NULL ,
r2 …Run Code Online (Sandbox Code Playgroud) sql-server data-integrity sql-server-2008 sql-server-2008-r2
我在Mixpanel的仪表板和Data Export API中获得了不同的数字.
在分段选项卡上的仪表板中,我选择了一个事件("登录"),开始和结束日期(9月17日和24日)以及周单位.它显示了一个图表,以及一个包含四个值的表,本周,9月17日,9月10日和9月3日.
我使用Python库调用Mixpanel API:
api = Mixpanel(
api_key = '----',
api_secret = '----'
)
data = api.request(['segmentation'], {
'event': 'login',
'unit': 'week',
'from_date': '2012-09-17',
'to_date': '2012-09-24'
})
print json.dumps(data)
Run Code Online (Sandbox Code Playgroud)
这是它返回的数据:
{
"legend_size": 1,
"data": {
"series": [
"2012-09-17",
"2012-09-24"
],
"values": {
"login": {
"2012-09-17": XXXXX,
"2012-09-24": YYYYY
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
值XXXXX与Web仪表板中显示的值不同,为什么会这样?
API返回9月24日的值,该值不在仪表板视图中.仪表板显示9月3日和10日的值,这些值不在API中.为什么会这样?
如何确保相同日期范围内两个接口之间的结果一致?
正如Commitlog数据被刷新到磁盘定期每10秒后(通过控制commitlog_sync_period_in_ms),因此,如果在10秒内所有副本崩溃,我将失去所有这些数据呢?从理论上讲,Cassandra Cluster是否会丢失数据?
我有一个过程将行从一个数据库移动到另一个数据库.由于某些循环外键引用链,我无法从旧数据库中删除行,也无法将它们插入到新数据库中.
由于整个操作发生在事务1中,我希望SQL Server在我调用之前忽略引用完整性故障COMMIT TRANSACTION.
例如2:
Table: Turboencabulators Table: Marselvanes
========================= =======================
PK TurboencabulatorID int /-> PK MarselvaneID int
^ MarselvanesID int --/ HasGrammeter bit
| PantametricFan varchar(50)
+------------------------------- TurboencabulatorID int
Run Code Online (Sandbox Code Playgroud)
如果我尝试在新表中插入turboencabulator,它将失败,而marselvane已经存在.撤销订单也有同样的问题.
尝试删除旧行时,我无法删除其中一行,直到另一行被删除.
我已经尝试过做一个n阶段系统,其中所有行都插入了外键约束设置为null的任何列.然后我更新所有插入的行,放置正确的缺失值.然后,为了删除源行,我将关闭受FK影响的所有列,然后删除实际行.3
我真正喜欢的是只做我的T-SQL操作,并让SQL Server在我尝试调用commit之前不告诉我.
1分布式
2假设
3假设我不再做了
我正在测试Visual Studio 2010的新数据库项目功能,并希望更改表中列的名称.我在创建脚本中更改了名称并将其部署在数据库中.生成的脚本刚刚删除了列并添加了一个具有正确名称的新列,但所有数据都已丢失.
是否有不会丢弃列数据的设置?
我正在寻找这个问题的"DataDude"解决方案.(如果有的话)
PRINT N'Altering [dbo].[Users]...';
GO
ALTER TABLE [dbo].[Users] DROP COLUMN [TestX];
GO
ALTER TABLE [dbo].[Users]
ADD [Testn] NVARCHAR (50) NULL;
GO
Run Code Online (Sandbox Code Playgroud)
谢谢,基思
data-integrity ×10
sql-server ×2
analytics ×1
api ×1
c# ×1
cassandra ×1
data-loss ×1
database ×1
datadude ×1
foreign-keys ×1
mixpanel ×1
nosql ×1
oracle ×1
performance ×1
python ×1
redis ×1
transactions ×1
unit-testing ×1