我们计划在数据库中引入简单的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的评论,即审计记录不应该停止删除父数据.相反,如果需要,则应通过主表中的外键处理,而不是在审计表中处理.我想得到你的意见,以确保我没有错过将外键扩展到审计表的一些价值.
现在我的问题是: 在历史表中使用这些外键是一个好的设计吗?
关键参数的任何细节(性能,最佳实践,设计灵活性等)将受到高度赞赏.
为了寻找特定目的和环境的人的利益:
目的:
我需要生成一个九位数字代码(最好是随机的),它对于给定的一天是唯一的(同一天不能再生成相同的数字).我正在考虑使用HHMMSSmmm(小时,分钟,秒和毫秒)来生成唯一代码但不是真正随机的.这个代码生成方法可以同时通过多种方法访问,因此我必须对该方法进行锁定.但这是否会确保数字是唯一的,因为数字生成可能需要不到一毫秒而两个线程可以获得相同的数字?
有没有更好的方法来生成随机唯一数字代码,这在特定的一天是唯一的?位数可以是6到9位数.
编辑:要生成的随机数的数量取决于事务的数量.最初数量可能较低,但在一段时间内它可能变得非常高(每秒多次交易).因此,我不想将该数字与使用的列表进行比较,因为这可能存在性能问题.
需要随机性,因为该号码将由用户在电话上输入.此号码是将在线交易与电话交易相关联的唯一方式,因此我不希望用户错误地输入不同的号码.
随机数生成需要在ASP.NET MVC应用程序中进行.
我需要编写一个函数或SP,它将返回第15次出现的第一次出现.例如,如果我将日期传递给5月8日,那么它应该返回5月15日.如果我通过5月30日,那么它应该在6月15日返回.
我有一个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
Array/ IListetc是不可行的IQueryable专门处理的.