标签: data-integrity

如何防止列b包含与Oracle中任何列a相同的值?

什么是防止具有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)

理想情况下,该解决方案适用于并发插入和更新.

oracle data-integrity

5
推荐指数
1
解决办法
451
查看次数

如何组织实时数据完整性测试和代码单元测试?

我有几个带代码测试代码的文件(使用"unittest"类).

后来我发现测试数据库完整性也很好.我把它放到一个单独的目录树中.(像键的格式正确,父节点和子节点指向正确等等.编辑:这是一个nosql项目,我不能依赖数据库级别检查谎言参照完整性等.)

我使用相同的unittest类进行完整性测试.

现在我想知道保持这种分离是否真的有意义.为了测试数据的完整性,我经常复制用于测试处理数据的代码的代码部分.

但它不一样.代码测试使用测试数据库(在每次测试后删除),完整性测试连接到实时数据并进行分析.我想从cron调用的完整性测试,如果实时数据库中发生了某些事情,则发送警报.

你会怎么处理?这样的设置有标准吗?你有什么经历?

我倾向于将所有内容放在同一个文件中,这将导致代码测试也由生产环境中的cron执行.

编辑:推动我的是,尝试保持项目简单,不要让单个任务或工作流程触及太多文件.没有所有的测试,我已经有了一个类文件,一个子类,一个相关的类,一些库(帮助器)文件和主代码.测试添加一个文件.它有助于我在编码时保持注意力集中,压力更小,我相信我减少了错误,我可以更快地记住并找到一个受影响的文件较少的特定代码部分.每个工作流程只有一个测试文件可以帮到这里 如果我保持它是单独的,有2个文件(数据完整性测试和代码测试),也许3个(两者的公共库).抽象会增加复杂性.

Edit2:我现在正在重构一点,只是将数据测试文件移动到代码测试所在的同一目录树中,但保留名称为"完整性"或"测试"的不同文件.我不会(还)合并这些文件,因为2个人建议反对它,我相信他们现在的经验和建议.我现在将使用代码重复.

编辑3:我忘了提到每次运行的测试选择不是由这种情况下的树结构决定的.测试在主文件中枚举,因此我目前有2个主文件"完整性"和"代码测试",并且测试可以存在于相同的直接结构中.

也许会有更多人回答.到目前为止,感谢您提供宝贵的意见,这已经帮助我开发了最终的结构!

编辑4:我现在做了更多的重构.我似乎应该保留2个文件,但目的略有修改.一个针对生产服务器上的计划监视.另一个用于开发.但在这两个文件中都可以进行完整性测试或代码测试.在两个文件中,可以在测试数据库(在测试之后擦除)和永久数据库(每个都有永久数据库,生产服务器和开发服务器)上执行操作.还有一件重要的事情:我发现自己将大量常用代码从测试文件移到了类文件中.所以这些课程也获得了仅用于测试的能力.到目前为止我喜欢这个,感觉很干净.我还没有(还)创建一个在两个测试前端之间共享的测试库,这段代码已经转到了现在正在考虑的obejct的类文件中.

请注意,我在下面的评论是用"user89021"签名的,但是我是karlthorwald.我无能为力.

database automated-tests unit-testing data-integrity nosql

5
推荐指数
1
解决办法
952
查看次数

重复参数检查功能

我经常调用层次结构,因为所有方法都需要相同的参数.如果我不想把它们放在实例级别(类的成员)那么我总是问我是否有意义检查每种方法中它们的有效性.

例如:

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.

c# data-integrity

5
推荐指数
1
解决办法
179
查看次数

如何在不使用密钥名称的情况下确保Google App引擎中对象的数据完整性?

我在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)

python google-app-engine transactions data-integrity

5
推荐指数
1
解决办法
453
查看次数

我应该相信Redis的数据完整性吗?

在我目前的项目中,我将PostgreSQL作为我的主数据库,Redis作为一种奴隶,例如,当某个用户将另一个用户添加为朋友时,首先将关系存储在PostgreSQL中,然后更新Redis中的朋友列表.当请求某个用户的好友列表时,它将被拉出Redis而不是PostgreSQL.

问题是:当我更新Redis中的好友列表时,我应该从PostgreSQL中获取一份新的副本,并用新的列表替换Redis中的旧列表,还是应该保留旧列表,只需将用户ID SADD到列表中?后者当然最适合性能,但直观地说前者在保持数据完整性方面做得更好?如果使用像Celery这样的东西,第二种方法是否值得冒险?

performance data-integrity redis

5
推荐指数
1
解决办法
1308
查看次数

REAL列保持值在记录范围之外

根据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

5
推荐指数
1
解决办法
1330
查看次数

Mixpanel:Data Export API为Web仪表板提供不同的结果和范围

我在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中.为什么会这样?

如何确保相同日期范围内两个接口之间的结果一致?

api analytics data-integrity mixpanel

5
推荐指数
1
解决办法
2701
查看次数

Cassandra默认配置为丢失10秒的数据?

正如Commitlog数据被刷新到磁盘定期每10秒后(通过控制commitlog_sync_period_in_ms),因此,如果在10秒内所有副本崩溃,我将失去所有这些数据呢?从理论上讲,Cassandra Cluster是否会丢失数据?

data-integrity cassandra data-loss

5
推荐指数
1
解决办法
1934
查看次数

SQL Server:如何在COMMIT之前忽略引用完整性?

我有一个过程将行从一个数据库移动到另一个数据库.由于某些循环外键引用链,我无法从旧数据库中删除行,也无法将它们插入到新数据库中.

由于整个操作发生在事务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假设我不再做了

sql-server sql-server-2000 foreign-keys data-integrity

4
推荐指数
1
解决办法
4983
查看次数

VS 2010数据库项目删除列名称更改的数据

我正在测试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 visual-studio-2010 datadude

4
推荐指数
1
解决办法
4135
查看次数