小编Yet*_*ser的帖子

保持参考完整性 - 好还是坏?

我们计划在数据库中引入简单的Audit Trail,使用触发器和每个需要审计的表的单独历史表.

例如,考虑表StudentScore,它具有很少的外键(例如,StudentID,CourseID)将其链接到相应的父表(学生和课程).

Table StudentScore (
    StudentScoreID, -- PK
    StudentID ref Student(StudentID),  -- FK to Student
    CourseID ref Course(CourseID),   -- FK to Course
)
Run Code Online (Sandbox Code Playgroud)

如果StudentScore需要审核,我们计划创建审核表StudentScoreHistory -

Table StudentScoreHistory (
    StudentScoreHistoryID, -- PK
    StudentScoreID,
    StudentID,
    CourseID,
    AuditActionCode,
    AuditDateTime,
    AuditActionUserID
)
Run Code Online (Sandbox Code Playgroud)

如果StudentScore中的任何行被修改,我们会将旧行移至StudentScoreHistory.

在设计讨论期间提出的一点是在StudentHistory表中将StudentID和CourseID设为FK,以保持参照完整性.支持这一点的论据是因为我们总是主要做一个软(逻辑布尔标志)删除而不是硬删除,它有利于维护引用完整性以确保我们在审计表中没有任何孤立ID.

Table StudentScoreHistory (
    StudentScoreHistoryID, -- PK
    StudentScoreID,
    StudentID ref Student(StudentID), -- FK to Student
    CourseID ref Course(CourseID), -- FK to Course
    AuditActionCode,
    AuditDateTime,
    AuditActionUserID
)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎有点奇怪.我同意@Jonathan Leffler的评论,即审计记录不应该停止删除父数据.相反,如果需要,则应通过主表中的外键处理,而不是在审计表中处理.我想得到你的意见,以确保我没有错过将外键扩展到审计表的一些价值.

现在我的问题是: 在历史表中使用这些外键是一个好的设计吗?

关键参数的任何细节(性能,最佳实践,设计灵活性等)将受到高度赞赏.

为了寻找特定目的和环境的人的利益:

目的:

  1. 维护关键数据历史记录
  2. 允许审核用户活动并支持重新创建方案
  3. 在有限的范围内允许回滚用户活动 …

sql database-design referential-integrity audit-trail

33
推荐指数
3
解决办法
7155
查看次数

生成随机唯一代码

我需要生成一个九位数字代码(最好是随机的),它对于给定的一天是唯一的(同一天不能再生成相同的数字).我正在考虑使用HHMMSSmmm(小时,分钟,秒和毫秒)来生成唯一代码但不是真正随机的.这个代码生成方法可以同时通过多种方法访问,因此我必须对该方法进行锁定.但这是否会确保数字是唯一的,因为数字生成可能需要不到一毫秒而两个线程可以获得相同的数字?

有没有更好的方法来生成随机唯一数字代码,这在特定的一天是唯一的?位数可以是6到9位数.

编辑:要生成的随机数的数量取决于事务的数量.最初数量可能较低,但在一段时间内它可能变得非常高(每秒多次交易).因此,我不想将该数字与使用的列表进行比较,因为这可能存在性能问题.

需要随机性,因为该号码将由用户在电话上输入.此号码是将在线交易与电话交易相关联的唯一方式,因此我不希望用户错误地输入不同的号码.

随机数生成需要在ASP.NET MVC应用程序中进行.

.net c# random algorithm

8
推荐指数
1
解决办法
6392
查看次数

SQL获取第15个日期的第一次出现

我需要编写一个函数或SP,它将返回第15次出现的第一次出现.例如,如果我将日期传递给5月8日,那么它应该返回5月15日.如果我通过5月30日,那么它应该在6月15日返回.

sql sql-server sql-server-2005 sql-server-2008

6
推荐指数
2
解决办法
2428
查看次数

在Matlab中迭代C#Iterator(IEnumerable)

我有一个C#方法返回非常多的对象.这将在Matlab中使用.

namespace MyNameSpace{
    public static class MyClass{
        public static IEnumerable<MyDataObject> GetVeryLargeResponse(){
            while(CheckForSomeFunkyConditionThatsRarelyTrue()){
               yield return GetMyNextDataObject();
            }
            yield break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Matlab中我打电话的时候

result = MyClass.GetVeryLargeResponse();
Run Code Online (Sandbox Code Playgroud)

我希望结果是类型的IEnumerable<MyDataObject>,以便能够Enumerator<MyDataObject>通过调用获得result.GetEnumerator().

我在哪里获得result哪种类型MyNameSpace.<GetVeryLargeResponse>d_3没有GetEnumerator()方法可用.我确实看到了一个result超级课程System.Collections.Generic.IEnumerable<MyClass>.

有没有办法可以在Matlab中迭代这个,甚至result可以IEnumerable<MyClass>在Matlab中"转换".

PS

  1. 由于数据量的原因,转换为Array/ IListetc是不可行的
  2. 这不是重复的如何在Matlab中迭代C#IEnumerable?因为那是IQueryable专门处理的.
  3. 我正在使用Matlab 2010b

.net c# matlab

5
推荐指数
2
解决办法
1678
查看次数