必须实现日志记录,计划将消息存储在“日志”表中的DB中。在其他字段中,每条消息都有一个“状态”字段:0 - 成功,1 - 错误数据,2 - 错误用户,3 - 无论如何,4 - 等......
直截了当的想法是将“状态”字段存储在同一个表中的“int”列中...要在表中推送数据,将创建特殊枚举,例如这样(让我们使用C#.NET,但是任何语言都会起作用):
enum LogStatusEnum
{
Successful=0,
WrongData=1,
WrongUser=2,
}
void main()
{
LogStatusEnum status = LogStatusEnum.Successful;
int statusValue = (int)status;
string query = "INSERT INTO log (Status, ...) VALUES ("+statusValue+",...)";
}
还有另一种方法:创建附加表,例如“log_status”,其字段为“StatusId”(int,autoincrement),“StatusCode”(varchar),“StatusDescription”(varchar)将包含单独的记录每个状态字段(外键应用于两个表)。在这种情况下,在将数据添加到“log”表之前,应该使用查询提前获取所需“代码”的ID:
query = "SELECT Id FROM LogStatus WHERE StatusCode='"+GetStatusCode(status)+"'";
并且此(已接收)ID将用于填充“log”表。
在这两种情况下,您都需要同步数据库端和应用程序端。但从我的角度来看,第二种方法更好一点:
为了获得这些好处,您需要付费:通过状态代码向DB请求获取状态ID。
您认为实施第二种方法是否合理?或者第一个也适合?你是否看到第二种方法或第一种方法的其他优点?
欢迎任何想法。
提前谢谢。
答案 0 :(得分:2)
第二种方法通常更好。如果需要新的状态类型,则只需更新数据库而不是应用程序代码中的数据结构。
如果您正在进行大量插入操作,则不应每次都查询状态ID,而是将其缓存。
答案 1 :(得分:0)
假设数据库中的日志状态是相当静态的,我会设置应用程序在启动时将它们全部加载到本地缓存中,这样您就不必一直加载它们。 / p>
我尽可能地喜欢第二种方法。除非你在一个很难获得批准手动更改表格数据以增加更多状态等的地方工作。
答案 2 :(得分:0)
我在数据库中定义了状态代码,虽然int字段是可以的,但是Char(4)会更好,因为代码是人类可读的 - 而且 - 应该还指定说明;
使用数字而不在数据库中有描述的问题是,如果不确定代码是否同步,或者首先代码是什么,就无法报告。从长远来看,将所有这些结合在一起会让生活更轻松 - 牢记Common Reuse Principle。
使描述尽可能有用。从内存中,在MS SQL中,Char(4)使用与int相同的空间量 - 因此您不使用char来使用额外的空间。
我肯定不会将ForeignKey用于外部识别代码作为自动递增数字;如果这些值感到不安,那么代码就会失去完整性。
如果您要将状态代码硬编码到应用程序中,我建议为人们提供一种访问代码的方法,而无需查看源代码;文档可能会削减它但很容易失去同步 - 你想要的是某种可调用的界面(UI,webservice等),任何人(如管理员/ DBA)都可以轻松调用。 Attributes是一种很好的方法。
对于一般参考(或预构建的实现),我强烈建议查看MS Enterprise Libraries,这包括一个Logging块,并且还包括一个数据库存储库。