这是我目前的情况:
我们有一个表格存储从网站表单提交的数据,比如“MyTable”。该表使用 bigint(自动增量)作为主键。到目前为止一切都很好。
现在,该表需要能够存储从移动设备上传的记录。但从手机上传的记录要先经过验证,然后才能存储到“MyTable”中。因此,创建了一个临时表,比如“Temp_MyTable”。
换句话说,这是流程:
移动设备 ------> 临时表 ------> 实际表
[GUID as PK] [bigint as PK], [GUID as FK]
Run Code Online (Sandbox Code Playgroud)
问题是,临时表使用 GUID 作为主键。原因,我们必须引用从多个设备上传的记录。用户修改后可重新上传记录。注意:这里的 GUID 是由移动端生成的(简单的 javascript)。
所以,现在,我想将 Actual Table 的记录引用回 Staging Table。在这种情况下,“可能”需要外键。不幸的是,它是 GUID 数据类型。
而且看了多篇文章,似乎使用GUID作为外键可能是不利的——存储更多或更慢。
我想知道,使用 GUID 作为外键可以吗?有人可以证明它实际上“非常好”吗?或者有更好的设计吗?
我使用的是 Sql Server 2014 标准版。我的目标是跟踪对表的操作历史(插入、更新、删除),并显示在网络上,以便用户能够知道过去数据发生了什么。
因此,我开始知道 Sql Server 标准版中部分支持审计功能,并且能够记录一些操作,如附件所示。
我的问题是,如何将这些日志存储在适当的 Sql 表中,以便可以在网页上访问、检索和显示这些记录?
目前,允许的审计目标:文件、安全日志、应用程序日志......似乎无法直接从 ASP.NET API 检索。
是否可以登录到 SQL 表?
PS:
(如果我错了,请纠正我)。许多人说标准版只允许服务器级审计,但不允许数据库级审计。但是,由于一些未知的原因,如果我添加了这 7 种审计类型(是的,7 种或无),我就能够捕获和查看数据库级别的操作。
我们有大量用于设置表格的表格。在每个表格中,都需要填写Code
和Description
。
代码由varchar(10)
数据类型组成。
现在,问题是,每次用户创建新数据或更新数据时,都需要检查是否Code
与其他人发生冲突。
在 LINQ 中,这种代码检查是不可避免的:
string ExistingCode = "ITEM01";
int ExistingKey = 1;
var recordWithConflictedCode = (from a in db.MyTable
where a.Code == ExistingCode &&
a.Key != ExistingKey).ToList();
if(recordWithConflictedCode.Count >= 1)
return BadRequest("Duplicated Code found");
Run Code Online (Sandbox Code Playgroud)
现在,由于这涉及对每个进程的字符串比较,我认为对列Code
进行索引以使查询更快是有意义的。
这对你们来说是一种常见的做法吗?